《Linux课本》读书笔记 第十七章 模块
设备与模块:
设备类型:块设备(blkdev)、字符设备(cdev)、网络设备;
模块:
分析hello,world模块代码。Hello_init是模块的入口点,通过module_init()注册到系统中,在内核装载时被调用,是一个宏调用,唯一的参数是模块的初始化函数。模块初始化函数格式:int my_init(void);,可标记为static类型。初始化成功,返回值为0,不成功返回一个非零值。Init函数还会注册资源、初始化硬件、分配数据结构等。
hello_exit()函数是模块的出口函数,它由module_exit()例程注册到系统,在模块从内存卸载时,内核会调用hello_exit()。退出函数必须符合以下形式:void my_exit(void);MODULE_LICENSE()和MODULE_AUTHOR()都是模块的简要描述。
构建模块:
1、放在内核源代码树中(这个不详细介绍)
2、放在内核代码外:
在自己的源代码树目录中建立一个Makefile文件,只需要一行指令:obj-m := xx.o(如果有多个源文件,则用obj-m := xx.o xx-objs := xx-main.o xx-line.o),编译生成xx.ko。同时,还要告诉make如何找到内核源码文件和基础Makefile文件:make –C /kernel/source/location SUBDIRS=$PWD modules
安装模块:make
载入模块:insmod xx.ko
卸载模块:rmmod xx.ko
模块参数:module_param(name,type,perm);
导出符号表:EXPORT_SYMBOL()和EXPORT_SYMBOL_GPL().导出的内核符号表被看做导出的内核接口,甚至称为内核API。
设备模型:
Kobject(kernel object)由struct kobject结构体。Kobject是可以创建对象的层次结构。Ktype是kobject对象被关联到一种特殊的类型。Ktype的存在是为了描述一族kobject所具有的普遍特性。Kset是kobject对象的集合体。Kobject、kytpe、kset三者的关系:kobject与一个特别的ktype对象关联,kobject归入称为kset的集合。
管理和操作kobject:
Kobject通过函数kobject_init进行初始化, 接下来调用kobject_create()创建kobject。
引用计数:
Kobject的主要功能就是提供一个统一的引用计数系统。
Sysfs:
Sysfs文件系统是一个处于内存中的虚拟文件系统,为我们提供kobject对象的层次结构的视图。