[原][树莓派] - 内核模块编译--续

目的

验证树莓派的内核以及内核头文件的正确性,为后面开发驱动做准备。

 

使用工具

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、下载内核版本对应的内核头文件。

扫描二维码关注公众号,回复: 3333548 查看本文章
 $ sudo apt-get install linux-headers-3.18.11+

 

可惜了,没有可以用的版本。

 

3、应对2中出现的问题

1)使用附件地址下载对应的内核头文件包

http://www.niksula.hut.fi/~mhiienka/Rpi/linux-headers-rpi/linux-headers-3.18.11%2B_3.18.11%2B-2_armhf.deb

得到包之后使用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

 

以上请注意选择内核的版本,区分树莓派 12装上新内核之后,红色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左右。

 

猜你喜欢

转载自blog.csdn.net/u010398378/article/details/50075417