Exynos4412 内核移植(二)—— 内核编译过程分析

内核的编译同样是从Makefile 来分析:

一、内核源码结构

Linux内核文件数目近2万,出去其他架构CPU的相关文件,他们分别位于顶层目录下的17个子目录,各个目录功能独立,下面是常用目录:

arch:体系结构相关代码
ipc:进程调度相关代码
mm:内存管理
Documentation:帮助文档
net:网络协议
lib:库
scripts:编译相关脚本工具
tools:编译相关工具
drivers:设备驱动
fs:文件系统实现


对于ARM 架构的Exynos4412,其体系相关的代码在arch/arm/目录下,在后面进行的Linux移植时,开始的工作正式修改这个目录下的文件。


二、Linux Makefile分析

内核中的哪些文件将被编译?它们是怎样被编译的?它们连接时的顺序如何确定?那个文件在最前面?哪些文件或函数先执行?这些都是通过Makefile 来管理的。从最简单的角度来总结Makefile的作用,有以下3点:

1)-- 决定编译哪些文件;

2)-- 怎样编译这些文件?

3)-- 怎样连接这些文件,最重要的是它们的顺序如何?

Linux 内核源码中含有很多个Makefile文件,这些Makefile文件又要包含其他一些文件(比如配置信息、通用的规则等)。这些文件构成了 Linux 的Makefile 体系,可以分为下表中的5类:

名称描述
顶层Makefile他是所有Makefile文件的核心,从总体上控制内核的编译和链接
.config配置文件,在配置内核时产生。所有Makefile文件(包括顶层目录及各级子目录)都是根据.config来决定使用哪些文件
arch/$(ARCH)/Makefile对应体系结构的Makefile,它用来决定哪些体系结构相关的文件参与内核的生成,并提供一些规则来生成特定格式的内核映像
scripts/makefile.*Makefile公用的通用规则、脚本等
kbuild Makefiles各级子目录下的Makefile,他们相对简单,被上一层Makefile调用来编译当前目录下的文件


以下根据见面总结的Makefile 的3大作用分析这5类文件。

1、决定编译哪些文件

Linux内核的编译过程从顶层Makefile开始,然后递归地进入各级子目录调用他们的makefile,分为3个步骤:

a -- 顶层Makefile 决定内核根目录下哪些子目录将被编进内核;

b -- arch/$(ARCH)/Makefile 决定arch/$(ARCH)目录下哪些文件、哪些目录将被编进内核;

c -- 各级子目录下的Makefile决定所在目录下哪些文件将被编进内核,哪些文件将被编程模块(即驱动程序),进入哪些子目录继续调用它们的Makefile。


a -- 先看步骤a, 顶层Makefile的编译

在顶层Makefile 中可以看到如下内容:

可见,顶层Makefile将这14个子目录分为5类:init-y、divers-y、net-y、libs-y和core-y

我们可以看到,最重要的arch目录没有出现在内核中。它在arch/$(ARCH)/Makefile中被包含进内核,在顶层Makefile中直接包含了这个Makefile,如下所示:

对于ARCH变量,可以在执行make时传入,比如“make ARCH=arm ...”。另外,对于非X86平台,还需要指定交叉编译工具,这也可以在执行make 命令时传入,比如“make CROSS_COPILE=arm-linux- ..”。为了方便,常在顶层Makefile中进行如下修改这样执行make时就会将ARCH变量传入



b -- 看步骤 b,arch/$(ARCH)/Makefile的编译

对于步骤 b 的 arch/$(ARCH)/Makefile,以ARM为例,在arch/arm/Makefile 中可以看到如下内容:


从129行可知,除了刚面的5类子目录外,又出现了一类:head-y,不过它直接以文件名出现;

arch/arm/Makefile 中类似第268-273行的代码进一步扩展了core-y的内容,第276行扩展了libs-y的内容,这些都是体系相关的目录;第261-265行中的CONFIG_在配置内核时定义,它的值有3种:y、m或空。y表示编进内核,m表示编为模块,空表示不使用

编译内核时,将依次进入init-y、core-y、libs-y、drivers-y和net-y 所列出的目录中执行它们的Makefile,每个子目录都会生成一个 built-in.o(libs-y所列目录下,有可能生成lib.a文件)。最后,head-y所表示的文件将和在这些built-in.o、lib.a 一起被连接成内核映像文件 vmlinux


c -- 步骤 c 是如何进行的,各级子目录下的Makefile的编译

在配置内核时,生成配置文件.config。内核顶层Makefile使用如下语句间接包含.config 文件,以后就根据.config中定义的各个变量决定编译哪些文件。值所以说是“间接”包含,试音为包含的是include/config/auto.conf 文件,而它只是将.config文件中的注释去掉,并根据顶层Makefile中定义的变量增加一些变量而已。



2、怎样编译这些文件

即编译选项、连接选项是什么。这些选项分3类:全局的,适用于整个内核代码树;局部的,仅适用于某个Makefile中的所有文件;个体的,仅适用于某个文件。

全局选项在顶层Makefile和arch/$(ARCH)/Makefile 中定义,这些选项的名称为:CFLAGS、AFLAGS、LDFLAGS、ARFLAGS,他们分别是编译C文件的选项、编译汇编问价你的选项、连接文件的选项、制作库文件的选项。


3、怎样连接这些文件,它们顺序如何

前面分析有哪些文件要编进内核时,顶层Makefile和arch/$(ARCH)/Makefile定义了6类目录(或文件):head-y、init-y、drivers、libs-y 和 core-y。它们的初始值如下(以ARM体系为例)

arch/arm/Makefile 中:



顶层makefile 中:



可见,除head-y 外,其余的init-y、drivers-y等都是目录名。在顶层Makefile 中,这IE目录名的后面直接加上built-in.o 或 lib.a,表示要连接进内核的文件。


上面的patubst是个字符串处理函数,它的用法如下:

(patsubst pattern, replacement,text)

表示寻找“text”中符合格式“pattern”的字,用”replacement"替换它们。比如上面的init-y初值为“init/”,经过793行的交互后,“init-y” 变为“init/built - in.o”。


顶层Makefile中,再往下看:



对于ARM体系,连接脚本就是arch/arm/kernel/vmlinux.lds,它由 arch/arm/kernel/vmlinux/lds.S文件生成,先将生成的arch/arm/kernel/vmlinux.lds摘录如下:



总结:

a -- 配置文件.config 中定义了一系列的变量,Makefile将结合它们来决定哪些文件被编进内核、哪些文件被编进模块、涉及哪些子目录;

b -- 顶层Makefile和arch/$(ARCH)/Makefile决定根目录下哪些子目录、arch/$(ARCH) 目录下哪些文件和目录将被编进内核;

c -- 最后,各级子目录下的Makefile决定所在目录下哪些文件将被编进内核,哪些文件将被变成模块(即驱动程序),进入哪些子目录继续调用它们的Makefile;

d -- 顶层Nakedfile和arch/$(ARCH)/Makefile设置了可以影响所有文件的编译、连接选项:CFLAGS、AFLAGS、LDFLAGS、ARFLAGS;

e -- 顶层Makefile按照一定的顺序组织文件,根据连接脚本 arch/$(ARCH)/kernel/vmlinux.lds生成内核映像文件vmlinux。

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

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

相关文章

深入理解Java:注解(Annotation)

2019独角兽企业重金招聘Python工程师标准>>> 一、概述 1.什么是注解(Annotation) Annotation(注解)就是Java提供了一种元程序中的元素关联任何信息和着任何元数据(metadata)的途径和方法。Ann…

Exynos4412 内核移植(三)—— 内核启动过程分析

内核启动所用函数如下: 与移植U-Boot 的过程相似,在移植Linux 之前,先了解它的启动过程。Linux 的过程可以分为两部分:架构/开发板相关的引导过程、后续的通用启动过程。对于uImage、zImage ,它们首先进行自解压得到vmlinux &…

开源自己用python封装的一个Windows GUI(UI Automation)自动化工具,支持MFC,Windows Forms,WPF,Metro,Qt...

首先,大家可以看下这个链接 Windows GUI自动化测试技术的比较和展望 。 这篇文章介绍了Windows中GUI自动化的三种技术:Windows API, MSAA - Microsoft Active Accessibility, UIAutomation 用脚本语言AutoIT实现自动化就是第一种技术Windows API, 查找窗…

Exynos4412 Uboot 移植(六)—— 相关知识补充

Uboot版本:u-boot-2013.01 一、gd结构体的定义与使用 gd_t 和 bd_t 是u-boot中两个重要的数据结构,在初始化操作很多都要靠这两个数据结构来保存或传递。 gd_t 定义在/u-boot-2013.01/arch/arm/include/asm/global_data.h bd_t 定义在 ./include/asm-ar…

Exynos4412 Uboot 移植(五)—— Uboot 移植过程

Uboot 版本:u-boot-2013.01 开发板:FS_4412 平台(Exynos4412,可以根据自己的板子修改,只要是4412的过程都是一样的) 一、建立自己的平台 1、下载源码 我们可以在下面这个网站上下载最新的和以前任一版本的uboot ftp://…

Nagios 安装及常见错误

一、实验环境监控服务器(nagios服务器--192.168.1.100)CentOS5.4 nagios-3.2.1 nagios-plugins-1.4.14 nrpe-2.12被监控客户端(linux客户端--192.168.1.200)CentOS5.4 nagios-plugins-1.4.14 nrpe-2.12二、nrpe插件1、nrpe插…

Exynos4412 Uboot 移植(四)—— Uboot引导内核过程分析

bootloader 要想启动内核,可以直接跳到内核的第一个指令处,即内核的起始地址,这样便可以完成内核的启动工作了。但是要想启动内核还需要满足一些条件,如下所示: 1、cpu 寄存器设置 * R0 0 * R1 机器类型 id …

Exynos4412 Uboot 移植(三)—— Uboot添加自定义命令

Uboot添加自定义命令:uboot中的命令使用U_BOOT_CMD这个宏声明来注册进系统,链接脚本会把所有的cmd_tbl_t结构体放在相邻的地方。 UBoot版本:u-boot-2013.01 一、U-Boot命令的格式 即使是内核的启动,也是通过U-Boot命令来实现的。…

Exynos4412 Uboot 移植(二)—— Uboot 启动流程分析

uboot启动流程分析如下: 第一阶段: a -- 设置cpu工作模式为SVC模式 b -- 关闭中断,mmu,cache v -- 关看门狗 d -- 初始化内存,串口 e -- 设置栈 f -- 代码自搬移 g -- 清bss h -- 跳c 第二阶段 a -- 初始化外设,进入超…

Linux内核学习四库全书

http://blog.csdn.net/21aspnet/article/details/6585602 关于内核学习我建议不要上来就读内核而是先了解内核的构成和特性,然后通过思考发现疑问这时再去读内核源码。即先了解概貌在读局部细节。而且内核分成好多部分,不要只是按照顺序去读,…

Exynos4412 Uboot 移植(一)—— Uboot 编译流程分析

Uboot 所用版本 u-boot-2013.01 u-boot-2013.01 中有上千文件,要想了解对于某款开发板,使用哪些文件、哪些文件首先执行、可执行文件占用内存的情况,最好的方法就是阅读它的Makefile。 根据顶层Readme文件的说明: 可以知道如果使…

Exynos4412 所用内存 —— DDR2

一、SDRAM 二、DDR 三、DDR2 四、DDR2的配置

Exynos4412启动过程分析

学习Exynos4412启动流程前,我们先看看三星4412芯片启动框图: 我们从图中可以看到4412内部有64K的ROM和256K SRAM,在ROM中已经固化好了一段代码,当硬件上电后首先运行的就是这段代码,这段代码三星起名为BLO(…

Exynos4412 所用外存 —— eMMC

Exynos4412所用外存不是原来的Nand Flash 与 Nor Flash,而是eMMC。eMMC是什么呢?和Nand Flash有什么区别呢? 一、eMMC概述 eMMC(Embeded MultiMedia Card):它并非是一种全新尺寸的存储卡,而…

mini-uboot 启动过程简单分析

单片机有最小系统,所谓最小系统,就是单片机能正常工作所需要的最少外设。对于Uboot来说,同样有个最小系统,因为Uboot最主要的功能就是引导内核。下面我们通过一个简单的Mini-Uboot来分析Uboot的启动加载过程。(只是分析…

MySql中的varchar类型

2019独角兽企业重金招聘Python工程师标准>>> MySql中的varchar类型(转) 今天新开始的项目在做数据库设计,发现自己对MySql的varchar类型还不熟悉,故又上网收集资料整理如下。 1.varchar类型的变化 MySQL 数据库的va…

进入保护模式(三)内存的分页

2019独角兽企业重金招聘Python工程师标准>>> 一、分页 先入为主理解的分页和系统中内存内应的分页 1.弄过数据库数据查找展示,有个数据分页展示的概念,这个的目的是为了速度、和展示效果上的提升 2.内存的分页又是怎么回事哪? …

C#实现简单的 Ping 的功能,用于测试网络是否已经联通

1 /// <summary>2 /// 是否能 Ping 通指定的主机3 /// </summary>4 /// <param name"ip">ip 地址或主机名或域名</param>5 /// <returns>true 通&#xff0c;false 不通</returns>6 …

Binutils工具集 解析

对于嵌入式系统开发&#xff0c;掌握相应的工具至关重要&#xff0c;它能使我们解决问题的效率大大提高。目前&#xff0c;可以说嵌入式系统的开发工具是GNU的天下&#xff0c;因为来自GNU的GCC编译器支持大量的目标处理器。除了GCC&#xff0c;还有一个非常重要的、同样来自于…

ARM 软中断指令SWI

前面我们学习ARM工作模式中&#xff0c;处理器模式切换可以通过软件控制进行切换&#xff0c;即修改CPSR模式位&#xff0c;但这是在特权模式下&#xff0c;当我们处于用户模式下&#xff0c;是没有权限实现模式转换的。若想实现模式切换&#xff0c;只能由另一种方法来实现&am…