Arm Linux交叉编译和连接过程分析(2)

二、编译内核镜像过程

1、编译过程中涉及到到文件:

/Makefile 编译产生顶层vmlinux镜像文件
/scripts/Kbuild.include    make过程中到一些基本定义
/scripts/Makefile.lib       编译内核时用到到函数库文件
/scripts/Makefile.build     内核编译到相关命令文件
/arch/arm/Makefile        这个是体系结构相关makefile文件
/arch/arm/Kconfig        内核编译到配置文件
/arch/arm/boot/Makefile 生成uImage,zImage,Image到编译文件
/arch/arm/boot/compressed/Makefile 生成最终vmlinux到编译文件
/arch/arm/mach-sep4020/Makefile SEP4020系统结构的编译文件
 

2、编译过程解析;

2.1 /include/linux/autoconfig.h的产生:

在顶层Makefile487行有相应的编译命令,这个就是把我们顶层的.config文件转变成相应的系统的autoconfig.h文件,而在/include/linux/config.h中有这么一句:
#include <linux/autoconf.h>
以后在c文件中会包含这个/include/linux/config.h头文件的,也即包含了linux/autoconf.h文件

2.2vmlinux的依赖关系

2.2.1在/Makefile中的298行
# We need some generic definitions
include  $(srctree)/scripts/Kbuild.include
包含了scripts/Kbuild.include文件,在这里定义了大量的函数和变量,供顶层makefile和其他makefile文件使用。 

 
2.2.2在顶层makefile文件的第175行,包含了arch/arm/Makefile。这个是体系结构相关makefile文件。它定义了体系结构相关的一些变量及规则。
下面这个地方将/arch/arm/Makefile文件引入
2.2.3当执行”make”时,arch/arm/Makefile中的499行的规则将是make遇到的第一个规则:
all:   vmlinux
export KBUILD_IMAGE ?= vmlinux(变量赋值)
2.2.4vmlinux目标的规则在顶层Makefile的第741行定义。
vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE
         $(call if_changed_rule,vmlinux__)
         $(Q)rm -f .old_version

2.2.5这里涉及到几个变量,先看看这几个变量的定义,前三个变量分别在顶层Makefile的605、606、608行定义。 
2.2.6其中head-y在arch/arm/Makefile中第72行定义,
head-y                := arch/arm/kernel/head.o arch/arm/kernel/init_task.o

2.2.7 init-y在顶层makefile的462行定义 

 
后又在第567行进行处理
init-y              := $(patsubst %/, %/built-in.o, $(init-y))
  这里的$(patsubst %/, %/built-in.o, $(init-y)) 这个语句就是将init/ 下的所有c文件编译成目标文件build-in.o
所以变量init-y应为
init-y              := init/built-in.o
因此
vmlinux-init := arch/arm/kernel/head$(MMUEXT).o arch/arm/kernel/init_task.o init/built-in.o
同理,其他几个变量也可通过类似方法进行分析,这里不一一分析了。
2.5vmlinux-init这个变量的产生构建规则在顶层Makefile 747行定义:
$(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ;
这里是一个空命令的规则。空命令行可以防止make在执行时试图为重建这个目标去查找隐含命令。其依赖为vmlinux-dirs,这个变量在顶层Makefile第561行定义:
这个变量指定了一系列要进入的下层目录。他的规则在顶层Makefile第757行定义
$(vmlinux-dirs): prepare scripts
       $(Q)$(MAKE) $(build)=$@
这里的两个依赖就不分析了,主要看一下这个规则的命令,build和$@变量展开后如下
       $(Q)$(MAKE) -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build  \
        obj =$(vmlinux-dirs)
这里会再一次进入scripts/Makefile.build执行82行规则
__build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \
        $(if $(KBUILD_MODULES),$(obj-m)) \
        $(subdir-ym) $(always)
       @:
 $(if $(KBUILD_BUILTIN),$(builtin-target))表示若KBUILD_BUILTIN定义了,则整个表达式为$(builtin-target)

因为KBUILD_BUILTIN在顶层Makefile 195行中被初始化为1,所以这个规则的依赖有一个builtin-target变量。这个变量在scripts/Makefile.build的77行定义
ifneq ($(strip $(obj-y) $(obj-m) $(obj-n) $(obj-) $(lib-target)),)
builtin-target := $(obj)/built-in.o
endif
(strip用法:strip <选项> 输入文件   作用:从文件中删除符号和节)
变量obj就是vmlinux-dirs变量指定的目录,这在前面说到的。所以这里会构建$(vmlinux-dirs)/built-in.o目标,在scripts/Makefile.build文件的251行开始,有这个目标的规则及命令的定义 
 
scripts/Makefile.build在第15行开始包含了vmlinux-dirs变量指定目录中的Makefile文件,在这些makefile文件中会指定obj-y变量,它指定的都是一些*.o目标文件,
这些*.o文件的生成方法由scripts/Makefile.build文件192行的模式规则指定
%.o: %.c FORCE
       $(call cmd,force_checksrc)
       $(call if_changed_rule,cc_o_c)
这个就是我们看到的编译各个目录下.o目标文件的过程,这个中间在182行中:
$(if $($(quiet)cmd_cc_o_c),echo '  $(call escsq,$($(quiet)cmd_cc_o_c))';)  \(其中的分号表示不显示命令执行)
这个就会在屏幕上输出编译的信息:
CC      net/ipv4/devinet.o
通过上面这一系列的步骤,就编译链接出由变量vmlinux-init指定的目标,vmlinux-main变量指定的目标的构建与此类似。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434552.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sipxecs简介

SipX和SipExchange的代码于2007年合并成SipXecs&#xff0c;北电和NTT等大公司参与构建SipXecs架构。SipXecs是电信级的&#xff0c;针对统一通信UC和呼叫中心Call Center应用&#xff0c;另外&#xff0c;支持设备批量升级&#xff0c;批量配置管理等应用&#xff0c;网管支持…

ASP.NET数据格式的Format-- DataFormatString

我们在呈现数据的时候&#xff0c;不要将未经修饰过的数据呈现给使用者。例如金额一万元&#xff0c;如果我们直接显示「10000」&#xff0c;可能会导致使用者看成一千或十万&#xff0c;造成使用者阅读数据上的困扰。若我们将一万元润饰后输出为「NT$10,000」&#xff0c;不但…

fortran转换 matlab代码,将Fortran77代码转换为Matlab代码以查找特征值/向量

我将Fortran 77中的书面代码转换为Matlab代码。该函数使用QL算法计算矩阵的特征值和特征向量。由于某些原因&#xff0c;我不能在matlab中使用eig函数的结果。这种方法得到的特征值与eig函数得到的特征值不一样&#xff0c;有些相同但有些不同。我不知道问题在哪里。感谢您的任…

linux内核中分配4M以上大内存的方法

在内核中, kmalloc能够分配的最大连续内存为2的(MAX_ORDER-1)次方个page(参见alloc_pages函数, "if (unlikely(order > MAX_ORDER)) return NULL;"), page的大小一般是4K bytes,MAX_ORDER缺省定义为11, 所以如果不修改内核, kmalloc能够分配的最大连续…

sql server 2008学习3 表组织和索引组织

表组织 表包含在一个或多个分区中&#xff0c;每个分区在一个堆或一个聚集索引结构包含数据行。堆页或聚集索引页在一个或多个分配单元中进行管理&#xff0c;具体的分配单元数取决于数据行中的列类型。 聚集表、堆和索引 SQL Server 表使用下列两种方法之一来组织其分区中的数…

BootLoader与Linux内核的参数传递

在嵌入式系统中&#xff0c;BootLoader 是用来初始化硬件&#xff0c;加载内核&#xff0c;传递参数。因为嵌入式系统的硬件环境各不相同&#xff0c;所以嵌入式系统的BootLoader 也各不相同&#xff0c;其中比较通用的是U-Boot&#xff0c;它支持不同的体系结构&#xff0c;如…

怎么跟踪php代码,第九节 PHP 跟踪调试代码 XDebug

>[success] # PHP 跟踪调试代码 XDebug- [下载XDebug扩展](https://xdebug.org/download.php)- 下载对应PHP版本的Xdebug![](https://box.kancloud.cn/c17f1f1e965522c2fe1411e1759e4447_870x524.png)- 线程安全(TS)和非线程安全(NTS)![](https://box.kancloud.cn/24efc18d4…

oracle经纬度换算成xy坐标,经纬度换算成xy坐标(经纬度转换xy坐标算法)

经纬度怎么转换成平面xy坐标&#xff1f;这里面的经纬度转换成xy坐标是多少&#xff1f;求解你把角度的单位设成度分秒制输入不久可以了。具体输入units命令&#xff0c;对话框中会有一个角度的单位制选择&#xff0c;包括度分秒制。例如绘制一条与当前点距离为100&#xff0c;…

Linux内核参数传递Tag

在2.4&#xff08;具体哪个版本记不清了&#xff09;以后的Linux内核中引入了一种新的向内核传递参数的方法tag标记。内核参数通过一个静态的tag链表在启动的时候传递到内核。每个tag的结构为 ----------- tag_header ----------- tag_xxx ----------- 其中tag_header为tag头&a…

ns学习资料

&#xff08;一&#xff09;. NS常用基本网站   1. Maillist个人觉得是寻求问题答案最好的地方。   http://mailman.isi.edu/pipermail/ns-users/   2. 柯老师的网站&#xff0c;包含很多非常实用资源&#xff1a;安装&#xff0c;trace文件分析&#xff0c;源代码分析&a…

Oracle备份standby,Oracle 11g 利用泠备份恢复standby库

Oracle 11g 利用泠备份恢复standby库1 开始在备库上进行泠备份先查好控制文件、redo、undo文件、数据文件的路径1.1 先关闭主库的归档日志传输SQL> ALTER system SETlog_archive_dest_state_2 DEFER;System altered.SQL>1.2 先关闭standby库SQL> shutdown immediate;D…

Linux内核参数的介绍

sysctl -a 可以列出当前所有的Linux内核参数。 /proc/sys/目录下的东西&#xff0c;对应着sysctl -a列出来的。 man 5 proc syscall 在 /arch/i386/kernel/entry.S里面列出来&#xff0c;这个看起来可能更方便

matlab单位阶跃响应与单位脉冲响应,python 已知响应函数求单位阶跃响应或脉冲响应...

最近学习自动控制原理&#xff0c;关于控制系统的一些&#xff0c;老师用布置了一些作业说要用matlab画&#xff0c;我试试python首先介绍一下所使用的库&#xff1a;control matplotlib sympy1.control库&#xff1a;用来计算脉冲响应与阶跃响应Paste_Image.png2.sympy&#x…

SQL SERVER 的SQL语句优化方式小结

SQL SERVER 的SQL语句优化方式小结详细出处参考&#xff1a;http://www.jb51.net/article/19547.htm 1、SQL SERVER 2005的性能工具中有SQL Server Profiler和数据库引擎优化顾问&#xff0c;极好的东东&#xff0c;必须熟练使用。 2、查询SQL语句时打开“显示估计的执行计划”…

u-boot向linux内核传递启动参数

U-BOOT 在启动内核时,会向内核传递一些参数.而这些参数是通过 structtag来传递的。 U-boot 把要传递给 kernel 的东西保存在 struct tag数据结构中&#xff0c;启动 kernel 时&#xff0c;把这个结构体的物理地址传给 kernel&#xff1b;Linux kernel通过这个地址分析出u-boot传…

$_server['php_self'] 漏洞,Discuz! $_SERVER['PHP_SELF'] XSS Vulnerability

在common.inc.php文件的69行&#xff1a;$PHP_SELF $_SERVER[PHP_SELF] ? $_SERVER[PHP_SELF] : $_SERVER[SCRIPT_NAME];$SCRIPT_FILENAME str_replace(\\\\, /, (isset($_SERVER[PATH_TRANSLATED]) ? $_SERVER[PATH_TRANSLATED] : $_SERVER[SCRIPT_FILENAME]));$boardurl …

【前端破解系列之一】一分钟教你破解下载虾米音乐

虾米音乐网站上有很多高品质的音乐和精心组织的精选集&#xff0c;但普通用户只能试听&#xff0c;不能下载&#xff0c;下载的话需要使用“米”&#xff0c;这个“米”除了极少数的新手任务可以获得之外&#xff0c;基本上都要靠付费来购买&#xff0c;很多人没有网银或者没有…

网络编程常用接口的内核实现----sys_listen()

listen()函数仅在TCP服务器端调用&#xff0c;它做两个事情&#xff1a;将套接字转换到LISTEN状态和设置套接上的最大连接队列。listen()对应的内核实现为sys_listen()&#xff0c;下面开始对其实现作具体的分析。 一、sys_listen()函数 sys_listen()的源码实现及分析如下所示…

linux查看启动配置文件内容,Linux开机启动项的查看和设置方法总结

一、查看开机自启项1.Centos7自启项查看方式从Centos6的chkconfig改为&#xff1a;systemctl list-unit-files2.用grep过滤查看&#xff0c;比如&#xff1a;查看启动项&#xff1a;systemctl list-unit-files | grep enable查看sshd服务自启动情况&#xff1a;systemctl list-…

sql SET DATEFORMAT对日期处理的影响

--1./*--说明SET DATEFORMAT设置对使用CONVERT把字符型日期转换为日期的处理也具有影响但不影响明确指定了style的CONVERT处理。--*/--示例 &#xff0c;在下面的示例中&#xff0c;第一个CONVERT转换未指定style&#xff0c;转换的结果受SET DATAFORMAT的影响&#xff0c;第二…