linux kernel build-in.o怎么产生

linux kernel build-in.o怎么产生,第1张

背景知识:

背景知识一: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

解释如下:

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

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

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

default y :缺省被选中。

背景知识三:built-ino

vmlinux是Linux源码编译后未压缩的内核, vmlinux是由arch/i386/kernel/heado和arch/i386/kernel/init_tasko以及各个相关子目录下的built-ino链接而成的。

背景知识四: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-coreo hid-inputo

表明这两个o文件是一定会被编译出的。

obj-$(CONFIG_HID) += hido

表明:如果CONFIG_HID是Y,则hido会被编译出来。并built-in

如果是 =m 则hido被编译出来,但最后被做成modules(ko)

背景知识五:KBuild Make:

Linux内核的Makefile与我们平时写的Makefile有所不同,它由五部分组成:

1Makefile : 顶层Makefile。

2 config: kernel配置文件。

3 arch/xxx/Makefile: 具体架构的Makefile。

4 scripts/Makefilexxx : 通用规则。

5 kbuild Makefile: 整个kernel中大约有数百个这种文件。

#make menuconfig后,生成 kernel配置文件: config。

顶层Makefile读取config

顶层Makefile通过解析 config来决定递归访问哪些目录中的Kbuild Makefile

这个过程中,Kbuild Makefile会按config的设置,逐个添加文件列表,以供最后的编译使用。

最简单的KBuild Makefile如下:

obj-y += fooo

表明:Kbuild在这目录里,有一个名为fooo的目标文件。fooo将从fooc或fooS文件编译得到。并且它会被包入built-in中去。

所有编译进内核的目标文件都存在$(obj-y)列表中。而这些列表依赖内核的配置。Kbuild编译所有的$(obj-y)文件。然后,调用"$(LD) -r"将它们合并到一个build-ino文件中。稍后,该build-ino会被其父Makefile联接进vmlinux中。

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

obj-m += fooo

例一:

在 ~/driver/hid/hid-corec中,有以下语句,即内核insmod接口hid_init

module_init(hid_init);

也就是说,当此模块被buildin或者作为module insmod时,kernel会自动调用hid_init

然后查看 ~/driver/hid/Makefile,发现

hid-objs := hid-coreo hid-inputo

表明只要hid这个目录被加入,就会生成hid-coreo

只好去看上一层目录中怎样会进入hid目录:

obj-$(CONFIG_HID) += hid/

表明只要CONFIG_HID=Y,m 则hid目录被加入。

但用户作了什么,hid目录被加入编译呢?则看~/drivers/hid/Kconfig

config HID

tristate "Generic HID support"

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

例2:

Sam想要研究USB Keyboard & Mouse driver 在 make menuconfig时,需要选中:

config USB_HID

tristate "USB Human Interface Device (full HID) support"

则查看Makefile。发现只要选中CONFIG_USB_HID则会编译出usb_hido

但~/drivers/hid/usbhid目录中却没有usbhidc。那usbhido如何生成的呢?

drivers/hid/usbhid目录中,有个usbhidocmd文件。

linux kernel makefile

描述linux kernel 的makefile的组织结构,什么是linux kernel 和 makefile 不用说了。

linux下可否执行,取决于当前用户对此文件 是否具有 x 权限,至于能否运行成功还得取决于文件中的内容。

执行方法(文件中的内容是可以执行的):

1、bash  filename  (没有 x 权限)

2、加上执行权限

chmod +x filename

/filename

以上就是关于linux kernel build-in.o怎么产生全部的内容,包括:linux kernel build-in.o怎么产生、Linux怎么能生成一个可执行文件file, 可以 运行命令。/file<input>o、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9828968.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存