bzImage是怎么来的

内核映像的形成——制作bzImage 2.2.6制作bzImage<br />回到顶层Makefile的849行,随着vmlinux的链接工作结束,在主目录下生成了vmlinux文件,vmlinux目标也就结束了。那么就会来到arch/x86/Makefile的155行bzImage目标。看到这个目标,就知道后面的工作就算打包压缩vmlinux并制作bzImage了。看到156行,因为CONFIG_X86_DECODER_SELFTEST没有设置,所以会直接执行159行以后的命令:<br />159        $(Q)$(MAKE) $(b 阅读详情
 

以x86架构32位机为例,即i386

 

从经典的helloworld程序开始

理解程序的编辑、编译、连接、运行的四个阶段

内核也是使用gcc、ld等工具编译连接出来的,并没有什么神秘之处

只不过文件繁多,代码树庞大而已,超出了大多数人的理解范围

就好像一般人对支配几千或几万块钱还是没有问题的

但是若突然让其支配上亿元时,一般人都是没有概念的

 

使用的工具make、gcc、ld、objdump、readelf、nm、objcopy、gzip等

一些程序的具体参数可以使用man查看具体含义

 

简单的浏览一下Documentation/kbuild目录中的几个文件

这几个文件介绍了内核的构建系统、Makefile的组织层次和一些特殊的命令等

阅读make的手册,了解基本的目标规则

 

编译之前先敲下make help,了解内核提供的一些参数

通过V=1参数显示具体的编译命令

 

内核在编译之前利用Kbuild系统提供的config机制解析各目录的Kconfig文件以便对内核进行剪裁

以make menuconfig为例

由顶层的Makefile开始匹配目标文件%config

解决完一些依赖后会进入scripts/kconfig目录执行子make

匹配scripts/kconfig/Makefile中的menuconfig目标

其依赖为scripts/kconfig/mconf小程序

编译出小程序mconf后,便运行该程序解析各个Kconfig文件

提供一个配置接口

配置完成后mconf便会在顶层目录生成一个.config文件

在编译内核的时候使用该.config文件生成

auto.conf供Makefile决定编译哪些目录

autoconf.h供代码预处理

这也是config机制的2个主要作用

 

使用make的- n、-p选项查看编译命令、变量等

以make bzImage为例

使用内核Makefile提供的参数V=1屏蔽@以便查看编译使用的参数和命令等

 

顶层的Makefile定义一些常用的变量、目录信息等

会包含对应架构下的目录下的Makefile,如arch/x86/Makefile

这样便找到目标bzImage,其依赖为顶层Makefile里的目标vmlinux

 

看下vmlinux的依赖$(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) vmlinux.o $(kallsyms.o) FORCE

1. vmlinux.lds为对应架构的连接脚本,由arch/x86/kernel/vmlinux.lds.S生成

2. $(vmlinux-init)和$(vmlinux-main) 即各个.o与built-in.o文件

3. 这些vmlinux所依赖的.o目标文件由这2条规则

$(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ;

$(vmlinux-dirs): prepare scripts

$(Q)$(MAKE) $(build)=$@

通过命令make -f scripts/Makefile.build obj=XXX/XXX编译所有的目录和子目录

总目录的控制由顶层Makefile定义

各个子目录的控制由其所在总目录下的Makfile和scripts/Makefile.lib控制

$(subdir-ym):

$(Q)$(MAKE) $(build)=$@

编译具体代码时都是使用scripts/Makefile.build这个Makefile

各个目录的built-in.o由对应目录下的.o文件连接而成

4. 顶层Makefile的目标vmlinux由rule_vmlinux__ => cmd_vmlinux__中的命令连接而成

 

5 . 解决完依赖vmlinux后

便执行arch/x86/Makefile中的目标bzImage的命令

make -f scripts/Makefile.build obj=arch/x86/boot arch/x86/boot/bzImage


6. 匹配arch/x86/boot/Makefile中的

规则$(obj)/bzImage: $(obj)/setup.bin $(obj)/vmlinux.bin $(obj)/tools/build FORCE

依赖2个2进制文件setup.bin和vmlinux.bin

 

7. 使用连接脚本arch/x86/boot/setup.ld生成setup.elf

setup.elf中的.o目标也在arch/x86/boot/Makefile中定义

使用objcopy得到依赖setup.bin

 

8. 含有压缩映像的arch/x86/boot/compressed/vmlinux

由顶层Makefile得到的vmlinux经objcopy得到arch/x86/boot/compressed/vmlinux.bin

使用gzip压缩vmlinux.bin得到vmlinux.bin.gz

使用arch/x86/boot/compressed/mkpiggy小程序得到arch/x86/boot/compressed/piggy.S

由arch/x86/boot/compressed/piggy.S经gcc编译后得到piggy.o

使用连接脚本arch/x86/boot/compressed/vmlinux.lds连接head_32.o、解压代码、…、piggy.o等

得到arch/x86/boot/compressed/vmlinux

 

9. 目标vmlinux.bin则会依赖arch/x86/boot/compressed/vmlinux

即需要先得到含有压缩过的vmlinux映像的连接合成文件

然后使用objcopy得到arch/x86/boot/vmlinux.bin

 

10. 最后使用小程序arch/x86/boot/tools/build将setup.bin和vmlinux.bin合并为bzImage

 

详细的注释请参考git://github.com/kernel-digger/linux-2.6.git

错漏之处还望不吝指出

uImage,zimage,bzimage,vmlinux,vmlinuz <br />在网络中,不少服务器采用的是Linux系统。为了进一步提高服务器的性能,可能需要根据特定的硬件及需求重新编译Linux内核。编译Linux 内核,需要根据规定的步骤进行,编译内核过程中涉及到几个重要的文件。比如对于RedHat Linux,在/boot目录下有一些与Linux内核有关的文件,进入/boot执行。 <br />  编译过RedHat Linux内核的人对其中的System.map、vmlinuz、initrd-2.4.7-10.img印象可能比较深刻,因为编译内核过程中涉及到这些 阅读详情

相关推荐

Linux内核镜像文件(bzImage)

bzImage是一个编译后生成的Linux内核镜像文件,可用于配合BusyBox制作嵌入式Linux根文件系统。

读核感悟-kbuild系统-make bzImage的过程

文章来源:http://www.top-e.org/jiaoshi/class/ 从以上例子中可以看到,内核的编译系统kbuild是个很庞大的系统。但是,它所使用的make和我们平时用的make是一模一样的。kbuild只是通过预定义一些变量(obj-m,obj-y等等)和目标(bzImage ,menuconfig等等),使内核的编译和扩展变得十分方便。我们不妨yy一下kbuild的一些

李亚锋老师 4052

ICDAR数据集简介

ICDAR(文档分析与识别国际会议)是OCR领域的权威会议,每两年发布一次数据集,专注于‌自然场景文本检测与识别‌,涵盖多语言、复杂版式和真实环境挑战。街景、广告牌、票据、手写文档等真实场景图像。包含水平、垂直、倾斜、弯曲文本,背景干扰大,部分文本存在遮挡或模糊。提供文本位置坐标(矩形/四边形框)及内容,无法识别的文本标记为###。以上总结提炼了ICDAR的核心价值与应用方法论。给出最佳实践方法是官网数据预训练模型 + 业务数据微调(比如用PPOCRLabel标注100+张业务图)。

xinghaitao2005的博客 1117

启动镜像bzImage的前世今生

bzImage的编译过程

RichardYSteven的专栏 7857

STM32CubeIDE入坑指南

一 前言 在科技日新月异的今天,作为从事效率为先的苦逼 IT 行业,秉承着我不入地狱谁入地狱的伟大革命精神,我决定再一次做第一个吃螃蟹的人,通过自身的入坑过程,为大家测试STM32CubeIDE这款新式工具。(其实是为了我能省点时间,快点做完项目,多挣点钱买几瓶肾气丸) 二 看一看别人是如何入坑的 二 手把手带你入坑 三 相关资料 ...

CH的博客 1万+

linux内核 生成bzImage (纯操作步骤)

解压 进入目录 安装 ncureses界面库 这是一个终端的图形界面库,补充gui,在terminal配置等等。ncurses是专门的界面库,用于之后配置内核文件。 切换管理员模式,否则不能进去图形界面。 make menuconfig显示图形界面菜单。 通过多个选项,诸如 [*]: 勾选编译进内核 [M]: 编译成可选项。在需要时再加入内核 [ ]: 不编译 当前选择了如下: 64位内核...

DarkZer00o的博客 2665

ZYNQ出现问题及解决办法汇总(一直更新)

问题目录使用软件及开发板版本一,vitis在build project时卡住。二,Could not find FPGA device on the board for connection 'Local'三,FPGA configuration failed:DONE PIN is not high四,Could not find ARM device on the board for connection 'Local' 使用软件及开发板版本 开发板:MZ7XA-7020 软件:vitis2020.2(

qq_45057368的博客 1万+

内核 bzimage 的生成方式

转:https://blog.youkuaiyun.com/RichardYSteven/article/details/52395737 在编译kernel的时候,会编译出一个bzImage的文件,据说这个是可以引导的文件? 在编译kernel的时候,会编译出一个bzImage的文件,据说这个是可以引导的文件? 恩,关于这个问题,昨天我还真好好看了一下,发现还真是。玩了内核这么多年,一直都以为是根目录下的那...

老鹰不捉小鸡 2412

手把手教你用STM32单片机DIY一个简易PLC(附完整电路图与PCB文件)

本文详细介绍了如何利用STM32单片机DIY一个简易PLC控制器,涵盖硬件设计、电路图解析、PCB布局优化及固件框架实现。通过完整的电路图和PCB文件,帮助读者从元器件选型到工业级优化,逐步构建可靠的PLC系统,特别适合工业自动化爱好者和学习者实践。

weixin_42527160的博客 570

Spring AI 实战:如何使用 MCP Server 搭建 MCP 天气查询服务

MCP(Model Context Protocol)是 Anthropic 提出的一种开放协议,它定义了AI 模型与外部世界交互的标准方式。通俗地说:大模型本身只拥有训练数据中的知识,它不知道今天的天气、无法查询你的数据库、不能调用你的内部 API。MCP 就是解决这个问题的"桥梁"——它让模型能够发现并使用外部工具(Tools),就像人用手去操作工具一样。角色职责对应依赖MCP Server暴露工具(Tool),供模型调用MCP Client连接 Server,让模型发现和使用工具本文我们先聚焦。

SmartSi 756

Linux内核构建之bzimage

转载于 https://book.2cto.com/201309/33428.html 组合的规则定义在平台的“顶层”Makefile中: /arch/x86/Makefile: boot := arch/x86/boot ... KBUILD_IMAGE := $(boot)/bzImage ... bzImage: vmlinux ... $(Q)$(MAKE) $(build)=...

一点点 4863

Python 爬虫实战:去哪儿网机票价格爬取与出行比价分析

本文介绍了一个基于Python的机票价格监控系统,通过爬取去哪儿网数据实现多航线查询与智能比价。系统采用requests+BeautifulSoup+selenium技术栈,具备以下功能: 实时查询指定航线价格 历史价格追踪与分析 最低价推荐与价格预警 数据可视化展示 文章详细解析了去哪儿网的页面结构和反爬机制,提供了Selenium浏览器的完整配置方案,并实现了一个可稳定运行的机票采集爬虫。该系统能帮助用户掌握价格波动规律,选择最优购票时机,每年可节省可观的出行成本。

u014481728的博客 668

vmlinux,zImage,bzImage,vmlinuz,uImage,关系

<br /> 本文转自   http://blog.youkuaiyun.com/maojudong/archive/2009/05/13/4178118.aspx<br /> <br />zImage和uImage的区别<br />一、vmlinuz<br />vmlinuz是可引导的、压缩的内核。“vm”代表“Virtual Memory”。Linux 支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制。Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。<br />vmlinuz的建立有两

需求导向<=问题导向!本质导向!结果导向! 2931

AI故障预测系统架构设计:5个核心模块+3种主流架构,收藏这篇就够了

深夜11点,某汽车工厂的生产线突然停机——核心机器人的轴承磨损过度导致卡壳。维修人员连夜抢修,直接损失超过50万元,还延误了客户的交货期。传统的“事后维修”或“定期维护”要么代价高昂,要么防不胜防。AI故障预测系统的出现,让“精准维护”成为可能——它能通过传感器数据提前7-30天预警故障,将停机损失降低80%以上。知道要做故障预测,却不知道怎么搭系统——数据怎么采集?特征怎么提取?模型怎么部署?架构怎么选?本文将解决这些问题:我们会拆解AI故障预测系统的5个核心模块,分析3种主流架构。

AIGC应用创新大全的博客 1019

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Linux下解压bzImage为vmlinux

一、首先,简单介绍 几种linux内核文件的区别         vmlinux--编译出来的最原始的内核文件,未压缩。         zImage--是vmlinux经过gzip压缩后的文件。         bzImage--bz表示“big zImage”,不是用bzip2压缩的,而是要偏移到一个位置,使用gzip压缩的。两者的不同之处在于,zImage解压缩内核到低端内存(第一个

swrd 3272

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

zImage和bzImage的区别

bzImage和zImage的区别来自于保护模式代码的放置位置:1.众所周知,内核映像包括两部分代码:实模式代码和保护模式代码,当引导装载器装载内核映像到代码段内存时,分别放置实模式代码和保护模式代码到不同的位置,然后进入实模式代码执行,实模式代码执行中转入CPU保护模式,开始执行32位保护模式代码。2.不管是zImage还是bzImage,他们的实模式代码部分都被装入0x9000:0000(

DanXer的Linux专栏 4671

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

bzImage、zImage

bzImage和zImage的区别来自于保护模式代码的放置位置: 1.众所周知,内核映像包括两部分代码:实模式代码和保护模 式代码,当引导装载器装载内核映像到代码段内存时,分别放置实模式代码和保护模式代码到不同的位置,然后进入实模式代码执行,实模式代码执行中转入CPU 保护模式,开始执行32位保护模式代码。 2.不管是zImage还是bzImage,他们的实模式代码部分都被装入0x9000:

win9 2808

vmlinux,vmlinuz,bzimage,zimage,initrd.img的区别与联系

1.vmlinux      vmlinux是未压缩的内核, vmlinux 是ELF文件,即编译出来的最原始的文件。用于kernel-debug,产生system.map符号表,不能用于直接加载,不可以作为启动内核。只是启动过程中的中间媒体。 vmlinux.bin : The same as vmlinux, but in a binary file format. 2.v

从菜鸟到菜菜鸟 1333

bzImage解压缩

bzImage诚如其名是big image的意思,不是压缩的image。 这里解压,采取的是半解压方式。 BzImage可能有两种,一种只有小量kernel,一种是小量kernel+initramfs。我解压缩针对initramfs bzImage的头部有些验证码,所以解压缩的时候需要去掉。 对于bzip2压缩的initramfs,参考1 对于gunzip压缩的initramfs,参考2

anzhuangguai的专栏 6697

bzImage与vmlinux

在kernel编译中,我们得到了bzImage和vmlinux两个kernel Image文件。在O'Reilly的《Building Embeded Linux System》一书中,对这两个的区别说得很含糊。只是说bzImage是压缩的kenel Image,vmlinux是未压缩的kernel Image。但是vmlinux经过压缩可作为vmlinuz。在桌面linux的/boot目录下面我

gudujianjsk的专栏 1715

vmlinux,vmlinuz,bzimage,zimage,initrd.img uimage的区别与联系

1.vmlinux      vmlinux是未压缩的内核, vmlinux 是ELF文件,即编译出来的最原始的文件。用于kernel-debug,产生system.map符号表,不能用于直接加载,不可以作为启动内核。只是启动过程中的中间媒体。 vmlinux.bin : The same as vmlinux, but in a binary file format. vmlin

fenggui的专栏 1255

bzImage的来历

//linux顶层Makefile定义的默认目标 all: vmlinux //vmlinux的依赖 vmlinux: scripts/link-vmlinux.sh autoksyms_recursive $(vmlinux-deps) FORCE +$(call if_changed_dep,link-vmlinux) //vmlinux-deps的定义 vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_OBJS) $(KBUILD...

714

zImage、bzImage、uImage、vmlinuz、vmlinux

zImage: gzip压缩的内核镜像文件,最大只能512KB bzImage: 也是gzip压缩的内核镜像文件,但是没有zImage的512KB大小限制 这两种内核镜像都是用gzip压缩的,在镜像文件头部都带有解压代码 zImage和bzImage的不同: 1、内核镜像包含着实模式代码和保护模式代码,前者使用的是物理地址,后者使用虚拟地址,上电后默认工作在实模式,准备就绪后再进入保护模式 2、两种镜像的实模式代码都是加载到0x90000地址处 3、zImage的保护模式代码加载到0x100

Tyson2462的博客 937

vmlinuz 文件解压缩(zImage|bzImage)

先简单说明下 vmlinux 和 vmlinuz 的关系 vmlinux是一个包含linux kernel的静态链接的可执行文件,文件类型是linux接受的可执行文件格式之一(ELF、COFF或a.out)。 vmlinuz是可引导的,压缩的linux内核,“vm”代表的“virtual memory”。vmlinuz是vmlinux经过gzip和objcopy(*)制作出来的压缩文件。vmlinuz不仅是一个压缩文件,而且在文件的开头部分内嵌有gzip解压缩代码。所以你不能用gunzip 或 gzip –

小单的博客专栏 6673
上一篇: 对计算机程序模型的理解
下一篇: Linux内核加载过程
kernel_digger
博客等级 码龄15年 18粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值