linux驱动之Hello World
看了几天的Windows Internals, 觉得挺烦的,看不进去。作者讲Windows的各种机制讲得有些枯燥,毕竟Windows不是开源的,很多内部的实现都只能用概念来讲解,有些抽象。
转到了Linux阵营,经典的LDD(Linux Driver Develop)读起来顺畅无比,相见恨晚。
驱动的Hello World,也是好几天,今天才弄好。其间编译安装自己的内核差点把整个系统搞挂,格式不对导致make好几天莫名其妙错误。
首先,我是Ubuntu的,apt还是很方便的。并不需要使用自己编译的内核,Ubuntu可以直接用apt安装相关的编译环境(内核头文件和库文件)。名字为 linux-headers-内核版本,不知道内核版本也没事,用下面命令:
$ sudo apt-get install linux-headers-$(uname -r)
#include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> static int hello_init(void) { printk( KERN_ALERT "Hello, world! I'm Lizhixing.\n" ); return 0; }; static void hello_exit(void) { printk( KERN_ALERT "Good bye, cruel world. Tommorow is another day! \n" ); }; module_init( hello_init ); module_exit( hello_exit );
这段代码注册了module加载和卸载的事件处理函数,只打印一下。
只有代码不能直接用gcc编译,要写Makefile文件。Makefile文件推荐用vi编写,省得出错。
obj-m = hello.o KVERSION = $(shell uname -r) all: make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules clean: make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean
然后make即可完成编译。
make make -C /lib/modules/3.13.0-24-generic/build M=/disks/e/0-code/0-thinkingl-code/trunk/thinkingl-codelib/Study/0-linuxdriver/0-helloworld modules make[1]: Entering directory `/usr/src/linux-headers-3.13.0-24-generic' CC [M] /disks/e/0-code/0-thinkingl-code/trunk/thinkingl-codelib/Study/0-linuxdriver/0-helloworld/hello.o Building modules, stage 2. MODPOST 1 modules CC /disks/e/0-code/0-thinkingl-code/trunk/thinkingl-codelib/Study/0-linuxdriver/0-helloworld/hello.mod.o LD [M] /disks/e/0-code/0-thinkingl-code/trunk/thinkingl-codelib/Study/0-linuxdriver/0-helloworld/hello.ko make[1]: Leaving directory `/usr/src/linux-headers-3.13.0-24-generic'然后就可以加载和卸载模块测试效果:
insmod hello.ko rmmod hello.ko
[133540.841098] Hello, world! I'm Lizhixing. [133553.819340] Good bye, cruel world. Tommorow is another day!
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。