首页 > 代码库 > linux驱动之Hello World

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)


然后就可以找个地方编写我们自己的Hello World代码了,代码比较简单,用vi就好了。

#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


ssh命令行上可能看不到效果,看dmesg:

[133540.841098] Hello, world! I'm Lizhixing.
[133553.819340] Good bye, cruel world. Tommorow is another day!