《Linux内核设计与实现》第17章学习笔记
第17章、设备与模块
17.1设备类型
1.块设备(blkdev):
寻址以块为单位,通常支持重定位操作。通过称为“块设备节点”的特殊文件来访问。
2.字符设备(cdev):
不可寻址,仅提供数据的流式访问。通过称为“字符设备节点”的特殊文件来访问。
3.网络设备(ethernet devices):
提供了对网络的访问。它不是通过设备节点来访问,而是通过套接字API这样的特殊接口来访问。
17.2 模块
17.2.1 Hello,World
(1)hello_init()函数是模块的入口点。
模块的所有初始化函数必须符合下面的形式:
Int my_init(void);
它可被标记为static类型。
(2)hello_exit()函数是模块的出口函数。
Exit函数负责对init函数以及在模块生命周期过程中所做的一切事情进行撤销工作,基本上就是清理工作。
模块的所有初始化函数必须符合下面的形式:
void my_exit(void);
它也可被标记为static类型。
17.2.2构建模块
构建模块的第一步是决定在哪里管理模块源码。
(1)放在内核源代码树中
(2)放在内核代码外
17.2.3安装模块
Make modules_install 构建命令用来安装编译的模块到合适的目录下,通常需要以root权限运行。
17.2.4产生模块依赖性
Linux模块之间存在依赖性。
17.2.5载入模块
载入模块最简单的方式是通过insmod命令,它做的就是请求内核载入模块。
Insmod module.ko(这里module.ko是要载入的模块名称)
卸载模块可以使用rmmod命令。
Rmmod module
17.2.6管理配置选项
配置选项的第一行定义了该选项所代表的配置目标;
第二行声明编译选项类型;
第三行指定了该选项的默认选项。
17.2.7模块参数
(1)定义一个模块参数可以通过宏module_param()完成:
Module_param(name,type,perm);
(2)必须在使用该宏前定义变量
(3)通常,需要用一个charp类型来定义模块参数(一个字符串)
17.2.8导出符号表
在内核中,导出内核函数需要使用特殊的指令:EXPORT_SYMBOL()和EXPORT_SYMBOL_GPL().
导出的内核函数可以被模块调用,而未导出的函数模块则无法被调用。
导出符号,只需要在声明函数后,紧跟上EXPORT_SYMBOL()指令。
17.3 设备模型
《Linux内核设计与实现》第17章学习笔记的更多相关文章
- 《Think Python》第17章学习笔记
目录 <Think Python>第17章学习笔记 17.1 面向对象的特性(Object-oriented features) 17.2 打印对象(Printing objects) 1 ...
- 《Linux内核设计》第17章学习笔记
- scala编程第17章学习笔记(4)——元组
元组可以把固定数量的条目组合在一起以便于作为整体传送.不像数组或列表,元组可以保存不同类型的对象. 元组常用来返回方法的多个值.例如,下面的方法找到集合中的最长单词并返回它的索引: scala> ...
- scala编程第17章学习笔记(3)
可变(mutable)集合与不可变(immutable)集合 为了更易于完成不可变集合到可变集合的转换,或者反向转换,Scala提供了一些语法糖.纵使不可变集和映射并不支持真正的+=方法,Scala还 ...
- scala编程第17章学习笔记(2)——集和映射
默认情况下在使用“Set”或“Map”的时候,获得的都是不可变对象.如果需要的是可变版本,需要先写明引用. 如果同一个源文件中既要用到可变版本,也要用到不可变版本的集合或映射,方法之一是引用包含了可变 ...
- scala编程第17章学习笔记(1)——集合类型
列表 列表的初始化及对其首尾的访问: scala> val colors = List("red", "blue", "green") ...
- 《Think Python》第16章学习笔记
目录 <Think Python>第16章学习笔记 16.1 Time 16.2 纯函数(Pure functions) 16.3 修改器(Modifiers) 16.4 原型 vs. 方 ...
- 《Think Python》第15章学习笔记
目录 <Think Python>第15章学习笔记 15.1 程序员定义的类型(Programmer-defined types) 15.2 属性(Attributes) 15.3 矩形( ...
- 学习笔记(三)--->《Java 8编程官方参考教程(第9版).pdf》:第十章到十二章学习笔记
回到顶部 注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法 ...
随机推荐
- web自动化--如何在不同页面间游刃有余
大家都知道,selenium中对页面元素的操作都是基于当前页面进行操作的,有时会有这种情况,在这个页面操作完一个步骤后,要去另一个页面查看,这就涉及到页面间的操作 # -*- coding:utf-8 ...
- Appium1.9 之 Chromedriver安装方式
1.在 appium 官网上下载安装后,下载的是1.7.1的版本,安装之后是1.9.1最新版本. 2.appium安装之后,会发现涉及到 浏览器相关的业务时(我使用的是chrome)会提示 “No C ...
- <20180930>故障解决记录Cisco RV系列低端路由
故障描述: 今日网络瘫痪 , 浏览器提示报 DNS出错, 故障现象: 网关能正常分配到IP但内网机器却无法上网. 其中一个WiFi设备竟然还可以通讯(聊天工具)! 故障思路和排查: 1.1 怀疑是上次 ...
- numpy的random模块
随机抽样 (numpy.random) 简单的随机数据 rand(d0, d1, ..., dn) 随机值 >>> np.random.rand(3,2) array([[ 0.14 ...
- 敌兵布阵 HDU - 1166 (树状数组模板题,线段树模板题)
思路:就是树状数组的模板题,利用的就是单点更新和区间求和是树状数组的强项时间复杂度为m*log(n) 没想到自己以前把这道题当线段树的单点更新刷了. 树状数组: #include<iostrea ...
- NPM(包管理器)作用是什么?
NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: a.允许用户从NPM服务器下载别人编写的第三方包到本地使用 b.允许用户从NPM服务器 ...
- QT 14 线程使用
1 线程基础 QThread 是对本地平台线程的一个非常好的跨平台抽象.启动一个线程非常简单.让我们看一段代码,它产生另一个线程,该线程打印hello,然后退出. // hellothread/hel ...
- Apache Ant安装 验证
1.下载Apache Ant 去官网下载ant,官网地址:http://ant.apache.org/ 我下载的是apache-ant-1.10.1-bin.zip 直接解压,放到制定目录下,如C:\ ...
- python 获取当前路径
使用os模块: os.path.realpath(__file__)
- [HNOI2018]排列[堆]
题意 给定一棵树,每个点有点权,第 \(i\) 个点被删除的代价为 \(w_{p[i]}\times i\) ,问最小代价是多少. 分析 与国王游戏一题类似. 容易发现权值最小的点在其父亲选择后就会立 ...