内核的编译和移植
前期准备
以下是Kconfig中的一段代码:
source "drivers/redied/Kconfig"
config LED_4412
tristate "Led Support for GPIO Led"
depends on LEDS_CLASS
help
OProfile is a profiling system capable of profiling the
whole system, include the kernel, kernel modules, libraries,
and applications.
if unsure,say N.
代码分析
片段一:
source "drivers/redied/Kconfig"
包含drivers/redied
路径下的驱动文件(Kconfig
)
片段二:
config LED_4412
配置选项的名称,全程为CONFIG_LED_4412
片段三:
tristate "Led Support for GPIO Led"
tristate
表示驱动状态,有三种状态 分别为:把驱动编译成模块,把驱动编译成内核,不编译
Led Support for GPIO Led
是make menuconfig
显示的名字
与之对应的有bool分别是编译到内核,不编译
片段四:
depends on LEDS_CLASS
例:A depends on B 表示只有在选择了B的情况下才能选择A。
select :反向依赖,该选项被选中时,后面的定义也会被选中。
片段五:
help
OProfile is a profiling system capable of profiling the
whole system, include the kernel, kernel modules, libraries,
and applications.
if unsure,say N.
帮助信息
代码编写
**1.**在linux内核文件夹中drivers/char
路径下创建hello文件夹
将之前写的helloworld.c文件放到hello中
**2.**编写Kconfig文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uNJAignL-1664509406844)(C:\Users\ianei\AppData\Roaming\Typora\typora-user-images\image-20220929173405378.png)]
**3.**编写Makefile文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G8Ym9vex-1664509406846)(C:\Users\ianei\AppData\Roaming\Typora\typora-user-images\image-20220929173533115.png)]
Makedfile中obj-y表示编译到内核中,obj-m表示编译到模块
obj-$(xxx)相当于obj-y
比如定义 CONFIG_TEST=y
$(CONFIG_TEST)就是y
obj-$(CONFIG_TEST) 就是 obj-y
**4.**char路径下的Kconfig文件编写
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ah2tXeC5-1664509406847)(C:\Users\ianei\AppData\Roaming\Typora\typora-user-images\image-20220929180613364.png)]
修改char路径下的Makefile
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jxO8i05q-1664509406848)(C:\Users\ianei\AppData\Roaming\Typora\typora-user-images\image-20220929182558839.png)]
将hello文件夹下的Kconfig包含进来
**5.**返回到linux内核 路径下打开make menuconfig,从以下路径找到hello world
按空格键选择将hello world 模块编译进内核,
可以在此目录下的.config中用/HELLO搜索到CONFIG_HELLO=y
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-INwrinuq-1664509406849)(C:\Users\ianei\AppData\Roaming\Typora\typora-user-images\image-20220929181048868.png)]
文件修改
**1.**在内核根目录下的编译脚本(create.sh)中有如下代码
此代码表示,在编译时他会自动去arch/arm路径下找imx_v7_defconfig,而不会找根目录下的.config
所以需要将根目录下的.config改为imx_v7_defconfig并放到相应的文件夹下(arch/arm/configs)
原因;
在make menuconfig中修改的hello world 的编译方式保存在了.config中。
步骤:
1.先将编译文件清除
2.修改make menuconfig 中hello world 模块的编译规则
3.将arch/arm/configs文件夹下的imx_v7_defconfig改为其他名字
4.将根目录下生成的.config文件复制到arch/arm/configs文件夹下,并命名为imx_v7_defconfig
5.编译linux内核,在根目录下执行./creat.sh
编译完成后,在hello文件夹下会生成相应的.o文件,arch/arm/boot路径下会存放生成的zimage镜像文件,如果没有说明之前写的东西有错误
g文件复制到arch/arm/configs文件夹下,并命名为imx_v7_defconfig
5.编译linux内核,在根目录下执行./creat.sh
编译完成后,在hello文件夹下会生成相应的.o文件,arch/arm/boot路径下会存放生成的zimage镜像文件,如果没有说明之前写的东西有错误