ubuntu安装linux-headers-$(uname -r) 到/usr/src目录,同时在/lib/modules/$(uname -r)/build设立symbol link
sudo apt-get install linux-headers-$(uname -r)
如果在/usr/src目录下找得到相应内核开发头文件,则无需安装,直接symbol link即可。
#查看/usr/src路径下对应头文件,比如linux-headers- 4.4.0-171-generic
ls /usr/src
cd /lib/modules/4.4.0-171-generic/
#链接文件
ln -s /usr/src/linux-headers-4.4.0-171-generic build
当你兴致勃勃地编译好hello.ko,在屏幕上敲下sudo insmod hello.ko以后,如果不想在dmesg中看到taited kernel之类的信息,那就在Makefile中设置一下
CONFIG_MODULE_SIG=n,暂时关掉内核模块签名验证功能。
在文件系统上创建一个设备节点的命令是mknod,而且你必须是超级用户才能操作。除了要创建的节点名字外,该命令还带三个参数。例如,命令:
mknod /dev/chr c 254 0
创建一个字符设备(c),主设备号是254,次设备号是0。由于历史原因,次设备号应该在0-255范围内,有时它们存储在一个字节中。存在很多原因扩展可使用的次设备号的范围,但就现在而言,仍然有8位限制。
请注意:如果一旦用mknod生成了一个特别的设备文件,它就永远存在了硬盘上,除非你显式地删除它。你可以通过执行命令"rm"命令来删除上面创建的设备。
rm /dev/chr
写字符设备驱动程序时,出现错误:fatal error: asm/system.h: No such file or directory
错误信息可知,缺少此头文件
原因:Linux内核是不断地更新换代,即3.3版本之后内核用switch_to.h替换了曾经的system.h头文件。
解决方法:在终端输入uname -r,查看自己Linux内核版本。如,我的内核版本是4.2.0-27-generic,可知为3.3之后版本,直接使用#include <asm/switch_to.h>替换掉原来的#include <asm/system.h>