如何将内核模块编译进linux内核

      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!

发布了22 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/bhniunan/article/details/104083963