Linux内核架构学习笔记Linux内核架构学习笔记Linux内核架构学习笔记Linux内核架构学习笔记Linux内核架构学习笔记Linux内核架构学习笔记Linux内核架构学习笔记Linux内核架构学习笔记
《Linux驱动程序开发实例(第2版)》
编写可加载模块
1.1.4 带参数的可加载模块
宏 MODULE_PARM(var,type,right) 用于向模块传递命令行参数。参数类型可以是整
数、长整型、字符串等类型。
本实例演示了如何向模块传递整数、长整型、字符串等参数
static int itype=0;
module_param(itype, int, 0);
static int btype = 0;
module_param(btype, bool, 0);
static unsigned char ctype=0;
module_param(ctype, byte, 0);
static char *stype=0;
module_param(stype, charp, 0);
//模块初始化
static int __init demo_module_init(void)
{
printk("simple module init\n");
printk("itype=%d\n",itype);
printk("btype=%d\n",btype);
printk("ctype=%d\n",ctype);
printk("stype='%s'\n",stype);
return 0;
}
//模块卸载
static void __exit demo_module_exit(void)
{
printk("simple module exit\n");
}
module_init(demo_module_init);
module_exit(demo_module_exit);
1.1.5 模块依赖
Linux 内核模块之间可以相互引用一些符号,这些符号包括函数与变量。
符号必须导出才能被引用。内核使用宏定义 EXPORT_SYMBOL 导出变量与函数。
一个模块引用其他模块的符号,称为模块依赖关系。被引用的模块必须先安装,引用模块才能安装。
例 1.3 内核模块依赖实例
代码见\samples\1door\1-10export。本实例演示了内核的符号导出以及模块依赖。核心代码如下所示:
//smodule_dep.c
int function_of_dep(void)
{
printk("function_of_dep\n");
return 0;
}
EXPORT_SYMBOL(function_of_dep); //导出函数
//smodule.c
extern int function_of_dep(void);
static int __init demo_module_init(void)
{
printk("simple module init\n");
function_of_dep(); //引用函数
return 0;
}
很显然,smodule 模块依赖 smodule_dep 函数
1.1.6 printk的等级
内核态的打印函数 printk 可以设定打印信息的等级。printk 的打印等级设置如下
1.1.7 设备驱动程序类别
在 Linux 操作系统中,设备驱动程序为各种设备提供了一致的访问接口,用户程序可以像
对普通文件一样对设备文件进行打开和读写操作。Linux 包含如下三类设备驱动程序:
(1)字符设备
Linux 下的字符设备是指设备发送和接收数据以字符的形式进行。字符设备接口支持面向字
符的 I/O 操作,数据不经过系统的快速缓存,由驱动本身负责管理自己的缓冲区结构。字符设备
接口只支持顺序存取的有限长度的I/O 操作。典型的字符设备包括串口、LED 灯、键盘等设备。
(2)块设备
块设备是以块的方式进行 I/O 操作的。块设备是利用一块系统内存作缓冲区,用来临时
存放块设备的数据。当缓存的数据请求达到一定数量,会对设备进行读写操作。块设备是主
要针对磁盘等慢速设备设计的,以免读写设备耗费过多的 CPU 时间。块设备支持随机存取
功能,也几乎可以支持任意位置和任意长度的 I/O 请求。典型的块设备包括硬盘、CF 卡、
SD 卡等存储设备。
(3)网络设备
Linux 操作系统中的网络设备是一类特殊的设备。Linux 的网络子系统主要是基于 BSD
UNIX 的 socket 机制。在网络子系统和驱动程序之间定义有专门的数据结构(sk_buff)进行数
据的传递。Linux 操作系统支持对发送数据和接收数据的缓存,提供流量控制机制,也提供
对多种网络协议的支持。
1.2 字符设备驱动程序原理
1.2.1 file_operations结构
1.2.2 使用 register_chrdev 注册字符设备
1.2.4 字符设备的读写
1.3.2 seq_file 实例
/proc 文件系统
Linux 内核中的 /proc 文件系统是一种特殊的文件系统,通过它可以在运行时访问内核的内部数据结构、改变内核设置,内核可以通过它向进程发送信息。应用程序可以通过 /proc 文件系统获取有关进程的有用信息,Linux 中的 ps、top 命令就是通过读取 /proc 下的文件来获取它们需要的信息。与其他文件系统不同,/proc 主要存放由内核控制的状态信息,它存储于内存中而不是硬盘或其他存储设备上。/proc 文件系统的根目录就是/proc。对于系统中
的任何一个进程来说,在 proc 的子目录里都有一个同名的进程 ID。利用 /proc 文件系统可以
获取进程信息、电源管理(APM)信息、CPU 信息(cpuinfo)、负载信息(loadavg)、系统
内存信息(meminfo)等等。/proc 目录下的核心文件结构如下: