Linux从头学之系统启动过程中的几个神秘地址,你知道是什么意思吗?

原创
ithorizon 7个月前 (10-13) 阅读数 28 #Linux

Linux从头学之系统启动过程中的几个神秘地址

Linux系统的启动过程是一个错综而精妙的过程,涉及到多个阶段和组件。在这个过程中,有一些神秘的地址扮演着关键的角色。这些地址对于领会Linux系统的启动原理至关重要。本文将详细介绍这些神秘地址的含义和作用。

1. Bootloader地址

Bootloader是系统启动过程中的第一个程序,它负责从硬盘加载操作系统的内核。在Linux系统中,常用的Bootloader有GRUB(GRand Unified Bootloader)和ELILO(Extended Linux Loader)等。Bootloader的加载地址通常是在系统启动时由硬件平台决定的,这个地址被称为Bootloader地址。

在x86架构的系统中,Bootloader的加载地址通常是0x7C00。这是基于BIOS在启动时会从硬盘的0柱面、0磁头、1扇区读取数据,这个扇区被称为MBR(Master Boot Record)。MBR的大小通常为512字节,其中包含了Bootloader代码和分区表信息。Bootloader加载后,会跳转到0x7C00地址处继续执行。

BIOS -> 0x7C00 (Bootloader)

2. Kernel加载地址

内核是操作系统的核心,它负责管理硬件资源和提供各种系统服务。内核的加载地址通常是由Bootloader指定的。在x86架构中,内核的加载地址通常是0xC0100000(即40MB处)。这个地址是在内核编译时通过链接器指定的。

以下是内核加载地址的示例代码:

objcopy -O binary vmlinux vmlinux.bin

上述命令将内核文件vmlinux转换成二进制文件vmlinux.bin,并指定了加载地址。

3. init进程地址

init进程是系统启动后的第一个用户空间进程,它负责初始化系统环境并启动其他系统服务。在Linux系统中,init进程的地址通常是0x8048000。这个地址是在内核编译时通过链接器指定的。

以下是init进程地址的示例代码:

objcopy -O binary init init.bin

上述命令将init进程的二进制文件转换成init.bin,并指定了加载地址。

4. /dev/zero地址

/dev/zero是一个特殊的字符设备文件,它提供了一个无限大小的、全部为0的数据流。在系统启动过程中,/dev/zero地址被用于分配内存和初始化数据结构。/dev/zero的地址通常是在内核初始化时动态分配的。

以下是获取/dev/zero地址的示例代码:

char *zero = mmap(0, 0x1000, PROT_READ, MAP_PRIVATE, open("/dev/zero", O_RDONLY), 0);

上述代码通过mmap系统调用将/dev/zero映射到当前进程的地址空间,并返回映射的地址。

5. /dev/random地址

/dev/random是一个特殊的字符设备文件,它提供了一个保险的伪随机数生成器。在系统启动过程中,/dev/random地址被用于生成加密密钥和初始化加密算法。/dev/random的地址通常是在内核初始化时动态分配的。

以下是获取/dev/random地址的示例代码:

char *random = mmap(0, 0x1000, PROT_READ, MAP_PRIVATE, open("/dev/random", O_RDONLY), 0);

上述代码通过mmap系统调用将/dev/random映射到当前进程的地址空间,并返回映射的地址。

总结

Linux系统启动过程中的这些神秘地址对于领会系统启动原理至关重要。它们在系统初始化和运行过程中发挥着关键作用。通过学习这些地址的含义和作用,我们可以更好地掌握Linux系统的启动过程,为后续的系统维护和开发打下坚实的基础。


本文由IT视界版权所有,禁止未经同意的情况下转发

文章标签: Linux


热门