您的位置:首页 > 运维架构 > Linux

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

2009-12-19 10:47 483 查看
see also: http://www.cyberciti.biz/tips/compiling-linux-kernel-module.html



/* hello.c 
 * Copyright (C) 2009 by songbohr@gmail.com
 * 
 * "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的格式化输出,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: