Linux内核架构学习笔记

本文介绍了Linux内核模块的基本概念,包括如何编写带有参数的可加载模块及模块间的依赖关系,并探讨了字符设备、块设备和网络设备的驱动程序类别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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, int0); 
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 目录下的核心文件结构如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值