ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

内核驱动添加与裁剪

内核驱动添加与裁剪 目录1.基础概念1.1 内核是怎么管理代码的1.2 三个关键文件1.3 三个编译状态1.4 配置变量2. 如何添加驱动完整步骤第1步在 drivers/char/Makefile 中增加目录引用第2步在 drivers/char/fire_led/ 下创建你自己的 Makefile第3步在 drivers/char/fire_led/ 下创建 Kconfig 文件第4步让上级Kconfig包含你的Kconfig第5步生成并修改 .config 配置第6步编译内核3. 内核裁剪简述1.基础概念1.1 内核是怎么管理代码的内核源码由成千上万个文件组成分散在不同目录下。每个目录下都有一个Makefile和一个Kconfig文件它们决定了哪些代码被编译以及如何让用户选择。1.2 三个关键文件文件作用Makefile告诉编译系统哪些文件要编译编译成什么是编进内核镜像还是编成独立的模块Kconfig定义配置选项这些选项会出现在make menuconfig的图形菜单里.config存储你最终选择的所有配置项y/n/m编译时依据这个文件Kbuild是Linux 内核自己的构建系统Kernel Build System作用是负责根据配置.config决定哪些代码需要编译、怎么编译、生成内核镜像和模块。简单理解Make是工具Makefile是规则文件Kbuild 是 Linux 内核定义的一套 Makefile 规则和框架最终执行编译、链接等动作的还是make但 Kbuild 提供了一套内核约定的规则、变量和流程把复杂的编译管理封装起来1.3 三个编译状态obj-y→ 编译进内核镜像固定在内核里开机就有obj-m→ 编译成独立的模块.ko文件可以手动加载/卸载obj-空 → 不编译1.4 配置变量在Kconfig中定义的config FOO会生成变量CONFIG_FOO。这个变量的值y/m/n由.config决定Makefile通过obj-$(CONFIG_FOO)来引用它。2. 如何添加驱动完整步骤假设想在drivers/char/下新建一个目录fire_led/里面放你的驱动源码led_cdev.c。第1步在drivers/char/Makefile中增加目录引用打开drivers/char/Makefile添加下面任意一行选一种obj-$(CONFIG_FIRE_ABC) fire_led/ # 由配置决定是否编译该目录 # 或者 obj-y fire_led/ # 总是编译该目录不推荐最好用配置控制第2步在drivers/char/fire_led/下创建你自己的 Makefile新建文件drivers/char/fire_led/Makefile内容如下obj-$(CONFIG_GXA_LED) led_cdev.o这表示如果CONFIG_GXA_LED被定义为y或m则编译led_cdev.c成目标文件。第3步在drivers/char/fire_led/下创建 Kconfig 文件新建drivers/char/fire_led/Kconfig内容示例menuconfig FIRE_ABC bool Fire LED Framework help 这是驱动框架的菜单项选上它才能看到子选项。 config GXA_LED tristate support fire led depends on FIRE_ABC help 这是具体的LED驱动依赖上面的FIRE_ABC。bool→ 只能选 y 或 n编入内核或不编tristate→ 可以选 y / m / n编入内核、模块、不编depends on→ 只有父项被选中该项才可见第4步让上级Kconfig包含你的Kconfig打开drivers/char/Kconfig在合适位置添加source drivers/char/fire_led/Kconfig这样在make menuconfig时就能看到你的菜单了。第5步生成并修改 .config 配置# 先使用参考配置以arm架构为例这一步也可以使用自己的准备好的shell脚本导入arch 以及编译器的变量make ARCHarm npi_v7_defconfig # 然后打开图形配置界面 make ARCHarm menuconfig在菜单中找到Fire LED Framework并选上再进入子项support fire led按需求选y或m。保存退出后.config中会自动出现CONFIG_FIRE_ABCy CONFIG_GXA_LEDm # 或 y第6步编译内核make -j4如果选的是y驱动会编译进内核镜像zImage。如果选的是m会生成led_cdev.ko模块文件。3. 内核裁剪简述裁剪就是通过make menuconfig取消不需要的功能减小内核体积。原则去掉obj-y中不必要的模块或把y改成m如果可能。常用命令make menuconfig里按空格切换状态/搜索选项。现在不再大量依赖 machine_desc 进行板级初始化machine_desc 主要用于 DT 平台匹配和少量早期初始化。
返回列表