学习方法:一边写驱动一边分层次读内核代码
基础需求:
具有硬件知识
了解内核基础知识
了解内核中的并发控制和同步(例如声卡同时控制两种声音)
复杂的软件结构框架
特点:
隐藏硬件细节,提高应用软件的可移植性
提高安全性
提高机制而不是策略
加载入口点———>module_init(hello_init)加载函数
卸载入口点———>module_exit(hello_exit)卸载函数
函数名加static
hello_init,hello_exit只被调用一次
printk(优先级"");//内核级的函数,优先级从小到大递减;KERN_ALERT=<1>.输出到日志文件(低优先级)或终端(高优先级)
insmod 加载模块
rmmod 卸载模块
dmesg:查看日志文件
cat /proc/sys/kernel/printk查看日志优先级
uname -r:查看系统版本
lsmod | grep hello
obj–y用来定义哪些文件被编进( built-in)内核
obj-m用来定义哪些文件被编译成可加载模块( Loadable module )
lib-y用来定义哪些文件被编成库文件
obj-y、obj-m还可以用来指定要进入的下一层子目录
模块编译,加载/卸载:
1、准备好内核树,配置、编译好内核(内核树=系统源码)
2、为模块创建makefile文件make -C 内核树所在目录 M=`pwd` modules(目标文件名)
make -C /root/mini2440/linux-2.6.32.2 M=/home/cqq/driver modules
模块参数
module_param(参数名,参数类型,参数读写权限) //charp表示字符型指针
卸载失败:
mkdir /lib/modules
mkdir /lib/modules/2.6.32···
基础需求:
具有硬件知识
了解内核基础知识
了解内核中的并发控制和同步(例如声卡同时控制两种声音)
复杂的软件结构框架
特点:
隐藏硬件细节,提高应用软件的可移植性
提高安全性
提高机制而不是策略
加载入口点———>module_init(hello_init)加载函数
卸载入口点———>module_exit(hello_exit)卸载函数
函数名加static
hello_init,hello_exit只被调用一次
printk(优先级"");//内核级的函数,优先级从小到大递减;KERN_ALERT=<1>.输出到日志文件(低优先级)或终端(高优先级)
insmod 加载模块
rmmod 卸载模块
dmesg:查看日志文件
cat /proc/sys/kernel/printk查看日志优先级
uname -r:查看系统版本
lsmod | grep hello
obj–y用来定义哪些文件被编进( built-in)内核
obj-m用来定义哪些文件被编译成可加载模块( Loadable module )
lib-y用来定义哪些文件被编成库文件
obj-y、obj-m还可以用来指定要进入的下一层子目录
模块编译,加载/卸载:
1、准备好内核树,配置、编译好内核(内核树=系统源码)
2、为模块创建makefile文件make -C 内核树所在目录 M=`pwd` modules(目标文件名)
make -C /root/mini2440/linux-2.6.32.2 M=/home/cqq/driver modules
模块参数
module_param(参数名,参数类型,参数读写权限) //charp表示字符型指针
卸载失败:
mkdir /lib/modules
mkdir /lib/modules/2.6.32···