Linux驱动开发系列之二:第一个linux驱动hello word程序

see also: http://www.cyberciti.biz/tips/compiling-linux-kernel-module.html

 

/* hello.c * Copyright (C) 2009 by [email protected] * * "Hello, world" - the kernel module version. */ /* The necessary header files */ /* Standard in kernel modules */ #include <linux/kernel.h> /* We're doing kernel work */ #include <linux/module.h> /* Specifically, a module */ /* Initialize the module */ int init_module() { printk("Hello, world - this is the kernel speaking/n"); /* If we return a non zero value, it means that * init_module failed and the kernel module * can't be loaded */ return 0; } /* Cleanup - undid whatever init_module did */ void cleanup_module() { printk("Short is the life of a kernel module/n"); } 

# Makefile for a basic kernel module # KERNEL_DIR:=/usr/src/linux obj-m:=hello.o default: $(MAKE) -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules clean: $(RM) .*.cmd *.mod.c *.o *.ko -r .tmp 

 

 一个内核模块不是一个可以独立执行的文件,而是需要在运行时刻连接入内核的目标文件。所以,它们需要用-c 选项进行编译。而且,所有的内核模块都必须包含特定的标志:

 __KERNEL__——这个标志告诉头文件此代码将在内核模块中运行,而不是作为用户  进程。

 MODULE——这个标志告诉头文件要给出适当的内核模块的定义。

 LINUX——从技术上讲,这个标志不是必要的。但是,如果你希望写一个比较正规的内核模块,在多个操作系统上编译,这个标志将会使你感到方便。它可以允许你在独立  于操作系统的部分进行常规的编译。

  还有其它的一些可被选择包含标志,取决于编译模块是的选项。 如果你不能明确内核怎 样被编译,可以在  in/usr/include/linux/config.h 中查到。

 

 __SMP__——对称多线程。在内核被编译成支持对称多线程(尽管在一台处理机上运

  行)是必须定义。如果是这样,还需要做一些别的事情(参见第 12 章)。

 CONFIG_MODVERSIONS——如果 CONFIG_MODVERSIONS 被激活,你需要在编译

  是定义它并且包含文件/usr/include/linux/modversions.h。这可以有代码自动完成。

 

 

 

函数 printk 是由 Linux 内核定义的,功能与 printf 相似;模块可以调用 printk,这是因为在insmod 加载了模块后,模块就被连编到内核中了,也就可以调用内核的符号了。

通过执行 insmod 和 rmmod 命令,你可以试试这个模块。注意,只有超级用户才能加载和卸载模块。

另外,可以用dmesg命令查看printk的输出日志。lsmod列举内核模块及引用计数。相当于cat /proc/modules的格式化输出,

 

 

你可能感兴趣的:(多线程,linux,Module,header,basic,makefile)