目的
验证树莓派的内核以及内核头文件的正确性,为后面开发驱动做准备。
使用工具
1、安装raspbian的树莓派一个。
2、网线,有串口更好。
相关附件下载
1、内核源代码头文件
http://www.niksula.hut.fi/~mhiienka/Rpi/linux-headers-rpi/
操作教程
1、内核版本确认
使用下面命令查看内核版本
</pre><pre name="code" class="python"> $ uname -r
3.18.11+
2、下载内核版本对应的内核头文件。
$ sudo apt-get install linux-headers-3.18.11+
可惜了,没有可以用的版本。
3、应对2中出现的问题
1)使用附件地址下载对应的内核头文件包
得到包之后使用ftp上传到树莓派上。
执行下面命令:
$ ar -xlinux-headers-3.18.11\ _3.18.11\ -2_armhf.deb
得到3个文件:
control.tar.gz debian-binary data.tar.gz
解压data.tar.gz
$ tar vxfdata.tar.gz
得到./usr/src/linux-headers-3.18.11+目录,进入目录执行命令拷贝树莓派的config.gz
$ ls
arch Documentation fs ipc kernel mm samples sound virt
block drivers include Kbuild lib Module.symvers scripts tools
crypto firmware init Kconfig Makefile net security usr
$ gzip -dc /proc/config.gz > .config
执行make oldconfig
$ make oldconfig
scripts/kconfig/conf--oldconfig Kconfig
#
# configurationwritten to .config
#
中途可能出现NEW的设备,直接N加回车就行了。等待2分钟就好了。
2)直接安装带有内核头文件的内核版本
$ sudo apt-get installlinux-image-3.18.0-trunk-rpi
更改启动设置
config.txt尾部添加:
kernel=vmlinuz-3.18.0-trunk-rpi
initramfsinitrd.img-3.18.0-trunk-rpi followkernel
重启
$ sudo reboot
查看内核版本:
$ uname -r
3.18.0-trunk-rpi
然后安装对应内核头文件:
$ sudo apt-getinstall linux-headers-3.18.0-trunk-rpi
以上请注意选择内核的版本,区分树莓派 1与2。装上新内核之后,红色LED灯不亮了,这个不清楚是什么情况,但一定是有什么没有设置对。
4、内核模块helloworld编写
源代码编写
/*!hello.c */
#include <linuxinit.h="">
#include <linuxmodule.h="">
MODULE_LICENSE("DualBSD/GPL");
static inthello_init(void)
{
printk(KERN_ALERT"Hello, world");
return 0;
}
static voidhello_exit(void)
{
printk(KERN_ALERT"Goodbye, cruel world");
}
module_init(hello_init);
module_exit(hello_exit);
Makefile编写
obj-m := hello.o
KDIR := /usr/src/linux-headers-3.18.0-trunk-rpi/ #选择自己内核头文件的位置
all:
make-C $(KDIR) M=$(PWD) modules
clean:
rm-f *.ko *.o *.mod.o *.mod.c *.symvers modul*
5、实验结果
准备工作做好了,现在开始编译
$ make
会生成以下文件:
$ ls
hello.c hello.mod.c hello.o modules.order
hello.ko hello.mod.o Makefile Module.symvers
查看这个内核模块的信息:
$ modinfo hello.ko
filename: /home/pi/workspace/kernel_modules/helloworld/hello.ko
license: Dual BSD/GPL
depends:
vermagic: 3.18.0-trunk-rpi preempt mod_unloadmodversions ARMv6
加载内核:
$ sudo insmod hello.ko
移除
$ sudo rmmod hello
查看输出:
$ dmesg | tail -2
[ 511.065934] Hello, World
[ 520.894053] Goodbye, cruel world
可以看到,这个hello内核模块工作的很正常。
总结
内核模块编译的环境需要内核源代码以及相同版本的内核,最好用源代码编译好内核。
内核模块的编译速度比较快,电脑上几乎感觉不到。树莓派需要10s左右。