0%

从BIOS讲解系统启动过程:涉及到MBR、Real Molde、Protected Model、GDT、IVT、IDT、segment register、CPU privilege rings、Page、user space、kernel space、htop、priority value 、nice value、time

#b计算机基础/c_计算机系统/b_linux系统/补充

2020年5月24日 上午10:19
注:这篇内容抓住重点:执行的顺序、概念的定义的理解

BIOS

  1. Bootstrapping
    1. 拽着自己的靴子,将自己提起来
  2. 第一步:BIOS,Memory mapping:Real Molde
    1. https://wiki.osdev.org/Memory_Map_(x86)#Extended_BIOS_Data_Area_.28EBDA.29
    2. When a typical x86 PC boots it will be in Real Mode , with an active BIOS
    3. When the IVT is activated by an IRQ , it will call a BIOS routine to handle the IRQ.
    4. After all the BIOS functions have been called, and your kernel is loaded into memory somewhere, the bootloader or kernel may exit Real Mode forever
  3. 第二步:Find MBR Sector
    1. Load system into RAM:
      1. your bootloader code is loaded and running in memory at physical addresses 0x7C00 through 0x7DFF
      2. So that memory area is likely to also be unusable until execution has been transferred to a second stage bootloader, or to your kernel.
    2. Boostloader vs MBR
      1. Your MBR (master boot record) is a physical location on your hard drive. GRUB (grand unified bootloader) is a bootloader that is frequently installed ON the MBR. You need a MBR and a bootloader of some sort
    3. Jump to the system code
  4. 第三步:Protected Model
    1. 教程 从零开始编写操作系统 第 0x01 课_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
    2. cpu变更寻址方式:
      1. 在Real Mode下:
        1. segment register:0xfff0 + Offset << 4
      2. 在Protected Mode下:
        1. 0xffff -> Segment Descriptor -> Base Address -> (Privilege Check) BaseAddr + Offset -> Linear Address (Physical Address) -> page(可选)
      3. 为什么要使用分页代替段:
        1. 也能够更加精细的控制内存4k,进行读写等操作的控制,段的粒度太大
        2. 分页中,我们可以使用多级的页目录来吧页表的空间变得非常大
      4. segment register:
        1. 段寄存器存放的却不再是段基址
        2. 段寄存器在保护模式下存放的便是相当于一个数组索引的东西,通过这个索引,可以找到对应的GDT表项
      5. GDT:全局描述符表
        1. 段描述符存放了段基址、段界限、内存段类型属性(比如是数据段还是代码段,注意一个段描述符只能用来定义一个内存段)等许多属性
    3. CPU privilege rings:
      1. DPL:
        1. DPL存储在段描述符中,规定访问该段的权限级别(Descriptor Privilege Level),每个段的DPL固定
      2. RPL:
        1. RPL说明的是进程对段访问的请求权限(Request Privilege Level),是对于段选择子而言的,每个段选择子有自己的RPL,它说明的是进程对段访问的请求权限,有点像函数参数。而且RPL对每个段来说不是固定 的,两次访问同一段时的RPL可以不同。RPL可能会削弱CPL的作用,例如当前CPL=0的进程要访问一个数据段,它把段选择符中的RPL设为3,这样 虽然它对该段仍然只有特权为3的访问权限。
      3. CPL:
        1. CPL是当前进程的权限级别(Current Privilege Level),是当前正在执行的代码所在的段的特权级,存在于cs寄存器的低两位。
      4. 当进程访问一个段时,需要进程特权级检查,一般要求DPL >= max {CPL, RPL}
    4. Gain Privilege 和 security的角度:
      1. IDT:中断描述表
    5. Instructions & Register
      1. 指向描述符表的两个寄存器:
        1. GDTR:指向描述符,并且还存有描述符的大小
          1. LGDT(Load GDT)
        2. IDTR:指向描述符,并且还存有描述符的大小
          1. LIDT(Load IDT)
  5. segment mode:
    1. Flat Model :
      1. 用户数据段、用户代码段、内核程序段、内核代码段使用同一个地址空间
    2. Multi-Segment Model
      1. LDT TSS
    3. Page:分页
      1. 转帖为什么使用多级页表 - 济南小老虎 - 博客园
      2. 多级页表通过只为进程实际使用的那些虚拟地址内存区请求页表来减少内存使用量(出自《深入理解Linux内核》第三版51页)
        1. 举个例子:比如一个进程只是用4MB内存空间。对于以及页表,我们需要4M空间来存放页表,然后可以找到进程真正使用的4M内存空间。但是如果使用二级页表的话,一个页目录项可以定位4M内存空间,存放一个页目录项占4K,还需要一页用于存放进程使用的4M(4M=1024*4K,也就是用1024个页表项可以映射4M内存空间)内存空间对应的页表,总共需要4K+4K=8K来存放进程使用的这4M内存空间对应页表和页目录项,这比使用一级页表节省了很多内存空间。

上层应用:

  1. user space vs kernel space:
    1. User space vs kernel space · julia’s drawings
    2. 三种情况会导致用户态到内核态的切换
      1. 用户态和内核态的区别 - Gizing - 博客园
      2. 系统调用
      3. 异常
        1. 当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。
      4. 外围设备的中断
        1. 当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,
      5. 总结:
        1. 这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。
  2. htop命令:
    1. priority value
      1. In linux system priorities are 0 to 139 in which 0 to 99 for real time and 100 to 139 for users.
    2. nice value
      1. nice value range is -20 to +19 where -20 is highest, 0 default and +19 is lowest.
    3. 转换公式:
      1. PR = 20 + NI
      2. the value of PR = 20 + (-20 to +19) is 0 to 39 that maps 100 to 139.
    4. linux指令设置nice value:
      1. A brief guide to priority and nice values in the linux ecosystem
      2. renice -n nice_val -p [pid]
      3. nice -n nice_val [command]
  3. time命令:
    1. real:程序从开始运行到结束的全部时间,这是用户能感知到的时间,包括 CPU 切换去执行其他任务的时间。
    2. user:程序在 User space 执行的时间
    3. sys:程序在 Kernel space 执行的时间
    4. 总结:
      1. user和sys之和,一般情况下,应该小于real。但如果是多核 CPU,这两个指标反映的是所有 CPU 的总耗时,所以它们之和可能大于real

参考文章:

User space 与 Kernel space - 阮一峰的网络日志
用户态和内核态的区别 - Gizing - 博客园
unix - What do ‘real’, ‘user’ and ‘sys’ mean in the output of time(1)? - Stack Overflow
User space vs kernel space · julia’s drawings
Understanding Linux CPU stats | Scout APM Blog
A brief guide to priority and nice values in the linux ecosystem
Process ‘niceness’ vs. ‘priority’ - Ask Ubuntu
CPU的实模式和保护模式(一) - 知乎
VOID001的个人空间 - 哔哩哔哩 ( ゜- ゜)つロ 乾杯~ Bilibili
教程 从零开始编写操作系统 第 0x01 课_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
保护模式特权级别DPL,RPL,CPL 之间的联系和区别 转 - 龙豆 - 博客园
x86 - what is the difference between IVT and IDT? - Stack Overflow
driver - What are Ring 0 and Ring 3 in the context of operating systems? - Stack Overflow
转帖为什么使用多级页表 - 济南小老虎 - 博客园
将操作系统分解,看看这个庞大的系统中包含哪些子系统
Memory Map (x86) - OSDev Wiki
what-is-the-difference-between-mbr-and-grub