Linux 系统启动

BIOS

从加电开始,硬件电路在CPU引脚上产生reset,设置处理的一些寄存器值。
从物理地址0xfffffff0处找到代码,硬件将此地址映射到一个ROM中,即BIOS存放位置。

  • 对硬件执行一些测试,检测设备以及是否正常
  • 初始化硬件设备,显示PCI设备列表
  • 搜索一个操作系统来启动,从硬件的第一个扇区(引导扇区)
  • 找到一个有效设备,就把第一个扇区的内容拷贝到RAM中从物理地址0x00007c00开始的位置,然后执行这部分代码

Boot loader

由BIOS用来把操作系统的内核影像装载到RAM中所调用的一个程序
硬盘的第一个扇区称为主引导记录(master boot record,MBR)该扇区包括分区表和一个小程序,这个小程序用来装载被启动的操作系统所在分区的第一个扇区的。

setup() 函数

初始化计算机中的硬件设备,为内核程序的执行建立环境,Linux是要自己重新初始化设备的,即使有BIOS。
e.g: 键盘,视频卡,磁盘控制器,鼠标,电源管理等,以及临时中断描述表,全局描述表,浮点单元,中断控制器,cr0状态寄存器,把CPU从实模式切换到保护模式

setup_32() 函数

  • 初始化段寄存器和一个临时堆栈
  • 加压内核影像
  • 跳转
    为进程0建立执行环境
  • 段寄存器
  • 内核的bss段填充0
  • 内核页表初始化
  • 页全局目录的地址存放在cr3寄存器,启动分页
  • 识别处理器型号
  • 跳转到start_kernel()函数

start_kernel()函数

完成初始化Linux内核的初始化工作

  • 调用sched_init()函数来初始化调度函数
  • 调用 build_all_zonelists()函数来初始化内存管理区
  • 调用page_alloc_init()来初始化伙伴系统分配系统
  • 调用trap_init()来初始化IDT(??)
  • 调用softtirg_init()初始化软中断
  • 初始化系统时间
  • 调用kmem_cache_init()初始化slab分配器
  • 确定CPU时钟的速度
  • 调用kernel_thread() 为进程1创建内核进程
    此时init程序和内核线程都运行起来了,可以通知用户Linux内核已经启动,正在运行

你可能感兴趣的:(Linux 系统启动)