返回

Linux从头学10:三级跳之旅——从引导加载程序到操作系统再到应用程序

闲谈

文 | 披着程序员皮的程序猿

在深入探讨Linux系统的启动过程之前,我们先来了解一下本次内容要涉及到的关键术语,这将有助于我们更好地理解后续的讲解。

引导加载程序

引导加载程序,即Bootloader,是计算机系统启动时加载的第一个软件程序,它的主要任务是将操作系统内核从存储设备(如硬盘或固态硬盘)加载到内存中并执行。

操作系统内核

操作系统内核是操作系统的核心,负责管理计算机硬件和软件资源,提供进程调度、内存管理、设备管理等基础服务。

应用程序

应用程序是运行在操作系统之上的软件,由用户直接操作使用,例如文字处理软件、网页浏览器、媒体播放器等。

三级跳过程

在计算机启动过程中,从引导加载程序加载操作系统内核,再由操作系统内核启动应用程序,这三个步骤被称为"三级跳过程"。

引导加载程序到操作系统的跳跃

  1. 计算机加电自检(POST)后,BIOS会将控制权交给引导加载程序(如GRUB)。
  2. 引导加载程序从存储设备读取操作系统内核映像,并将其加载到内存中。
  3. 引导加载程序将控制权交给操作系统内核。

操作系统到应用程序的跳跃

  1. 操作系统内核完成初始化,建立系统数据结构和加载设备驱动程序。
  2. 操作系统内核创建第一个用户空间进程(通常是init进程),并执行init进程。
  3. init进程负责启动其他系统服务和应用程序。

深入浅出:揭秘三级跳过程

从Bootloader到操作系统

Bootloader首先读取操作系统的header,其中包含操作系统的加载地址和大小等信息。然后,Bootloader将操作系统内核从存储设备加载到内存中,并跳转到内核的入口点。

从操作系统到应用程序

操作系统内核首先建立三个段符:代码段、数据段和堆栈段。然后,内核将控制权交给init进程,init进程负责启动其他系统服务和应用程序。应用程序可以通过系统调用与操作系统内核进行交互,访问系统资源。

技术指南:实战演示三级跳过程

示例代码:

//引导加载程序代码
void boot_main() {
  //读取操作系统内核header
  struct boot_header header;
  read_header(&header);

  //将操作系统内核加载到内存中
  load_kernel(&header);

  //跳转到内核入口点
  jump_to_kernel();
}

//操作系统内核代码
void kernel_main() {
  //建立段符
  setup_descriptors();

  //创建init进程
  create_init_process();

  //启动init进程
  start_init_process();
}

//应用程序代码
int main() {
  //调用系统函数输出"Hello, world!"
  printf("Hello, world!\n");

  //返回0表示程序执行成功
  return 0;
}

运行步骤:

  1. 编译引导加载程序、操作系统内核和应用程序。
  2. 将引导加载程序安装到目标计算机。
  3. 将操作系统内核和应用程序复制到存储设备。
  4. 启动计算机,观察三级跳过程。