一 学习目标:
掌握Linux设备驱动开发中常用的机制和内核资源
中断顶/底半部处理
内核定时器和延时操作
并发控制在内核中的应用
内存管理和分配
阻塞型I/O和非阻塞型I/O
二 驱动特点
驱动的特点:提供能力(机制),而不是提供策略
三 模块部分知识点:
1.模块装载命令
insmod rmmod lsmod |grep hello
modprobe 加载模块的第二种方法
Insmod和modprobe主要区别
modprobe会考虑要装载的模块是否引用了一些当前内核不存在的符号。如果有这类引用,modprobe会在当前模块路径中搜索定义了这些符号的其他模块,并同时将这些模块也装载到内核。如果在这种情况下使用insmod,该命令则会失败,并在系统日志文件中记录“unresolved symbols(未解析的符号)”消息。
2.
模块也可以拥有参数数组
形式为“module_param_array(数组名,数组类型,数组长,参数读/写权限)”。
运行insmod或modprobe命令时,应使用逗号分隔输入的数组元素
装载模块时改变参数:
可通过insmod或modprobe
insmod hello_ext.ko howmany=5 whom="Students"
modprobe也可以从它的配置文件(/etc/modprobe.conf)读取参数的值
3.导出符合
EXPORT_SYMBOL_GPL(name); GPL 版本的宏定义的导出符号只能对 GPL 许可的模块可用
EXPORT_SYMBOL是Linux内核中一个常见的工具,其作用是讲一个”Symbol”(函数或者变量)导出到内核空间,使得内核的所有代码都可以使用
4.模块声明与描述
MODULE_AUTHOR(author); ---声明模块的作者
MODULE_DESCRIPTION(description); ---声明模块的描述
MODULE_VERSION(version_string); ---声明模块的版本
MODULE_DEVICE_TABLE(table_info); ---声明模块的设备表
MODULE_ALIAS(alternate_name); ---声明模块的别名