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

相关推荐
zzzsde1 小时前
【Linux】基础开发工具(4):自动化构建--make/makefile
linux·运维·服务器
YY_pdd2 小时前
全面战争三国-mod开发教程(demo,已实证)
经验分享·笔记·学习
txinyu的博客2 小时前
Reactor 模型全解析
java·linux·开发语言·c++
星纬智联技术2 小时前
AI 自动化测试方案分享
经验分享
deng-c-f2 小时前
配置(13):给Vmware中的ubuntu扩容(只适用LVM分区)
linux·运维·ubuntu
changyunkeji2 小时前
长云科技:电缆输送机操作规程
经验分享·科技
六月生花2 小时前
LNMP(centos 9)
linux·运维·centos
A゛孤青2 小时前
VMware磁盘清理,解决空间占用不断增大的问题
linux·运维
不染尘.2 小时前
Linux磁盘分区和NAT网络配置
linux·运维·网络·windows·ssh