Linux驱动开发系列之二:第一个linux驱动hello word程序
2009-12-19 10:47
483 查看
see also: http://www.cyberciti.biz/tips/compiling-linux-kernel-module.html
一个内核模块不是一个可以独立执行的文件,而是需要在运行时刻连接入内核的目标文件。所以,它们需要用-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的格式化输出,
/* 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的格式化输出,
相关文章推荐
- 【嵌入式linux】(第六步):使用eclipse集成开发环境开发第一个嵌入式Linux程序,并测试LED驱动
- “手把手教你学linux驱动开发”OK6410系列之03---LED字符设备驱动
- Struts1.x系列教程(1):用MyEclipse开发第一个Struts程序
- 第一个linux下的ffmpeg开发程序
- Struts1.x系列教程(1):用MyEclipse开发第一个Struts程序
- Struts1.x系列教程(1):用MyEclipse开发第一个Struts程序
- 【转】storm 开发系列一 第一个程序
- Linux驱动开发庖丁解牛之二 ——模块编程
- Silverlight for Windows Phone 7开发系列(2):第一个Silverlight程序
- (转)“手把手教你学linux驱动开发”OK6410系列之03---LED字符设备驱动
- Struts1.x系列教程(1):用MyEclipse开发第一个Struts程序
- 敏捷开发团队管理系列之二:程序与测试团队I
- Windows 7程序开发系列之二(JumpList篇2 - Destination)
- MYCP开发指南系列之:开发第一个客户端程序
- 手把手教你学linux驱动开发”OK6410系列之01---模块编程
- 【嵌入式linux】(第五步):使用eclipse集成开发环境开发第一个嵌入式Linux驱动
- linux驱动由浅入深系列:驱动程序的基本结构概览之一(第一个驱动程序)
- “手把手教你学linux驱动开发”OK6410系列之02---虚拟字符设备
- Linux下C++的编程——开发环境搭建与第一个程序
- 菜鸟WDF驱动开发系列(2):调试第一个KMDF驱动程序