Linux kernel的Makefile和Kconfig

本文深入探讨了Linux内核构建过程中的Kconfig文件及其语法,并详细解释了Makefile的工作原理,包括配置文件生成、目标文件编译及链接等关键步骤。
  背景知识:
背景知识一:Kconfig介绍:

#make menuconfig 时,所显示的Menu list是由各层Kconfig组成的。
最底层Kconfig存放在 ~/arch/i386/Kconfig. 以此为头,它会一层层使用source来把需要加入的各个目录中Keconfig添加近来。
例如:source "drivers/Kconfig"
则将~/drivers/Kconfig添加进Menu list中。

背景知识二:Kconfig写法语义:
config HID
tristate "Generic HID support"
depends on INPUT
default y
---help---
A human interface device (HID) is a type of computer device that interacts directly with and takes input from humans. The term "HID" most commonly used to refer to the USB-HID specification, but other devices (such as, but not strictly limited to, Bluetooth) are designed using HID specification (this involves certain keyboards, mice, tablets, etc). This option compiles into kernel the generic HID layer code (parser, usages, etc.), which can then be used by transport-specific HID implementation (like USB or Bluetooth).
For docs and specs, see http://www.usb.org/developers/hidpage/
If unsure, say Y

解释如下:
config HID :表示此条目与CONFIG-HID对应。CONFIG-HID会在Makefile中用到。

tristate "Generic HID support" 引号内的内容是会显示到Menu list中的。tristate表示这一项是三态的。

depends on INPUT:依赖于INPUT这一项。如果没有选中INPUT,则Menu list不会显示这项。

default y :缺省被选中。



背景知识三:built-in.o
vmlinux是Linux源码编译后未压缩的内核, vmlinux是由arch/i386/kernel/head.o和arch/i386/kernel/init_task.o以及各个相关子目录下的built-in.o链接而成的。


背景知识四:Kernel Makefile
Kernel中Makefile的体系以及如何编译的,其实Sam一直是一知半解的。
其中,kernel目录中的Makefile被称为底层Makefile
当使用类似#make menuconfig配置内核成功后,会生成 .config文件。
换句话说:make menuconfig 时,Makefile会从~/arch/i386/Kconfig读取Kconfig.然后根据用户的选择。生成.config文件。
例如:在drivers/hid/Kconfig:
config HID
tristate "Generic HID support"
如果用户选中Y,则在.config中会反映出来:
CONFIG_HID=y
则在~/drivers/Makefile中可以看到:
obj-$(CONFIG_HID) += hid/
表明:如果CONFIG_HID是Y,则把hid目录添加到要编译的目录中了。

进入到/driver/hid目录,则看到:
hid-objs := hid-core.o hid-input.o
表明这两个.o文件是一定会被编译出的。
obj-$(CONFIG_HID) += hid.o
表明:如果CONFIG_HID是Y,则hid.o会被编译出来。并built-in.
如果是 =m. 则hid.o被编译出来,但最后被做成modules(ko)


背景知识五:KBuild Make:

Linux内核的Makefile与我们平时写的Makefile有所不同,它由五部分组成:
1.Makefile : 顶层Makefile。
2. .config: kernel配置文件。
3. arch/xxx/Makefile: 具体架构的Makefile。
4. scripts/Makefile.xxx : 通用规则。
5. kbuild Makefile: 整个kernel中大约有数百个这种文件。

#make menuconfig后,生成 kernel配置文件: .config。
顶层Makefile读取.config.
顶层Makefile通过解析 .config来决定递归访问哪些目录中的Kbuild Makefile .
这个过程中,Kbuild Makefile会按.config的设置,逐个添加文件列表,以供最后的编译使用。
最简单的KBuild Makefile如下:
obj-y += foo.o
表明:Kbuild在这目录里,有一个名为foo.o的目标文件。foo.o将从foo.c或foo.S文件编译得到。并且它会被包入built-in中去。
所有编译进内核的目标文件都存在$(obj-y)列表中。而这些列表依赖内核的配置。Kbuild编译所有的$(obj-y)文件。然后,调用"$(LD) -r"将它们合并到一个build-in.o文件中。稍后,该build-in.o会被其父Makefile联接进vmlinux中。

如果foo.o要编译成一模块,那就要用obj-m了。所采用的形式如下:
obj-m += foo.o



例一:
在 ~/driver/hid/hid-core.c中,有以下语句,即内核insmod接口hid_init.
module_init(hid_init);
也就是说,当此模块被buildin或者作为module insmod时,kernel会自动调用hid_init.
然后查看 ~/driver/hid/Makefile,发现
hid-objs := hid-core.o hid-input.o
表明只要hid这个目录被加入,就会生成hid-core.o.
只好去看上一层目录中怎样会进入hid目录:
obj-$(CONFIG_HID) += hid/
表明只要CONFIG_HID=Y,m. 则hid目录被加入。
但用户作了什么,hid目录被加入编译呢?则看~/drivers/hid/Kconfig
config HID
tristate "Generic HID support"

以此得之只要在make menuconfig中选中此项,则hid-core.o被编译出来。


例2:
Sam想要研究USB Keyboard & Mouse driver. 在 make menuconfig时,需要选中:
config USB_HID
tristate "USB Human Interface Device (full HID) support"
则查看Makefile。发现只要选中CONFIG_USB_HID.则会编译出usb_hid.o
但~/drivers/hid/usbhid目录中却没有usbhid.c。那usbhid.o如何生成的呢?
drivers/hid/usbhid目录中,有个.usbhid.o.cmd文件
<think>好的,我现在需要帮助用户在Linux内核Makefile中添加对RTL8152芯片的支持。首先,我应该回顾一下用户提供的引用内容,尤其是引用[1]、[2]、[4][5],这些涉及到修改MakefileKconfig文件的具体步骤。 用户的问题是关于添加RTL8152的支持,而引用中提到的是RTL8189FTV、RTL8192CU等芯片的配置方法,但步骤应该是类似的。根据引用[1][4],通常需要修改drivers/net/wireless/或类似目录下的MakefileKconfig文件,添加对应的驱动路径配置选项。 首先,我需要确认RTL8152驱动的目录位置。通常,内核驱动可能位于drivers/net/usb/目录下,因为RTL8152是USB网卡芯片。假设驱动代码已经存在于内核源码中,比如在drivers/net/usb/r8152/目录下,或者需要将驱动代码放置在该目录中。 接下来,修改Makefile。根据引用[1][4],在对应的Makefile中添加一行obj-$(CONFIG_RTL8152) += r8152/,这样当配置选项CONFIG_RTL8152被启用时,内核编译会包含该目录。需要注意的是,这里要根据实际路径调整,比如如果驱动在drivers/net/usb/下,就应该修改该目录的Makefile。 然后,修改Kconfig文件。在相应的Kconfig中添加source "drivers/net/usb/r8152/Kconfig",这样配置菜单中会包含该驱动的选项。用户可以在make menuconfig时找到并启用该驱动。 此外,引用[5]提到了FILES变量中指定了r8152.ko的路径,这可能涉及到模块安装时的处理,但用户当前的问题可能只需要配置内核编译选项即可。 需要注意的是,确保驱动代码已经存在于内核源码中,或者需要手动添加。如果驱动是外部模块,可能需要更多的配置步骤,比如设置正确的编译器路径,如引用[3]中的./configure命令,但RTL8152通常是内核内置的驱动,所以可能不需要这部分。 总结步骤:找到正确的驱动目录,修改MakefileKconfig,配置内核启用该驱动选项,最后编译安装。需要提醒用户检查驱动是否存在,并确认配置选项的正确名称,可能为CONFIG_USB_RTL8152或类似。</think>在Linux内核中添加对RTL8152芯片支持的操作步骤如下: ### 步骤1:定位驱动目录 RTL8152属于USB网卡驱动,通常位于内核源码的$drivers/net/usb/$目录。需要确认该目录下是否已存在$r8152$子目录,或需手动放置驱动代码[^4][^5]。 ### 步骤2:修改Makefile 在$drivers/net/usb/Makefile$中添加编译指令: ```makefile obj-$(CONFIG_USB_RTL8152) += r8152/ ``` 这表示当配置选项$CONFIG_USB_RTL8152$启用时,会编译$r8152$目录下的代码[^1]。 ### 步骤3:修改Kconfig 在$drivers/net/usb/Kconfig$中添加配置项引用: ```kconfig source "drivers/net/usb/r8152/Kconfig" ``` 这将使内核配置工具识别该驱动的Kconfig文件[^2]。 ### 步骤4:配置内核选项 通过`make menuconfig`进入图形界面,按路径启用驱动: ``` Device Drivers → Network device support → USB Network Adapters → <M> Realtek RTL8152/RTL8153 Based USB Ethernet Adapters ``` 选择`<M>`(模块)或`<*>`(内置)编译方式[^5]。 ### 步骤5:编译与安装 执行: ```bash make modules && sudo make modules_install ``` 最后将生成的$r8152.ko$驱动文件加载到内核中。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值