其实之前做过一段时间的驱动开发,但是很久没碰了,要写论文了,所以驱动的东西还得再捡起来,今天才重写第一个入门的hello world就出问题了,不过还好通过强大的baidu和google解决了,记录学习的过程.
先看看代码 hello.c
#include <linux/init.h> #include <linux/module.h> static int __init hello_init(void) { printk(KERN_ALERT "hello world init,2014_2_19"); return 0; } static void __exit hello_exit(void) { printk(KERN_ALERT "hello world exit,2014_2_19"); } module_init(hello_init); module_exit(hello_exit); MODULE_LICENSE("GPL");
obj-m :=hello.o KERNELDIR ?=/lib/modules/$(shell uname -r)/build PWD ?=$(shell pwd) build:kernel_modules kernel_modules: make -C $(KERNELDIR) M=$(PWD) modules clean: make -C $(KERNELDIR) M=$(PWD) clean
输入命令
sudo insmod hello.ko
接着lsmod
u1@u1:~/first_module$ lsmod Module Size Used by hello 12425 0 [permanent] bnep 18436 2 rfcomm 47946 0 bluetooth 166112 8 bnep,rfcomm ppdev 17113 0
查看内核打印信息,使用dmesg | grep hello
看到
u1@u1:~/first_module$ dmesg | grep hello [ 89.773378] hello world init,2014_2_19
可以看到模块顺利加载了 并且初始化了
接着 sudo rmmod hello
u1@u1:~/first_module$ sudo rmmod hello ERROR: Removing 'hello': Device or resource busy
看下面操作就明白了
u1@u1:~/first_module$ ls -l /usr/bin/gcc lrwxrwxrwx 1 root root 16 2014-02-19 19:02 /usr/bin/gcc -> /usr/bin/gcc-4.4 u1@u1:~/first_module$ gcc -v 使用内建 specs。 目标:x86_64-linux-gnu 配置为:../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.4.6-11ubuntu2' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu 线程模型:posix gcc 版本 4.4.6 (Ubuntu/Linaro 4.4.6-11ubuntu2) u1@u1:~/first_module$ cat /proc/version Linux version 3.0.0-12-generic (buildd@crested) (gcc version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3) ) #20-Ubuntu SMP Fri Oct 7 14:56:25 UTC 2011 u1@u1:~/first_module$
ls -l /usr/bin/gcc 用于查看当前的gcc版本 会发现软连接到了gcc4.4cat /proc/version 查看的是系统编译内核时所用的gcc为4.6
所以果断将gcc的版本改为4.6 即可
修改gcc的版本
u1@u1:~/first_module$ su 密码: root@u1:/home/u1/first_module# rm /usr/bin/gcc root@u1:/home/u1/first_module# ln -s /usr/bin/gcc-4.6 /usr/bin/gcc root@u1:/home/u1/first_module# gcc -v 使用内建 specs。 COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6.1/lto-wrapper 目标:x86_64-linux-gnu 配置为:../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.1-9ubuntu3' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++,go --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-plugin --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu 线程模型:posix gcc 版本 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3) root@u1:/home/u1/first_module#
再此 make clean 然后make
root@u1:/home/u1/first_module# su u1 u1@u1:~/first_module$ make clean make -C /lib/modules/3.0.0-12-generic/build M=/home/u1/first_module clean make[1]: 正在进入目录 `/usr/src/linux-headers-3.0.0-12-generic' CLEAN /home/u1/first_module/.tmp_versions CLEAN /home/u1/first_module/Module.symvers make[1]:正在离开目录 `/usr/src/linux-headers-3.0.0-12-generic' u1@u1:~/first_module$ ls hello.c Makefile u1@u1:~/first_module$ make make -C /lib/modules/3.0.0-12-generic/build M=/home/u1/first_module modules make[1]: 正在进入目录 `/usr/src/linux-headers-3.0.0-12-generic' CC [M] /home/u1/first_module/hello.o Building modules, stage 2. MODPOST 1 modules CC /home/u1/first_module/hello.mod.o LD [M] /home/u1/first_module/hello.ko make[1]:正在离开目录 `/usr/src/linux-headers-3.0.0-12-generic'
所以 sudo reboot
u1@u1:~/first_module$ sudo insmod hello.ko [sudo] password for u1: u1@u1:~/first_module$ dmesg | grep hello [ 84.835319] hello world init,2014_2_19 u1@u1:~/first_module$ sudo rmmod hello u1@u1:~/first_module$ dmesg | grep hello [ 84.835319] hello world init,2014_2_19 [ 107.730749] hello world exit,2014_2_19 u1@u1:~/first_module$ lsmod Module Size Used by ppdev 17113 0 snd_hda_codec_realtek 330769 1 snd_hda_intel 33390 2 snd_hda_codec 104802 2 snd_hda_codec_realtek,snd_hda_intel snd_hwdep 13668 1 sn