32 | 字符设备(上)
2020-05-10 本文已影响0人
AndyWei123
image.png
-
内核模块:设备驱动程序就是一种内核模块,一般以ko结尾的文件。
内核模块一般包括以下几部分:
- 头文件部分
#include <linux/module.h>
#include <linux/init.h>
- 内核模块的主要逻辑函数,如打开,关闭,读取,写入。
- file_operation结构
- 定义整个模块的初始化函数和退出函数(model_init,model_exit)
- licese
- 头文件部分
-
insmod 加载内核模块
- 调用model_init 注册字符设备
- 初始化一个cdev 并且将该cdev的ops指向模块的 operations
- 将该cdev放到 cdev_map 中,以设备的主设备号和次设备号作为dev_t 为key
-
mknode 注册字符设备
- 为/dev/*** 对应的设备文件创建对应的dentry并指向该inode
- 将该inode的i_rdev复制为dev_t,并将该inode的file_operation指向 def_char_ops
-
open 打开该字符设备
- 直接调用设备驱动程序的file_operations的open 函数
-
写入字符设备
通过task_struct 的fd文件描述符找到对应的 file 然后找到innode 在通过innode 的file_operations 操作。
- IOCT 操作符
- 通过file_operation的unlock_ioctl传入 CMD 进行控制
image.png