20135337——Linux内核分析:第十七章 模块与设备
第17章 模块与设备
设备类型:在所有 Unix 系统中为了统一普通设备的操作所采用的分类。
模块: Linux 内核中用于按需加载和卸载目标码的机制。
内核对象:内核数据结构中支持面向对象的简单操作,还支持维护对象之间的父子关系。
sysfs :表示系统中设备树的一个文件系统。
1. 设备类型
三种类型
块设备
字符设备
网络设备
2. 模块
1. Hello,World
- 模块的所有初始化函数必须符合形式:int my _ init (void);
- 退出函数必须符合形式:void my_exit (void);
2.构建

3. 安装
- 安装编译的模块: make modules_install
4. 产生依赖性
- 生这依赖关系信息,而且在每次启动时更新。
- 若想产生内核依赖关系的信息, root 用户可运行命令:depmod
- 只为新模块生成依赖信息,而不生成所有的依赖关系,这时root 用户可运行命令:depmod -A
5. 载入
- root 身份运行命令:insmod module .ko
- 在内核 via modprobe 中插入模块,需要以 root 身份运行 zmodprobe module [ module parameters ] (参数 module 指定了需要载入的模块各称)。
- 从内核中卸载模块,以 root 身份运行:modprobe -r modules
6. 管理配置选项
- 设置CONFIG_FISHING_POLE 配置选项。
- 如果建立了一个新子目录,希望kconfig 文件(可能是drivers/char/Kconfig)存在子该目录中,在己存在的 kconfig 文件中将它引入:source "drivers/char/fishing/Kcor,lfig”
7. 参数
- 定义一个模块参数可通过宏完成:module_param(name, type, perm)。
参数的类型可以是byte 、short 、ushort、int、uint、long 、ulong、charp、bool 或invbool。
8. 导出符号表
- 导出内核函数需要使用特殊的指令: EXPORT_ SYMBOL()和EXPORT_SYMBOL_GPL()。
- 导出的内核符号表:导出的内核接口,称为内核API。
- 在声明函数后,紧跟上EXPORT_SYMBOL()。
3. 设备模型
- 实现设备模型的最初动机:可以沿设备树的叶子向其根的方向依次遍历,以保证能以正确顺序关闭各设备的电源。
1. kobject
- 设备模型的核心部分。
- struct kobject 结构体表示,定义于头文件<linux/k,ρ1lij四t.b>中。
- 通常是嵌入其他结构中的。
2. ktype
- kobject 对象被关联到一种特殊的类型:ktype。
- 由kobj_type 结构体表示,定义于头文件<linux/kobject.h>中。
- 为了描述一族kobject 所具有的普遍特性。
3. kset
- 可把kobject 集中到一个集合中,而ktype 描述相关类型ko均ect 所共有的特性,它们之间的重要区别在于2 具有相同ktype 的kobject 可以被分组到不同的kset。
- 在Linux 内核中,只有少数一些的ktype,却有多个kset。
- 由kset 结构体表示,定义于头文件<linux/kobject.h>中:
4. kobject、ktype、kset关系
- kobject,让那些包含它的结构具有了kobject 的特性。
- ktype 定义了一些kobject 相关的默认特性。
- kset 提供了两个功能:第一,其中嵌入的kobj创作为kobject 组的基类。第二, kset 将相关的kobject 集合在一起。
5. 管理和操作kobject
- kobject 通过函数koject_init 进行初始化,该函数定义在文件<linux/kobject.h>中:void kobject_init(struct kobject *kobj, struct kobj_type *ktype);
第一个参数就是需要初始化的kobject 对象;
调用初始化函数前, kobject 必须清空;
未被清空,调用memset() 即可:memset(kobj, 0, sizeof (*kobj ) );
- 应该调用kobject_createO 创建koject。
6.计数
- kobject的主要功能:提供了一个统一的引用计数系统。
- 初始化后, kobject 的引用计数设置为1;引用计数不为零,该对象就会继续保留在内存中。
- 引用计数跌到零时,对象可被撤销,相关内存也被释放。
- koject 的引用计数是通过kref结构体实现,该结构体定义在头文件<linux/kref.h>中。
4. sysfs
- 一个处于内存中的虚拟文件系统,它为我们提供了kobject 对象层次结构的视图。
- 通过kobject 对象中的dentry 字段实现把kobject 对象与目录项紧密联系起来。
1. 添加或删除kobject
- 把koject 导入sysfs,你需要用到函数kobject_add():int kobject_add (struct kobj ect *kobj , struct kobj ect *parent, const char *fmt , . .. ) ;
-从sysfs 删除一个kobject 对应文件目录,需使用函数kobject_del() :void kobject _del(struct kobject *kobj );
2. 添加文件
l. 默认属性
- 所有具有相同类型的kobject 在它们对应的sysfs 目录下都拥有相同的默认文件集合。
2. 创建新属性
- 在sysfs 中创建一个符号连接:int sysfs_create_link(struct kobject *kobj, struct kobject target, char *name);
3. 删除新属性
- 删除一个属性需通过函数sysfs_remove_ file() 完成:void sysfs_remove_file (struct kobject *kobj, const struct attribute *attr);
- 由sysfs_ creat_ link()创建的符号连接可通过删除:void sysfs_remove_link(struct kobject *kobj , char *name);
4. sysfs 约定
- 该保证每个文件只导出一个值。
- 以一个清晰的层次组织数据。
- 提供内核到用户空闹的服务。
3. 内核事件层
- 实现了内核到用户的消息通知系统。
- 内核事件由内核空间传递到用户空间需要经过netlink。
- 用户空间实现一个系统后台服务用于监听套接字,处理任何读到的信息,并将事件传送到系统栈里。
20135337——Linux内核分析:第十七章 模块与设备的更多相关文章
- Linux内核分析第四章 读书笔记
Linux内核分析第四章 读书笔记 第一部分--进程调度 进程调度:操作系统规定下的进程选取模式 面临问题:多任务选择问题 多任务操作系统就是能同时并发地交互执行多个进程的操作系统,在单处理器机器上这 ...
- linux内核分析第3章&第18章读书笔记
linux内核分析第3章&第18章读书笔记 第三章 进程管理 进程:处于执行期的程序(目标码存放在某种存储介质上) 包含资源:可执行程序代码,打开的文件,挂起的信号,内核内部数据,处理器状态, ...
- Linux内核设计第十七章笔记
第十七章 设备与模块 关于设备驱动和设备管理,四种内核成分 设备类型:在所有unix系统中为了统一普通设备的操作所采用的分类 模块:Linux内核中用于按需加载和卸载目标代码的机制 内核对象:内核数据 ...
- Linux内核分析——第五章 系统调用
第五章 系统调用 5.1 与内核通信 1.系统调用在用户空间进程和硬件设备之间添加了一个中间层,该层主要作用有三个: (1)为用户空间提供了一种硬件的抽象接口 (2)系统调用保证了系统的稳定和安全 ( ...
- Linux内核分析第一二章读书笔记
linux读书笔记(1,2章) 标签(空格分隔): 20135328陈都 第一章 Linux内核简介 Unix的历史 Unix 虽然已经使用了40年,但计算机科学家仍然认为它是现存操作系统中最强大和最 ...
- Linux内核分析——第三章 进程管理
第三章 进程管理 3.1 进程 1.进程就是处于执行期的程序:进程就是正在执行的程序代码的实时结果:进程是处于执行期的程序以及相关的资源的总称:进程包括代码段和其他资源. 线程:是在进程中活动的对象. ...
- linux内核分析 第4章读书笔记
第四章 进程调度 一.抢占与非抢占 1.非抢占式进程调度 进程会一直执行直到自己主动停止运行 2.抢占式进程调度 Linux/Unix使用的是抢占式的方式,强制的挂起进程的动作就叫做抢占. 二.进程优 ...
- Linux内核分析第四章读书笔记
第四章 进程调度 进程调度程序:确保进程能有效工作的一个内核子程序 决定将哪个进程投入运行,何时运行已经运行多长时间 进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统 原则:只 ...
- Linux内核分析——第四章 进程调度
第四章 进程调度 4.1 多任务 1.多任务操作系统就是能同时并发的交互执行多个进程的操作系统. 2.多任务操作系统使多个进程处于堵塞或者睡眠状态,实际不被投入执行,这些任务尽管位于内存,但是并不处于 ...
随机推荐
- 【HTTP缓存】浏览器缓存理论知识
时间:2016-12-12 17:51:30 作者: zhongxia 零.前言 这里主要写的是理论,具体实践的比较少,后期写一个实践教程,内容基本都是从参考文章里面抄过来的[看完文章,顺便写做下笔记 ...
- BeanFactory中Bean的生命周期
Bean的生命周期图解 集体过程如下: 当调用者通过getBean(beanName)向容器请求某一个Bean时,如果容器注册了org.springframework.beans.factory.co ...
- 使用CefSharp跳转页面不弹出页面:
using CefSharp; using CefSharp.Wpf; namespace Common.Control { internal class CefSharpOpenPageSelf : ...
- java注释讲解
注释简单的来说就是一种说明,不能被当成执行语句执行.做为一名程序员,但我们在写代码时是顺着思路写下去的.写代码好比就是在做题.当你在做的时候你脑海时的思路很清晰,会想到用一些特殊的方法来解决当前的问题 ...
- cglib之Enhancer
1. 背景 cglib库的Enhancer在Spring AOP中作为一种生成代理的方式被广泛使用.本文针对Enhancer的用法以实际代码为例作一些介绍. 2. Enhancer是啥 Enhance ...
- call()和apply()
call()和apply()方法类似,区别是,call()方法接受的是若干个参数的列表,而apply()方法接受的是一个包含多个参数的数组. 当一个函数在其主体中使用 this 关键字时,可以通过使用 ...
- javascript获取指定区间范围随机数的方法
每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code //获取指定区间范围随机数,包括lowerValue和upperValue funct ...
- Tribonacci UVA - 12470 (简单的斐波拉契数列)(矩阵快速幂)
题意:a1=0;a2=1;a3=2; a(n)=a(n-1)+a(n-2)+a(n-3); 求a(n) 思路:矩阵快速幂 #include<cstdio> #include<cst ...
- SQL Server中将查询结果转换为Json格式脚本
这篇文章主要介绍了SQL Server中将查询结果转换为Json格式脚本分享,本文直接给出实现代码,需要的朋友可以参考下 原文地址:http://www.jb51.net/article/61462. ...
- day02---编程语言、python解释器以及变量
计算机编程语言分类: 机器语言 直接用计算机能理解的二进制指令编写程序,来直接控制硬件.(用机器语言编写的程序称为目标程序) 优点:执行效率高,属于计算机最底层语言 缺点:开发效率低.跨平台性差 汇编 ...