ELF 文件和 Linux 内核镜像文件

bash 复制代码
m@m-ThinkPad-T14-Gen-2i:~/chy/linux-6.18.5/arch/arm64/boot$ file Image
Image: Linux kernel ARM64 boot executable Image, little-endian, 4K pages

m@m-ThinkPad-T14-Gen-2i:~/chy/busybox-1.36.1/_install/bin$ file busybox 
busybox: ELF 64-bit LSB executable, ARM aarch64, version 1 (GNU/Linux), statically linked, BuildID[sha1]=1c93cc9354e5fb781e3275078645b4b4433a090e, for GNU/Linux 3.7.0, stripped

m@m-ThinkPad-T14-Gen-2i:~/chy/linux-6.18.5$ file vmlinux
vmlinux: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), statically linked, BuildID[sha1]=beec8d7a606f6a96c69a8bb96002ae323fceb7e7, with debug_info, not stripped

编译 Linux 时,默认情况下是一个名为 Image 的二进制文件,我们约定将其称为"内核镜像文件"。通过 file 查看他的类型,发现与平常的 ELF 文件不同。同时,我们发现与"内核镜像文件"一同产生了一个名为 vmlinux 的文件,他正是一个 ELF 文件。

ELF 文件和内核镜像文件有本质的区别,也有紧密的联系。ELF 文件是给操作系统看的,其中包含 ELF Header, Program Headers, Section Headers 等元数据。linux 的 exec 系统调用能解析 ELF 文件,把其中的数据和代码加载到内存中以待运行。内核镜像文件是给 bootloader 看的,他的内容只是扁平的二进制数据,或者说遵循一个很简单的数据格式,bootloader 不用做太多解析的工作,直接把他 copy 到内存中就能跑。

上面提到 vmlinux 也是编译内核的产物之一,并且是一个 ELF 文件。其实他是内核镜像文件的来源。编译过程中使用 objcopy 工具将 vmlinux 进行转储(进行了文件类型的转换),生成了更简单的内核镜像文件。

相关推荐
t5y224 小时前
【Linux】定时任务调度
linux·服务器
HY小海5 小时前
【Linux】进程概念
linux·运维·服务器
王八八。5 小时前
linux后台java、postSQL部署命令
java·linux·运维
瑞熙贝通实验室综合管理平台5 小时前
实验动物管理系统|以痛点为核心 构建动物房数字化管理新体系
linux
黄筱筱筱筱筱筱筱8 小时前
LINUX-防火墙
linux·服务器·网络
сокол8 小时前
【网安-Web渗透测试-靶场系列】AWD-Platform(ctf-hub)
linux·服务器·ubuntu·网络安全·docker
utf8mb4安全女神9 小时前
Linux系统服务相关命令【定时任务设置】【任务进程管理】【防火墙区域应用】
linux·运维·服务器
观浩10 小时前
使用Obsidian和IDEA搭建个人知识库
经验分享·笔记·学习方法
一个人旅程~10 小时前
如何避免在使用win安装U盘启动macbook时候出现键盘触摸板卡死的问题
windows·经验分享·macos·电脑
不吃土豆的马铃薯12 小时前
Spdlog 进阶:日志基本控制、日志格式控制、异步记录器
linux·服务器·开发语言·前端·c++