Linux源码并没有那么神奇

1. 上电

CPU进入实模式 -> 从0xFFFF0开始执行BIOS代码 -> 系统检测 -> 启动存储第一个扇区并读入到内存0x7C00并调整到此位置

2. bootsect.S

将自己移动到0x90200 -> 将setup.S读取到0x90200处 -> 利用BIOS中断0x13读取磁盘参数 -> 显示“Loading system…” -> 将setup模块后的system模块加载到内存0x10000位置

3. setup.S

利用BIOS终端读取机器参数 -> 将system模块从0x10000~0x8ffff整体下移到0x00000 -> 进入保护模式:加载中断描述符表寄存器(idtr)、全局描述符表寄存器(gdtr)、开启A20地址线、重设两个中断控制芯片8259A(0x20~0x2f)、设置控制寄存器CR0 -> 跳转到system最前的head.s

4. head.s

加载各个数据段寄存器 -> 重设中断描述符表idt,时256个中断项皆指向一个只报错的哑中断子程序ignore_int -> 重设全局描述符表gdt(将段长8MB改为16MB)-> 检测A20地址线是否开启 -> 设置分页内存 -> 利用返回指令跳转到main函数执行(跳转到main是最激动人心的时刻,终于可以使用C语言了!)

5. main

根据setup.S获取的机器参数对变量进行初始化 -> 对硬件进行初始化:陷阱门、块设备、字符设备、tty -> 手段设置第一个任务(task 0)进程0 -> 设置运行中断 -> 切换到任务0 -> 利用fork()创建运行init()的进程1
此后:

  • 进程0,空闲时运行,执行pause()系统调用,并调用调度程序
  • 进程1,安装根文件系统、显示系统信息、运行系统初始化资源配置文件rc中的命令、运行用户在shell中命令或程序

6. 放飞意志

接下来就是Linux功能源码了

  • 中断处理
  • 设备管理
  • 进程管理
  • 内存管理
  • 文件服务

以前一直都觉得操作系统很复杂,当然确实复杂,你不去看她的源码,她永远都是一个黑匣子;读了她的源码后,其实和普通应用程序实质区别并不是很大,只是多了一些硬件处理,多受了一些限制而已。所以,隔行如隔山,只是因为你没有探过头,瞧瞧瞄一眼即可看清大概轮廓。

《Linux源码并没有那么神奇》

    原文作者:code猪
    原文地址: https://www.jianshu.com/p/681695cc9fbf
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞