linux-2.6.22.6分析(一)配置编译链接过程

驱动模块Makefile解析  作者:王劲南,华清远见嵌入式学院讲师。先看一下代码ifeq ($(KERNELRELEASE),)        KERNELDIR ?= /home/linux/linux-2.6.22.6        PWD := $(shell pwd)        modules:                $(MAKE) -C $(KERNELDIR) M=$(PW 阅读详情

开发板上电运行的第一段程序是u-boot,为了使用应用程序,u-boot要启动内核,并且由内核挂接根文件系统,下面以linux-2.6.22.6为例,分析内核的启动过程

 

首先从内核的配置过程开始,从根目录的说明文件可以知道

配置命令:make menuconfig

编译命令:make uImage

 

在配置过程会根据用户配置在根目录生成一个.config文件,里面描述了各种配置项是否编译、编译到内核还是编译为一个模块,格式如下:

CONFIG_XXX=y
CONFIG_XXX=m

=y表示将XXX编进内核

=m表示将XXX作为模块编译,使用时动态加载

以CONFIG_DM9000这个配置项为例,命令行中输入

grep “CONFIG_DM9000” * -nwR

可以发现CONFIG_DM9000存在于四个位置:

1、C源码

2、子目录Makefile

3、include/config/auto.conf

4、include/linux/autoconf.h

 

编译内核时,根据.config自动生成autoconf.h,autoconf.h中有一系列的宏,若定义为1,表示该配置项会被编译(但这里不能区分编译为模块还是编进内核),同时这些宏会提供给C源码使用

auto.conf内容与.config相似,在编译时被顶层Makefile包含,然后用于各级子目录Makefile,区分配置项编译为模块还是编进内核,在子目录Makefile中内容格式如下:

obj-y += xxx.o
obj-m += xxx.o

其中:

-y表示编进内核

-m表示编译为模块

如果要将两个配置项编入一个模块,可以这么写:

obj-m += c.o
c-objs := a.o b.o

最后a.c、b.o编译为a.o、b.o,a.o和b.o链接为c.ko

 

搜索编译对象 uImage,可以发现它位于arch/arm/Makefile中

zImage Image xipImage bootImage uImage : vmlinux

uImage依赖于vmlinux,同时这个文件中还有一个以后会用到的定义

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

 

在顶层目录Makefile中有以下定义

init-y		:= init/
init-y		:= $(patsubst %/, %/built-in.o, $(init-y))
#相当于init-y = init/built-in.o

drivers-y	:= drivers/ sound/
drivers-y	:= $(patsubst %/, %/built-in.o, $(drivers-y))
相当于drivers-y = drivers/built-in.o sound/built-in.o

net-y		:= net/
net-y		:= $(patsubst %/, %/built-in.o, $(net-y))
相当于net-y = net/built-in.o

libs-y		:= lib/
libs-y1		:= $(patsubst %/, %/lib.a, $(libs-y))
libs-y2		:= $(patsubst %/, %/built-in.o, $(libs-y))
libs-y		:= $(libs-y1) $(libs-y2)
相当于net-y = lib/lib.a lib/built-in.o

core-y		:= usr/
core-y		+= kernel/ mm/ fs/ ipc/ security/ crypto/ block/
core-y		:= $(patsubst %/, %/built-in.o, $(core-y))
相当于net-y = net/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

 

上面这些东西是vmlinux的依赖:

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

vmlinux : $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE
ifdef CONFIG_HEADERS_CHECK
	$(Q)$(MAKE) -f $(srctree)/Makefile headers_check
endif
	$(call if_changed_rule,vmlinux__)
	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost $@
	$(Q)rm -f .old_version

也就是说,uImage最终依赖于head-y、init-y、core-y、libs-y等等

 

通过一系列替换可以还原出链接命令,也可以通过命令行输入下面命令,在最后找到链接命令

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 ……

 

从链接命令可以看到

1、链接脚本是arch/arm/kernel/vmlinux.lds(链接脚本是根据vmlinux.lds.S生成的)
2、第一个链接的文件是arch/arm/kernel/head.o(源文件arch/arm/kernel/head.S)
 

从链接脚本可以知道,链接地址为:0xC0000000 + 0x0000800

 

 

 

Linux 的GCC的编译过程及方式 Linux下GCC越详细越好的啦 阅读详情

相关推荐

Linux | UBuntu22.04编译内核

Linux | UBuntu22.04编译内核

RobKing的博客 4394

程序的编译、链接、安装和运行

程序的编译过程,其实就是将我们编写好的C源程序翻译成CPU能识别和运行的二进制机器指令的过程。一个可执行文件通常由不同的的段构(section)成:代码段、数据段、BBS段、只读数据段等。每个section有一个section header来描述,包括段名、段的类型、段的起始地址、段的偏移地址和段的大小。一个可执行文件中的每一个section都有一个section header,将这些section headers集中放到一起,就是section header table,也就是节头表。

zr65685的博客 534

Linux 支持cuda的OpenCV编译安装与环境配置

Ubuntu中安装openCV3.4.12编译过程中与Anaconda冲突_编译opencv-4.6之前我安装了anaconda3,系统库的路径被覆盖掉-优快云博客。A1:需要将opencv_contrib中的modules中的cudev文件夹复制到opencv/modules里。A2: 先将anconda中冲突的库移到其他文件夹下,openCV编译完之后再移回来。A: 直接将https修改为http即可下载成功,如果一次不行可以多试几次。删掉opencv4.conf文件,再在你编译的文件夹下运行。

u013719171的博客 1998

linux-2.6.22.6分析——内核分析

入口: ENTRY(stext) msrcpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE @ 管理模式                                                @ 禁止中断 mrcp15, 0, r9, c0, c0                @ 获得cpu的ID bl__lookup_process

SHK242673的专栏 994

linux-2.6.22.6.tar.bz2

linux-2.6.22.6.tar.bz2

linux2.6内核编译方法详述

linux2.6内核编译方法详述 linux2.6内核编译方法详述

linux内核编译链接详解,【linux】内核make编译链接相关变量定义

欢迎转载,转载时请保留作者信息,谢谢。这些定义很重要,不阅读源代码是体会不到的,在阅读源代码时,看看这些定义,会事半功倍。链接文件:export KBUILD_LDS := arch/$(SRCARCH)/kernel/vmlinux.ldsPAGE_OFFSET:src\arch\arm\include\asm\memory.h : 内核地址空间 = CONFIG_PAGE_OFFSET, 3G...

weixin_34493096的博客 245

linux-2.6.22.6.tar

linux-2.6.22.6.tar为Linux内核文件,需要的下载使用,分享给同行。

程序的编译和链接过程

一.虚拟机、linux简介 简单介绍一下虚拟机还有就是各种操作系统,比如centos,Ubuntu 操作系统:linux(centos、Ubuntu、redhat),Android,Windows(xp、win8、win10) 进程,多个程序,分时技术,并行技术 一次打开多个程序,我们在只有一个cpu,如何让这些程序进行执行呢,看起来好像是在同时进行的,实际上是一个程序执行了一点点时间,然

NeilZhy 1074

Ubuntu22.04安装ROS2 —— ROS2 humble 详细图文教程

本文详细介绍了如何在Ubuntu22.04(Jammy)系统下配置ROS2环境,安装RO2软件包,并验证安装成功。ROS2的版本是Humble Hawksbill。:ROS是一个开源的,提供硬件抽象、设备驱动、库、工具和通信机制,支持模块化开发与集成,广泛用于机器人控制和自动化应用。ROS2 相较于 ROS1 在架构设计、通信机制和平台支持等方面做出了改进。ROS1 采用集中式主节点(Master)进行节点间通信,存在单点故障风险,且实时性和跨平台支持较弱。

weixin_49649078的博客 8813

SAP CKMLCP 月结7大常见报错:从“未找到成本核算运行”到“物料占用”的完整解决方案

本文深入解析SAP CKMLCP月结过程中的7大常见报错,从权限问题到数据一致性错误,提供系统化的解决方案。重点解决'未找到成本核算运行'和'物料占用'等典型问题,帮助财务人员高效完成成本核算月结,确保数据准确性。

weixin_30299709的博客 416

编译内核之启动流程分析

源码配置编译: 本文主要是针对linux-2.6.22.6来进行配置编译和源码的分析,这里韦老师已经做好补丁文件和配置文件,直接在此基础上进行配置编译 解压缩 tar xjf 压缩文件 打补丁 patch -p1 <补丁文件 (这里韦老师已经为我们做好了补丁文件) 配置 linux有两...

qq_35547417的博客 759

Ruoyi-Cloud集成Seata2.0实现分布式事务

在网络上,关于Spring Cloud和Ruoyi-Cloud整合Seata的教程有很多,针对不同版本的 Seata 也有不少相关教程。事实上,无论是 Spring Cloud 还是 Ruoyi-Cloud,其整合 Seata 的原理基本相同。这篇博文将详细介绍如何在本地开发环境下,在中实现Seata 2.0的整合,希望能为大家在分布式项目中实现 Seata 的整合提供实用的帮助,提供一个清晰的操作思路。

SR003的博客 2246

Kernel 2.6x 编译过程

      作者:北南南北   提要:在Kernel 2.6x和以前的版本的编译方法有点区别,所以就简单的把编译过程写出来,主要是帮助初学Linux的兄弟。    Kernle 2.6x 编译比较简单,最适合我等菜鸟!!    本文是以Redhat为例,内版本是2.6.0-test8    一、下载 http://www.kernel.org    二、解压    1.把下载好的内核放到/usr/

优快云_document的专栏 1万+

N32串口DMA接收不定长数据:空闲中断与DMA通道的协同处理

本文详细解析了在N32系列MCU中,利用串口空闲中断与DMA通道协同处理不定长数据的核心机制与实战方法。通过剖析空闲中断的触发时机、DMA的配置要点以及两者协同工作的关键时序,提供了避免数据错乱的避坑指南和完整的代码实现,旨在帮助开发者构建高效、可靠的嵌入式串口通信子系统。

weixin_29191669的博客 123

Miniconda3迁移(附图详细过程)

服务器上目录占满,想要将conda迁移到其他目录下的操作方法,详细教程。

2301_77554343的博客 6942

linux2.6.22内核编译,linux2.6内核编译方法详述

linux2.6内核成功编译1) 须要的工具:(1) 模块工具:modutils-2.4.21-23.src.rpm//负责加载模块,在2.4以前是不须要单独编译//模块存放位置:/lib/modules/内核版本目录/kernel/drivers//lsmod: 查看已经加载的模块(2) 源代码:linux-2.6.9.tar.gz//选择须要编译的部分: 最新内核2.6.9 支持NTFS分区(...

weixin_35662417的博客 345

高等数学/概率论/数理统计/线性代数/离散数学面试-核心概念-问题理解

特征值与特征向量是线性代数中的概念,它们与线性变换有关。在线性变换中,如果存在非零向量 v ,使得当该向量通过变换后,其方向不变,只是长度发生了变化,那么这个向量 v 就是特征向量。而这个长度变化的比例因子,即变换前后向量长度的比值,称为特征值。数学公式表示:通俗易懂的解释:想象一下,你有一个可以伸缩的橡皮筋,这个橡皮筋可以代表一个向量。现在,你有一个特殊的机器,它可以改变橡皮筋的形状,但不会改变它延伸的方向。当你把橡皮筋放入机器中,机器会拉伸或压缩橡皮筋,但橡皮筋的方向保持不变。

m0_64198455的博客 2292

Linux 2.6.34内核编译步骤

因为想使用26sec相关的东西,所以想下载个新版本的kernel玩玩。   基础知识:   uname -r   2.6.18-164.e15xen   [主版本].[次版本].[发布版本(release)]-[修改版本]      2    .   6    .     18            - 164   次版本为奇数是“测试性质的”如2.3, 2.5   次版本为偶数

终身学习的程序猿 7602

加密算法:深度解析Ed25519原理

在 Solana 开发过程中,我一直对 Ed25519 加密算法 如何生成公钥、签名以及验证签名的机制感到困惑。为了弄清这一点,我查阅了大量相关资料,终于对其流程有了更清晰的理解。在此记录实现过程,方便日后查阅。

盹猫的博客 1万+

Windows 11 安装 JDK 11:下载、安装、配置环境变量、验证

本文详细介绍了在 Windows 11 系统中安装 JDK 11 的完整流程,包括从 Oracle 官网下载压缩包、解压到自定义目录、配置 JAVA_HOME 与 Path 环境变量,并验证安装是否成功。文章还包含一个专为 JDK 11 新特性设计的测试程序,涵盖 Lambda 表达式 var 语法、HTTP 客户端 API、字符串增强方法等,帮助读者确认安装版本正确无误,适合初学者和需要多版本 JDK 共存的开发者参考。

寒水馨 · 轻量级技术文档 · hanshuixin.org 2781

Linux系统ubuntu22.04安装最新版的gcc13.1.0编译器,支持c++20、23

Linux系统ubuntu22.04安装最新版的gcc13.1.0编译器,支持c++20、23,本文全程上机实操,包含解决若干个问题,如下载包失败,执行代码/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.31' not found等

weixin_48617416的博客 2万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

linux2.6.22内核编译,[转]linux2.6内核编译方法详述

1) 需要的工具:(1) 模块工具:modutils-2.4.21-23.src.rpm//负责加载模块,在2.4之前是不需要单独编译//模块存放位置:/lib/modules/内核版本目录/kernel/drivers//lsmod: 查看已经加载的模块(2) 源代码:linux-2.6.9.tar.gz//选择需要编译的部分: 最新内核2.6.9 支持NTFS分区(只读)//查看现有系统支持的...

weixin_42522857的博客 185

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

linux 内核补丁编译,linux安装补丁及内核编译的过程

下面以当前版本为linux-2.4.22升级到linux-2.6.15.6为例,先从上下载一个源代码包和两个补丁文件,它们是linux-2.6.14.tar.bz2 patch-2.6.15.bz2 patch-2.6.15.6.bz2保存到/usr/src/下.具体步骤如下:1、释放内核源代码用tar命令释放内核源代码# cd /usr/src#tar -jxvf linux...

weixin_39612038的博客 661

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Linux2.6.18内核编译

一.环境 虚拟机:VMware Workstation6.5 操作系统:CRUX2.2 编译内核:linux-2.6.18 文件互传:iso镜像挂载 二.正文 1.  安装CRUX2.2 1.1 下载CRUX2.2的ISO镜像:http://crux.nu/Main/Download 1.2 创建linux2.6x内核的虚拟机,将硬盘设置为IDE格式 1.3 创建分区,...

diansegang3317的博客 342

ubuntu系统22.04结合openharmony系统6.0 适配编译过程中,尤其编译输出问题记录和解决 继续编译过程解决

摘要:在Ubuntu 22.04系统上编译OpenHarmony 6.0时遇到多个问题,主要包括:1) 编译阶段错误使用-shared标志;2) 空C++文件编译问题;3) C++标准库符号未定义错误。解决方案包括:创建合法的空C++文件,修正BUILD.gn配置添加标准库依赖,并彻底清理编译缓存。最终通过修改编译标志、添加必要的库依赖和清理缓存,逐步解决了这些编译问题。

dlj1656955044的博客 577
上一篇: u-boot-1.1.6分析(六)run_command
下一篇: linux-2.6.22.6分析(二)启动流程之第一阶段
floatinglong
博客等级 码龄9年 90粉丝 143原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值