导图社区 Linux设备驱动
Linux设备驱动学习,更好理解驱动工作原理
社区模板帮助中心,点此进入>>
互联网9大思维
组织架构-单商户商城webAPP 思维导图。
域控上线
python思维导图
css
CSS
计算机操作系统思维导图
计算机组成原理
IMX6UL(A7)
考试学情分析系统
Linux设备驱动
第1章
内核版本
偶数版本(如2.6.x)为稳定版本
奇数版本
内核划分
进程管理
内存管理
文件系统
设备控制
网络
程序设计
机制
驱动主要提供机制
策略
设备分类
字符设备
块设备
文件系统有对应入口
网络接口
文件系统无对应入口, 处理报文接收和发送
安全问题
安全是一个策略问题
设备操作对系统的影响
驱动编写
缓冲区覆盖
对用户进程输入数据持怀疑态度
内核获取的任何内存应当清零
接收的数据不能危及系统
第2章
模块加载和卸载
module_init()
int init_module(void)
加载
module_exit()
void cleanup_module(void)
卸载
驱动模块
USB模块
字符设备(USB串口)
块设备(USB内存读卡器)
网络设备(USB以太网接口)
串口模块
SCSI模块
......
当前进程
struct task_struct current;
<linux/sched.h>
<asm/current.h> #define get_current() (current_thread_info()->task) #define current get_current() 使用示例: printk(KERN_INFO "The process is \"%s\" (pid %i)\n", current->comm, current->pid);
内核与用户编程注意事项
堆栈使用
应用程序存在于虚拟内存,有非常大的堆栈区,用来保存函数调用历史以及所有的由当前活跃的函数创建的自动变量。内核,,相反, 有一个非常小的堆栈,它可能小到一个4096 字节的页,你的函数必须与这个内核空间调用链共享这个堆栈。因此,声明一个巨大的自动变量从来就不是一个好主意;如果你需要大的结构, 你应当在调用时间内动态分配。
API使用
双下划线(__)开始的函数名,这样标志的函数名,通常是一个低层的接口组件,应当小心使用。
浮点运算
内核代码不能做浮点算术. 使能浮点将要求内核在每次进出内核空间的时候保存和恢复浮点处理器的状态 -- 至少, 在某些体系上. 在这种情况下, 内核代码真的没有必要包含浮点, 额外的负担不值得.
模块加载、卸载、查看工具
insmod
rmmod
sys_init_module/sys_delete_module
<linux/syscalls.h> asmlinkage long sys_init_module(void __user *umod, unsigned long len, const char __user *uargs); asmlinkage long sys_delete_module(const char __user *name_user, unsigned int flags);
系统调用的名字都是以 sys_ 为前缀
modprobe(检查模块依赖并加载)
lsmod
/proc/modules
/sys/module
版本依赖
<linux/module.h>
<linux/version.h>
#define LINUX_VERSION_CODE 199682 #define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
宏LINUX_VERSION_CODE
宏KERNEL_VERSION(a,b,c)
版本比较
<generated/utsrelease.h>
根据Linux版本等信息自动生成的头文件 #define UTS_RELEASE "3.12.2-zxl-g0e906e3e-dirty"
宏UTS_RELEASE