Linux内核(模块)编译和安装(编译更新ubuntu内核 _ 自动加载模块 _ 自动加载驱动)
以下内容在 Virtualbox + ubuntu 3.11.10.6下测试通过
准备编译环境和下载内核源码
sudo apt-get build-dep --no-install-recommends linux-image-$(uname -r)
apt-get source linux-image-$(uname -r)
https://help.ubuntu.com/community/Kernel/Compile/
内核编译和安装
make menuconfig
make
sudo make modules_install
sudo make install
重启搞定!
http://en.wikipedia.org/wiki/Menuconfig
删除旧的内核
旧的内核还可以启动,建议留着以防万一。
如果清理了旧内核,需要更新grub列表
sudo update-grub2
创建内核模块
内核版本的Hello World
http://blog.markloiseau.com/2012/04/hello-world-loadable-kernel-module-tutorial/
如果你不幸遇到如下诡异的问题
MODPOST 0 modules
那一定是从Windows粘贴文本的错,请把Makefile重新手敲一遍就可以了!应该是CR/LR/TAB格式的问题!
自动加载内核模块
sudo cp hello.ko /lib/modules/$(uname -r)/kernel/
sudo depmod
测试看看
modinfo hello
sudo modprobe hello
lsmod |grep hello
dmesg |grep -i hello
你会看到这个,并不影响加载
hello: module verification failed: signature and/or required key missing - tainting kernel
设置自动加载
方法1
sudo vi /etc/modules
增加一行
hello
方法2
sudo vi /etc/init.d/hello
添加以下内容
#!/bin/sh -e
modprobe hello
sudo chmod 777 /etc/init.d/hello
创建启动脚本链接
sudo ln -s /etc/init.d/hello /etc/rcS.d/Shello
重启试试看!
dmesg |grep -i hello
编译进内核
http://www.linuxjournal.com/content/kbuild-linux-kernel-build-system
在内核代码的drivers下创建hello目录,并拷贝hello.c进去。
创建Kconfig文件,内容如下
config HELLO
tristate "Hello world module"
help
a simple kernel module
创建Makefile文件,内容如下
obj-$(CONFIG_HELLO) += hello.o
修改drivers下的Kconfig和Makefile,以包含新加的hello模块。
make menuconfig
在Device Drivers下找到Hello world module选项,选择为“*“。
make
sudo make modules_install
sudo make install
重启,查看结果
cat /proc/kallsyms |grep hello
可以看到hello的符号已经注册了
但是
dmesg |grep -i hello
却没有任何信息,为啥呢?
注掉hello.c里的MODULE宏定义,再make & make install就搞定了!原来刚才hello模块的初始化代码根本没有被执行,原因如下。
posted on 2017-04-21 09:50 Red_Point 阅读(1489) 评论(0) 编辑 收藏 举报