1. Menuconfig

Linux编译器是通过.config文件确认哪些代码要编译进内核,如果我们要配置和裁剪内核,需要对.config文件下手。更改.config文件的工具就是muneconfig, 它是基于文本菜单的配置界面。在Linux源码目录下输入命令

make Menuconfig

即可进入配置界面,具体界面如下如所示:
在这里插入图片描述
我们可以通过配置menuconfig菜单来对哪些代码编译进内核进行添加与选择。

2. Kconfig

我们可以通过menuconfig选择哪个驱动或者文件需要编译进内核中,但是我们怎么将我们编写的驱动添加到menuconfig中呢?这就要用到Kconfig文件了,我们编写驱动时,绝大多数是字符型驱动,这里就以字符型驱动为例,来描述一下怎么将自己写好的字符型驱动,添加到menuconfig中。
在源码目录下的每个文件夹下都有一个Kconfig文件,当然驱动文件夹driversl里面的每一个子文件夹里也都有一个Kconfig文件。首先,打开字符型驱动文件夹下的Kconfig文件:

vim LinuxKernelPath/drivers/char/Kconfig

我们找到该文件的末尾中的一段:

...
config LEDS_CTL
        bool "Enable LEDS config"
        default y
        help
          Enable LEDS config

config BUZZER_CTL
        bool "Enable BUZZER config"
        default n
        help
          Enable BUZZER config
...

我们只需要仿照这个格式填写我们的驱动就可以添加到menuconfig中了,以helloworld为例:

config HELLOWORLD_CTL
		bool "Enable HELLOWORLD config"
		default n
		help
			Enable HELLOWORLD config

将这段代码加入到Kconfig中,我们就可以在menuconfig菜单中找到并配置它,具体的位置为:device drivers–>character devices–>Enable HELLOWORLD config:
在这里插入图片描述
前面为*号表示编译进内核,为空的话为不编译仅内核。

3. Makefile

现在知道怎么将我们驱动添加到配置文件了,那么我们写好的驱动文件(.c文件)要放在哪里呢?我们编写好的HelloWorld.c文件应该放在内核源目录下的字符型驱动文件夹下。即:

/LinuxKernelPath/drivers/char/

并且我们要在该目录下的Makefile 文件中添加一下语句:

obj-$(CONFIG_HELLOWORLD_CTL) += HelloWorld.o

表示编译的时候会编译HelloWorld.c。观察Makefile可以发现,有的语句是这么写的:

obj-y  += misc.o

obi后面直接加一个y表示该驱动是强制编译到内核的。

4. 内核配置与编译的流程

以HelloWorld.c驱动为例,讲述一下将该驱动编译到内核的流程:
① 在该路径

/LinuxKernelPath/drivers/char/

下的Kconfig文件中添加有关驱动的描述:

config HELLOWORLD_CTL
		bool "Enable HELLOWORLD config"
		default n
		help
			Enable HELLOWORLD config

② 在menuconfig中配置HELLOWORLD config
③ 在路径:

/LinuxKernelPath/drivers/char/

下加入语句:

obj-$(CONFIG_HELLOWORLD_CTL) += HelloWorld.o

④ 在源码目录下,运行命令编译内核:

make zImage

编译好的内核在该路径中:

/LinuxKernelPath/arch/arm/boot/

⑤ 在内核运行fastboot工具,移植到ARM板中即可。

5. 注意

虽然HelloWorld驱动被编译到了内核中,但是该驱动在板子还是无法使用的,因为没有注册设备,这在下一节中会涉及到,一般来说,驱动要工作之间首先要对设备进行注册

Logo

更多推荐