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 进行转储(进行了文件类型的转换),生成了更简单的内核镜像文件。

相关推荐
Sheffield1 小时前
Docker的跨主机服务与其对应的优缺点
linux·网络协议·docker
Sheffield9 小时前
Alpine是什么,为什么是Docker首选?
linux·docker·容器
Johny_Zhao1 天前
centos7安装部署openclaw
linux·人工智能·信息安全·云计算·yum源·系统运维·openclaw
haibindev1 天前
在 Windows+WSL2 上部署 OpenClaw AI员工的实践与踩坑
linux·wsl2·openclaw
0xDevNull2 天前
Linux切换JDK版本详细教程
linux
进击的丸子2 天前
虹软人脸服务器版SDK(Linux/ARM Pro)多线程调用及性能优化
linux·数据库·后端
Johny_Zhao4 天前
OpenClaw安装部署教程
linux·人工智能·ai·云计算·系统运维·openclaw
chlk1235 天前
Linux文件权限完全图解:读懂 ls -l 和 chmod 755 背后的秘密
linux·操作系统
舒一笑5 天前
Ubuntu系统安装CodeX出现问题
linux·后端