一、设备类型
1、块设备 blkdev:以块为单位寻址,支持重定位(数据随机访问),通过块设备节点来访问。
2、字符设备cdev:不可寻址,提供数据流访问,通过字符设备节点访问。
3、网络设备:对网络的访问,通过物理适配器和协议进行访问。
4)杂项设备miscdev:表示简单设备;伪设备
二、模块
可装载内核模块:单独的二进制镜像,允许内核在运行时i动态插入或删除代码。
ps 静态编译到内核镜像的区别
1、出入口点
入口点:init,出口点,一般用于注册资源、初始化硬件、分配数据结构等:exit:从内核中卸载。
如果编译到内核中,init存放在内核映像中,并且退出函数不会被包含和调用
2、构建模块(kbuild构建系统)
管理模块源码:
1)加入内核代码树(补丁或者代码):
设备驱动程序:内核源码树根目录/dirver:字符/char 块/block usb /usb
在树和自身makefile中加入位置和指令。
2)内核源代码树之外:
在自身源代码目录中建立makefile;通过make命令找到源代码和makefile
3、安装模块
以后的模块在/lib/modules/version/kernel对应位置中,make modules_install安装
4、模块依赖
depmod产生依赖信息生成在/lib/modules/version/modules.dep
5、载入模块
简单载入 insmod 名称.ko ·
modprobe:提供模块依赖性分析、智能差错、错误报告等 modprobe module 参数,会自动加载依赖模块
6、配置
kbuild系统配置:在kconfig文件中添加选项对应内核源码树。
可以配置 编译到内核还是模块形式,依赖关系,标志项等。
7、模块参数:驱动程序声明,用户在系统启动或者模块装载时指定参数值,通过宏module_param(name,type,perm)
8、导出符号表
只有被导出后的内核函数,才可以被模块调用,代码被配置为模块的时候必须确保接口全部被导出。
导出的内核符号表被看做导出的内核接口,内核API。
导出指令:EXPORT_SYMBOL()
三、设备模型
1、统一设备模型:系统中该设备拓扑关系的树结构。
1 )kobject
嵌入其它结构,使其成为对象层次架构中的一部分。
包含引用计数、父子关系、对象名称
2 )ktype
kobject对象被关联到类型,定义于
kobject相关的默认特性:西沟行为、sysfs行为等
3) kset
kobject对象的集合体,定义于
嵌入的kobject作为kobject组的基类,在sysfs中,相关的object以独立目录的形式出现在文件系统中。
2、sysfs
处于内存中的文件系统,提供了kobject对象层次结构的视图,以文件的方式观察系统中设备的拓扑结构。
设备结构树导出为要给文件系统,sysfs挂载在sys目录下,把kobject对象映射为目录项。
1)包含目录:
block每个子目录对应系统中已经注册的设备;
bus:系统总线视图;
class:以高层功能罗技组织的系统设备视图;
dev:已注册设备节点的视图;
devices:系统设备拓扑结构视图,映射内核设备结构体的组织层次,
firmware:底层子系统的特殊树;
fs:已注册文件系统视图;
kernel:内核配置项和状态信息;
module:系统已加载模块信息;
power:系统范围的电源管理数据。
2)kobject操作
kobject导入sysfs:kobject_add,根据kobject对象层次结构中的位置设置目录位置;
目录中的文件:属性,默认为ktype提供。
3)内核事件层
供内核到用户的消息通知系统:从kobject对象出发,每个事件源是一个sysfs路径——>将事件模拟为信——>通过多点传送套接字netlink将事件从内核空间传递到用户控件。