日期:2014-05-16  浏览次数:20677 次

LINUX设备驱动程序--阅读笔记(原创)

LINUX设备驱动程序(LINUX DEVICE DRIVERS )--阅读笔记


由? 王宇 原创并发布


设备驱动程序简介

??? 设备驱动程序的作用

??? 内核功能划分


??? ??? 进程管理

??? ??? 内存管理

??? ??? 文件系统

??? ??? 设备控制

??? ??? 网络功能

??? ??? 可装在模块

??? ??? ??? insmod将模块链接到内核

??? ??? ??? rmmode将模块移除内核

??? 设备和模块的分类


??? ??? 字符模块

??? ??? 块模块

??? ??? 网络模块

??? 安全问题

??? 版本编号

??? 许可证条款


??? 加入内核开发社区



构造和运行模块

??? 设置测试系统

??? HelloWorld模块


??? ??? insmod模块安装工具

??? ??? rmmod模块移去工具

??? 核心模块与应用程序的对比

??? ??? 模块预先注册自己,用于服务某种请求

??? ??? 模块退出时需要释放资源

??? ??? 模块错误会影响到整个系统

??? ??? 用户空间和内核空间

??? ??? ??? 不同地址空间

?? ? 编译和装载

??? 内核符号表


?
?? 预备知识

??? 初始化和关闭

??? 模块参数


??? 在用户空间编写驱动程序

??? 快速参考


??? ??? 用来装载模块到正运行的内核和移除模块的用户空间工具:

??? ??? ??? insmod

??? ??? ??? modprobe

??? ??? ??? ??? modprobe功能就是,对系统里的模块进行增、减、安装、删除等等操作。类似于insmod

??? ??? ??? rmmod

??? ??? 用于指定模块的初始化和清除函数的宏(可选的)

?

            __init

            __initdata

            __exit

            __exitdata

?


??? ??? 最重要的头文件之一包含驱动程序使用的大部分内核API的定义

??? ??? ??? #include<sched.h>

??? ??? ??? 当前进程:structtask_struct*current;

??? ??? ??? 当前进程的进程ID和命令:current->pidcurent->comm

??? ??? 必要的头文件,它必须包含在模块代码中:

??? ??? ??? #include<linux/module.h>

??? ??? 构造内核版本信息的头文件

??? ??? ??? #include<linux/version.h>

??? ??? 整数宏,在处理版本依赖的预处理条件语句中非常有用

??? ??? ??? LINUX_VERSION_CODE

??? ??? 用于导出单个符号到内核的宏

??? ??? ??? EXPORT_SYMBOL(symbol)

??? ??? ??? EXPORT_SYBMOL_GPL(symbol)

??? ??? 用来声明模块初始化和清除函数的宏

??? ??? ??? module_init(int_function);

??? ??? ??? module_exit(exit_function);

??? ??? 在目标文件中添加关于模块的文档信息

??? ??? ??? MODULE_AUTHER(author);

??? ??? ??? MODULE_DESCRIPTION();