一.驱动程序编程概念:
1.驱动学习知识结构:
1.linux驱动设计模式,框架.(40%)
2.内核相关的知识.(30%)
3.硬件相关的知识.(30%)把更多的硬件相关的程序放入内核。
2.驱动程序的分类:
1.字符设备驱动:能以字节来访问。通过字符设备文件访问块驱动程序。
2.网络接口:一个网络负责发送和接受数据报文。通过套接字访问块驱动程序,不是通过文件。
3.块设备:一个块来访问数据,linux中允许块设备传送任意数目的字节,区别是驱动与内核接口不同。通过文件系统访问块驱动程序。
3.如何把一个驱动程序编译进内核,修改Makefile和Kconfig.加_init段的函数,启动内核自动执行.
4.装载模块
Insmod和modprobe可以用来装载模块
5.Insmod和modprobe主要区别
modprobe会考虑要装载的模块是否引用了一些当前内核不存在的符号。如果有这类引用,modprobe会在当前模块路径中搜索定义了这些符号的其他模块,并同时将这些模块也装载到内核。如果在这种情况下使用insmod,该命令则会失败,并在系统日志文件中记录“unresolved symbols(未解析的符号)”消息。
6.卸载模块
从内核中卸载模块可以用rmmod工具.注意,如果内核认为该模块任然在使用状态,或者内核被禁止移除该模块,则无法移除该模块。
二.程序模板
MODULE_LICENSE()---模块许可证声明(必须)
MODULE_AUTHOR(author); ---声明模块的作者 (可选)
MODULE_DESCRIPTION(description); ---声明模块的描述
MODULE_VERSION(version_string); ---声明模块的版本
MODULE_ALIAS(alternate_name); ---声明模块的别名
MODULE_DEVICE_TABLE(table_info); ---声明模块的设备表
EXPORT_SYMBOL()---模块导出符号(可选)
EXPORT_SYMBOL_GPL(name);
static int __init initialization_function(void)
{
printk(KERN_ALERT "Hello %s\n",whom);/* 初始化代码 */
}
static void __exit cleanup_function(void)
{
printk(KERN_ALERT " Hello world exit\n");/* 释放资源 */
}
module_exit(initialization_function)---模块卸载函数(必须)
module_init(cleanup_function)---模块加载函数(必须)
module_param(参数名,参数类型,参数读/写权限)
module_param_array(数组名,数组类型,数组长,参数读/写权限)
1.驱动学习知识结构:
1.linux驱动设计模式,框架.(40%)
2.内核相关的知识.(30%)
3.硬件相关的知识.(30%)把更多的硬件相关的程序放入内核。
2.驱动程序的分类:
1.字符设备驱动:能以字节来访问。通过字符设备文件访问块驱动程序。
2.网络接口:一个网络负责发送和接受数据报文。通过套接字访问块驱动程序,不是通过文件。
3.块设备:一个块来访问数据,linux中允许块设备传送任意数目的字节,区别是驱动与内核接口不同。通过文件系统访问块驱动程序。
3.如何把一个驱动程序编译进内核,修改Makefile和Kconfig.加_init段的函数,启动内核自动执行.
4.装载模块
Insmod和modprobe可以用来装载模块
5.Insmod和modprobe主要区别
modprobe会考虑要装载的模块是否引用了一些当前内核不存在的符号。如果有这类引用,modprobe会在当前模块路径中搜索定义了这些符号的其他模块,并同时将这些模块也装载到内核。如果在这种情况下使用insmod,该命令则会失败,并在系统日志文件中记录“unresolved symbols(未解析的符号)”消息。
6.卸载模块
从内核中卸载模块可以用rmmod工具.注意,如果内核认为该模块任然在使用状态,或者内核被禁止移除该模块,则无法移除该模块。
二.程序模板
MODULE_LICENSE()---模块许可证声明(必须)
MODULE_AUTHOR(author); ---声明模块的作者 (可选)
MODULE_DESCRIPTION(description); ---声明模块的描述
MODULE_VERSION(version_string); ---声明模块的版本
MODULE_ALIAS(alternate_name); ---声明模块的别名
MODULE_DEVICE_TABLE(table_info); ---声明模块的设备表
EXPORT_SYMBOL()---模块导出符号(可选)
EXPORT_SYMBOL_GPL(name);
static int __init initialization_function(void)
{
printk(KERN_ALERT "Hello %s\n",whom);/* 初始化代码 */
}
static void __exit cleanup_function(void)
{
printk(KERN_ALERT " Hello world exit\n");/* 释放资源 */
}
module_exit(initialization_function)---模块卸载函数(必须)
module_init(cleanup_function)---模块加载函数(必须)
module_param(参数名,参数类型,参数读/写权限)
module_param_array(数组名,数组类型,数组长,参数读/写权限)