Linux内核模块编程

1.必须的头文件:

<linux/kernel.h>//说明在内核编程

<linux/module.h>//说明在编写内核模块

2.针对/proc文件系统:

相关定义在<linux/proc_fs.h>

相关函数实现在/kernel source directory/fs/proc/array.c中,包括:procfile_read()、proc_dir_entry包含相应的函数指针

3、L i n u x提供了一个特殊的结构i n o d e _o p e r a t i o n s,该结构存放指向所有这些函数的指针,其中包含一个指向结构f i l e_o p e r a t i o n s的指针,结构f i l e_ o p e r a t i o n s又包含指向m o d u l e_ i n p u t和m o d u l e _o u t p u t函数的指针

4. IOCTL

在U n i x中,可以使用一个称为i o c t l的特殊函数( i o c t l是输入输出控制的英文缩写)。每个设备都有属于自己的i o c t l命令,可以是读i o c t l (从进程把信息发送到内核)、写
i o c t l (把信息返回到进程)、都有或者都没有。调用i o c t l函数必须带上三个参数:适当的设备文件的文件描述符, i o c t l编号以及另外一个长整型的参数,用户可以使用这个长整型参数来传送任何信息。

内核模块的基本组成部分:

首先定义struct file_operations {

seek函数指针

device_read函数指针

device_write函数指针

readdir函数指针

select函数指针

ioctl函数指针

mmap函数指针

device_open函数指针

flush函数指针

device_release函数指针

}

然后在init_module中注册函数,主要是通过module_register_chrdev(字符类设备)注册:major_number、名字和对应的 file_operations 对象的指针

在cleanup_module中unregister相应设备module_unregister_chrdev


相应的用户态程序处理逻辑是:

open(设备名称,模式参数如0)

然后使用ioctl()发起调用


5. <sys/syscall.h>定义了系统调用的列表

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容