linux系统的内核模块,在编好之后,可以通过insmod命令安装到系统中,也可以将模块直接编译进内核。
下面我们来做一个实例,实例的目的是编写一个简单的内核模块,然后把该模块编译进S3C6410开发板的内核中,并运行。
1、内核模块的代码hello.c如下所示。
#include <linux/module.h>
#include <linux/init.h>
static int __init hello_init(void)
{
printk(KERN_EMERG "Hello world!\n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_EMERG "hello exit\n");
}
module_init(hello_init);
module_exit(hello_exit);
2、将hello.c加入到内核源码中
我们把hello.c当做字符设备驱动,加入到内核源码的 drivers/char/路径下。在这个文件夹下,保护了内核所有字符设备的驱动源码。
3、修改Kconfig文件。
在内核源码的 drivers/char/路径下打开 Kconfig文件,加入hello相关的条目,如下所示。
#
# Character device configuration
#
menu "Character devices"
config HELLO_WORLD
bool "hello"
config VT
bool "Virtual terminal" if EXPERT
depends on !S390
....................................
Kconfig文件的修改的作用是改变内核配置的菜单。
4、修改Makefile文件
在内核源码的 drivers/char/路径下打开 Makefile文件,加入hello相关的条目,如下所示。
#
# Makefile for the kernel character device drivers.
#
obj-$(CONFIG_HELLO_WORLD) +=hello.o
obj-y += mem.o random.o
obj-$(CONFIG_TTY_PRINTK) += ttyprintk.o
obj-y += misc.o
Makefile文件的修改的作用是把hello.o编译进内核里。
5、配置内核
在内核源码文件夹下,执行下面命令
make menuconfig ARCH=arm
在Device Drivers选项下的Character devices选项下,可以找到名字为hello的选项,按空格键,将该选项选中,如下图所示。
配置好之后,在内核源码文件夹下的.config文件中,可以看到hello相关的条目,如下所示。
#
# Character devices
#
CONFIG_HELLO_WORLD=y
CONFIG_VT=y
CONFIG_CONSOLE_TRANSLATIONS=y
CONFIG_VT_CONSOLE=y
CONFIG_HW_CONSOLE=y
可以看到,已经将CONFIG_HELLO_WORLD选中。
6、编译内核
用下面的命令编译内核
make uImage ARCH=arm CROSS_COMPILE=arm-linux-
编译之后在源码文件夹下的 arch/arm/boot/文件夹下,可以看到uImage文件夹。
7、验证
将新生成的uImage文件烧写到开发板中,重启开发板,在开发板终端的启动信息中,可以看到hello模块初始化过程打印的Hello world!