历史上的今天
返回首页

历史上的今天

今天是:2025年08月20日(星期三)

正在发生

2021年08月20日 | 1_5.3.3_内核配置裁剪及启动流程_内核启动流程分析之Makefile_P

2021-08-20 来源:eefocus

分析Makefile,主要是:


找到第1个文件,从这个文件入手分析启动流程;

链接脚本,分析文件分布情况。

涉及的文件分类如下:

kbuild Makefile

首先来看子目录下面的Makefile,也就是kbuild Makefile,每个子目录下面都会有一个Makefile,它们的主要功能是设置该目录的文件的编译选项。


选取一个子目录下的Makefile来研究一下。

在这里插入图片描述

其中大部分的内容是设置文件的编译选项。

在这里插入图片描述

假设有两个文件a.c和b.c,如果需要单独的将它们编译进内核,可以使用如下语句:


obj-y += a.o b.o


那么,如果要将这两个文件编成一个模块呢?


在内核的Document/kbuild目录下有一个makefile.txt文件,查看makefile.txt,可以发现下图描述。

在这里插入图片描述

内核需要知道你想要生成的模块由哪些文件组成,因此你需要通过一个$(-objs)变量来告诉内核。


在这个例子中,模块名字叫做isdn.o。Kbuild会编译 $ (isdn-objs)变量中的文件,然后对这些文件使用"$(LD) -r"来生成isdn.o。


也就是说,如果要将a.c和b.c编成一个模块,那么需要使用如下指令:


obj-y += ab.o(这个名字不重要)

ab-objs := a.o b.o


另外,使用后缀-y也是可以的,指令如下:


obj-y += ab.o(这个名字不重要)

ab-y := a.o b.o


makefiles.txt中还提到,如果需要在编译时再决定一个文件是否加入这个模块,也是可以实现的。具体实现如上图的第二个例子所描述。(如果不想编入内核,只是变成一个动态库,那么-y参数就替换为-m即可,生成的模块类型则是.ko类型)


子目录下的Makefile就先理解到这里,规则先不看,接下来是架构相关的Makefile(arch/ $(ARCH)/Makefile)。


arch/ $(ARCH)/Makefile

架构相关的Makefile主要决定哪些体系结构相关的文件参与内核的生成,并提供一些规则来生成特定格式的内核映像。


查看一下arch/arm目录下的Makefile。

在这里插入图片描述

编译内核时,我们使用make或者make uImage指令,直接从指令分析入手,就不单独看这个Makefile了,不然思路不够清晰。


根据make uImage分析Makefile,在arch/arm目录下找到uImage(2440是arm架构,使用的arch/arm目录下的Makefile,如果是其他架构,则使用对应架构下的Makefile)。

在这里插入图片描述
在这里插入图片描述

可以看到,uImage的编译依赖于vmlinux,再查找vmlinux,在顶层Makefile找到了它的依赖关系。

在这里插入图片描述

暂时知道arch/arm/的Makefile是被包含到顶层Makefile,先来看一下.config。


.config

之前分析的时候说过,.config文件会生成autoconf.h和auto.conf文件,查找顶层Makefile,可以看到这两个文件也被包含进来了。

在这里插入图片描述
在这里插入图片描述

打开.config,可以看到里面全部都是这样的定义语句,表示的意思就不赘述了,之前已经有详细的说明了。

在这里插入图片描述

顶层Makefile

还是以指令make uImage来分析,根据上面的分析,可以知道uImage依赖于vmlinux,vmlinux又依赖于 $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE。


从名字可以看出,init应该是初始化相关,lds应该是链接,main应该是主函数。

在这里插入图片描述

我们前面分析uImage的时候知道,uImage是由 “头部(64字节)+真正的内核”组成的,其中真正的内核就是vmlinux。


查找vmlinux-init,得到如下信息。

在这里插入图片描述

对于vmlinux-init的分析如下:


vmlinux-init := $(head-y) $(init-y)


head-y := arch/arm/kernel/head$(MMUEXT).o arch/arm/kernel/init_task.o

在这里插入图片描述

其中,$(MMUEXT)在arch/arm/Makefile前面定义,对于没有MMU的处理器,MMUEXT的值为-nommu,使用文件head-nommu.S;对于有MMU的处理器,其值为空,使用head.S文件。

在这里插入图片描述

所以:head-y := arch/arm/kernel/head$(MMUEXT).o arch/arm/kernel/init_task.o


还有一个$(init-y)。


init-y := init/

在这里插入图片描述

init-y := $ (patsubst %/, %/built-in.o, $(init-y)),其中, $(patsubst 原模式, 目标模式, 文件列表)。

在这里插入图片描述

所以,init-y := init/t/built-in.o,它的意思是所有init文件夹下的目标文件会被编程进一个模块叫build-in.o


综上,vmlinux-init := arch/arm/kernel/head.o arch/arm/kernel/init_task.o init/built-in.o

在这里插入图片描述

然后是vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y),从名字分析,分别是核心,库,驱动,网络。


查找core-y,得:


core-y := usr/

core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/

core-y += arch/arm/kernel/ arch/arm/mm/ arch/arm/common/

// If we have a machine-specific directory, then include it in the build.

core-y += $(MACHINE)

core-y := $(patsubst %/, %/built-in.o, $(core-y))


也就是:core-y := usr/ kernel/ mm/ fs/ ipc/ security/ crypto/ block/ arch/arm/kernel/ arch/arm/mm/ arch/arm/common/,然后和上面一样生成各个文件夹的built-in.o,也就是将各个目录下的目标文件一起编译成一个模块。


其他 $(libs-y) $(drivers-y) $(net-y) 也是类似的操作。


最后是链接脚本,vmlinux-lds := arch/$(ARCH)/kernel/vmlinux.lds,其中ARCH表示的是MCU架构,所以ARCH = arm,也就是:


vmlinux-lds := arch/arm/kernel/vmlinux.lds


打开arch/arm/kernel/vmlinux.lds,可以看到,其中开始的地址应该是一个虚拟地址,存放的是所有文件的head段,然后是初始化相关的代码段。顺序由链接时出现的文件顺序来决定。

在这里插入图片描述

直接查看编译信息可以更方便的了解这些信息,rm vmlinux先删除vmlinux,然后再make uImage V=1编译,V=1会将调试信息更详细的打印出来。


arm-linux-ld -EL -p --no-undefined -X -o vmlinux -T arch/arm/kernel/vmlinux.lds arch/arm/kernel/head.o arch/arm/kernel/init_task.o init/built-in.o --start-group usr/built-in.o arch/arm/kernel/built-in.o arch/arm/mm/built-in.o arch/arm/common/built-in.o arch/arm/mach-s3c2410/built-in.o arch/arm/mach-s3c2400/built-in.o arch/arm/mach-s3c2412/built-in.o arch/arm/mach-s3c2440/built-in.o arch/arm/mach-s3c2442/built-in.o arch/arm/mach-s3c2443/built-in.o arch/arm/nwfpe/built-in.o arch/arm/plat-s3c24xx/built-in.o kernel/built-in.o mm/built-in.o fs/built-in.o ipc/built-in.o security/built-in.o crypto/built-in.o block/built-in.o arch/arm/lib/lib.a lib/lib.a arch/arm/lib/built-in.o lib/built-in.o drivers/built-in.o sound/built-in.o net/built-in.o --end-group .tmp_kallsyms2.o

echo ‘cmd_vmlinux := arm-linux-ld -EL -p --no-undefined -X -o vmlinux -T arch/arm/kernel/vmlinux.lds arch/arm/kernel/head.o arch/arm/kernel/init_task.o init/built-in.o --start-group usr/built-in.o arch/arm/kernel/built-in.o arch/arm/mm/built-in.o arch/arm/common/built-in.o arch/arm/mach-s3c2410/built-in.o arch/arm/mach-s3c2400/built-in.o arch/arm/mach-s3c2412/built-in.o arch/arm/mach-s3c2440/built-in.o arch/arm/mach-s3c2442/built-in.o arch/arm/mach-s3c2443/built-in.o arch/arm/nwfpe/built-in.o arch/arm/plat-s3c24xx/built-in.o kernel/built-in.o mm/built-in.o fs/built-in.o ipc/built-in.o security/built-in.o crypto/built-in.o block/built-in.o arch/arm/lib/lib.a lib/lib.a arch/arm/lib/built-in.o lib/built-in.o drivers/built-in.o sound/built-in.o net/built-in.o --end-group .tmp_kallsyms2.o’ > ./.vmlinux.cmd

在这里插入图片描述

通过编译信息,可以知道,使用的链接脚本是arch/arm/kernel/vmlinux.lds(由arch/arm/kernel/vmlinux.lds.S编译生成),第一个文件应该是一个汇编文件head.S,文件顺序与之前分析的vmlinux-init := arch/arm/kernel/head.o arch/arm/kernel/init_task.o init/built-in.o也相同。


所以,我们知道了:


找到第1个文件,从这个文件入手分析启动流程;(arch/arm/kernel/head.S)

链接脚本,分析文件分布情况。(arch/arm/kernel/vmlinux.lds)

推荐阅读

史海拾趣

Digilent公司的发展小趣事

DIALIGHT在全球范围内不断拓展业务,目前在美国、英国、丹麦、德国、马来西亚、新加坡、澳大利亚、墨西哥和巴西等地设有业务。公司的LED产品广泛应用于各种工业场所,包括石油和天然气、矿业、化工、制造业等。通过提供定制化的照明解决方案,DIALIGHT赢得了众多客户的信赖和好评。

国产公司的发展小趣事
确保放大电路的增益不会过高,避免输入信号的幅度超过电路的处理能力。
Ho Chien Electronics Group Inc公司的发展小趣事
对于功率较大的放大器,需要采用高效的散热措施来确保电路的稳定运行和长寿命。
CAMDENBOSS公司的发展小趣事

在电子行业的早期,CAMDENBOSS公司以其对技术的深入研究和不断创新而崭露头角。公司研发团队通过不懈努力,成功开发出一款具有革命性的连接器产品,该产品在信号传输效率和稳定性上取得了显著突破。这一技术突破不仅为公司赢得了市场的广泛认可,也奠定了其在电子连接器领域的领先地位。

Advanced Electronic Packaging公司的发展小趣事

在追求经济效益的同时,Advanced Electronic Packaging公司始终关注企业社会责任和可持续发展。公司积极采用环保材料和生产工艺,减少生产过程中的能源消耗和环境污染。此外,公司还积极参与社会公益活动,为当地社区提供就业机会和培训支持。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。

这些故事只是Advanced Electronic Packaging公司发展过程中的一部分,它们共同展现了公司在电子行业中的成长轨迹和取得的成就。未来,随着科技的不断进步和市场需求的不断变化,相信Advanced Electronic Packaging公司将继续保持创新精神,为电子行业的发展贡献更多力量。

福建国光公司的发展小趣事

面对电子行业的快速发展和不断变化的市场需求,Advanced Electronic Packaging公司始终保持敏锐的洞察力和强烈的创新意识。公司不断加大研发投入,推动封装技术的持续创新。从最初的单一材料封装,到后来的多功能复合封装,再到如今的智能化封装技术,公司的每一次创新都引领着电子封装行业的发展潮流。这些创新成果不仅提升了产品的附加值,还推动了整个电子产业的升级换代。

问答坊 | AI 解惑

DC综合到modelsim仿真.

昨天对一个8位计数器进行了DC综合到modelsim仿真的过程,记录我的操作如下. 首先,要求的文档有:工艺库,工艺库中的内容很多,网上下的不一定全,而且工节库的一至性也无保证.我这里是用的一个ICC示例中用到的工艺库,因为这个示例我跑过,可以用,这样就 ...…

查看全部问答>

如何测量运行中的阈值电压

BTI特征分析正逐渐成为半导体设计与制造中的一个关键测试项目。Denais等人曾介绍过一种方法,通过采用一种原本与VTH漂移相关的间接测量方法将测量间歇期间的恢复减至最小。间歇式测量通过只用三项测量来减少“无应力(off-stress)”时间。几乎所有 ...…

查看全部问答>

wince CLIST 使用

typedef struct Tag_PakeageData {         int len;         char *buf; }PakageData; CList< PakageData *,(PakageData *> m_ReciverBuf; PakageData *p_Data; m_ReciverBuf.AddTail(p_Data) ...…

查看全部问答>

请教高手smartphone 5.0中网络通讯程序出现12029错误如何调试,多谢!

是visual 2005环境        smartphone 5.0 hConnect = InternetConnect( hOpen,HostName, uc.nPort, NULL, NULL, INTERNET_SERVICE_HTTP, INTERNET_FLAG_NO_CACHE_WRITE, 0);         if(!hConnect) &n ...…

查看全部问答>

6.0内核启动问题

搞好了eboot,内核起到一半又不行了,还得麻烦朋友们帮忙看看: Download successful!  Jumping to image at 0x80101000 (physical 0xA0101000)... Waiting for host to connect... Got EDBG_CMD_JUMPIMG Got EDBG_CMD_CONFIG, flags ...…

查看全部问答>

求助,学习keil

小弟正在学习keil,用的片子是89e58rd2,现在想写程序,请问大家,用keil编程选择芯片时应选哪个?需要做什么修改啊?…

查看全部问答>

北京富盛星电子有限公司招聘信息

北京富盛星电子有限公司是一家集弱电工程设计、安装、服务为一体的工程公司。本公司多年来置身于市场经济的大潮,根植于信息产业的沃土,充分发挥人才、资金和技术优势,以其先进的技术、设备以及合理的价位、优质的服务在家居智能化、视频监控、防 ...…

查看全部问答>

ST-LINK2整天“NoDeviceConnected”真烦人

或者是“Can\'t halt the core”把IAR和KeilMDK整得都挂了N多次,每次都是用Win进程管理给关掉。用ULINK和JLINK都可以正常调试,客户又指定要ST-LINK2可以调试。香版给个说法!!!…

查看全部问答>

【请测试】STM32的ISP下载工具

谢谢武汉力源工程师的努力,现提供STM32的ISP下载工具给公众测试,请各位留下宝贵意见以便改进。请点击这里并找到“ST-STM-ISP STM32串口ISP下载程序”。…

查看全部问答>

MSP430 LaunchPad开发工具大调查

请大家踊跃投票哟,这个涉及到我们后面的活动和教程的开展情况哟,谢谢大家!…

查看全部问答>