美文网首页
Linux 系统启动

Linux 系统启动

作者: tingjieee_19e5 | 来源:发表于2018-04-28 10:27 被阅读0次

    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 系统启动

          本文链接:https://www.haomeiwen.com/subject/lcnwlftx.html