Linux内核启动流程分析

发表于:2014-7-16 10:10

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:李彦龙    来源:51Testing软件测试网采编

  make前grep "CONFIG_DM9000" -nr .
  ①Makefile,如obj-$(CONFIG_DM9000) += dm9000.o(在auto.conf中定义)
  ②config文件,如CONFIG_DM9000=y
  ③.c文件,如if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
  make后增加
  ④include/config/auto.conf,如CONFIG_DM9000=y(来源.config)
  ⑤include/linux/autoconf.h,如#define CONFIG_DM9000 1(自动生成,被③利用,来源.config)
  显然auto.conf应被最顶层Makefile包含
  ——————/
  Documentation/kbuild/makefiles.txt应看看,讲的较透彻
  obj-y += abc.o
  abc-objs := a.o b.o c.o
  ——————/
  执行make uImage命令,但顶层Makefile中无uImage目标,但arch/arm/Makefile中有,故肯定被包含
root@lyl:/home/linux-2.6.22.6# vi Makefile
include $(srctree)/arch/$(ARCH)/Makefile
-include include/config/auto.conf
——————/
uImage: vmlinux
vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE //顶层Makefile
vmlinux-init := $(head-y) $(init-y)
vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)
vmlinux-all := $(vmlinux-init) $(vmlinux-main)
vmlinux-lds := arch/$(ARCH)/kernel/vmlinux.lds
head-y := arch/arm/kernel/head$(MMUEXT).o arch/arm/kernel/init_task.o //架构相关Makefile
  一步步分析,获得首文件及链接脚本,但该法太繁琐
  ——————/
  root@lyl:/home/linux-2.6.22.6# rm vmlinux
  root@lyl:/home/linux-2.6.22.6# make uImage V=1
  arm-linux-ld -o vmlinux -T arch/arm/kernel/vmlinux.lds arch/arm/kernel/head.o arch/arm/kernel/init_task.o init/built-in.o ……
  结论:
  链接脚本arch/arm/kernel/vmlinux.lds(编译时生成)
  首文件arch/arm/kernel/head.o
root@lyl:/home/linux-2.6.22.6# vi arch/arm/kernel/vmlinux.lds
SECTIONS
{
. = (0xc0000000) + 0x00008000; //链接地址
.text.head : {
_stext = .;
_sinittext = .;
*(.text.head) //首先放所有文件的.text.head段,而所有文件的顺序为arm-linux-ld时顺序
}
——————/
theKernel(0,机器id,参数入口地址) //u-boot
//arch/arm/kernel/head.S
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号