• (五)bootloader 启动 ucore os


    Lab1 : bootloader 启动 ucore os

    一、内容提要

    • x86启动顺序

    • C函数调用

    • gcc内联汇编(inline assembly)

    • x86-32下的中断处理

    • 小结

    二、x86启动顺序

    • 寄存器初始值

    • 第一条指令(CS=F000H, EIP=0000FFF0H)

      • 实际地址是: Base + EIP

      • 当CS被新值加载,则地址转换规则则将开始起作用

      • 通常第一条指令是一条长跳转指令(这样CS和EIP都会跳转到BIOS代码中执行)

    • 处于实模式的段

      • 段选择子(segment selector):CS,DS,SS,........

      • 偏移量(offset): EIP

    • 从BIOS到Bootloader

      • BIOS 加载 存储设备(比如软盘、硬盘、光盘,USB)上的第一个扇区( 主引导扇区 , Master Boot Record, or MBR)的 512字节 到内存的0x7c00.....[注: 扇区里的代码会完成后续的加载工作,这个扇区成为BootLoader]

      • 然后跳转到 @0x7c00的第一条指令开始执行

      • bootloader做的事:

        • (从实模式切换到保护模式) 使能保护模式(protection mode) & 段机制(segment level protector)

        • 从硬盘上读取 kernel in ELF 格式ucore kernel(跟在MBR后面的扇区) 并放到内存中固定位置

        • 跳转到 ucore OS 的入口点(entry point ) 执行, 这时控制权到了ucore OS中

    • 段机制

      • 段寄存器起指针作用, 指向 段描述符(存放段的起始地址和大小)

        • 如:根据CS里面Index的值来找到uCore的起始地址和大小

      • 段机制的(近似对等)映射关系简单, 限制是4G,段的起始地址从0开始, 分段机制弱化。(页机制实现)

      • 页机制在段机制的基础上.

      • 在段寄存器里会保存一块区域叫做段选择址(Index: 会查找在段描述符中的项.)

      • 起始地址(基址) + EIP = 物理地址(没有页机制时,线性地址等同于物理地址)

      • 段机制其实是一种映射关系

      • 通过一个大数组(把各个段描述符装进去), 数组由操作系统建立的(全局描述符表(简称段表),GDT)(描述好段描述符表的一个大致的空间, 给出他的位置和大小)

      • 内部寄存器GDTR保存相应地址,使得寄存器和GDT表建立关系,从而可以指向GDT大数组里面所对应的描述符.

      基址(Base) 在什么地方(0), 段的Limit多大(4G) -- 实现简单的映射

      段选择址

      全局描述表

      段描述符

      指向全局描述符表起始地址GDTR的一个寄存器

    • 使能保护模式(Enable)

      • 使能保护模式, bootloader/OS 要设置 CR0(系统寄存器) 的bit 0 (PE)

      • 段机制 (Segment-level protection ) 在保护模式下是自动使能的.

      • GDT里面每一项是一个段描述符,把相应的段的段寄存器设置为对应的Index,能够指向全局描述表GDT对应的 项(段描述符--指出了映射关系), 从而在使能的保护机制,使段机制正常工作.

    • 加载ELF格式的ucore OS kernel

  • 相关阅读:
    redis:aof恢复与rdb服务器间迁移
    redis的主从服务器配置
    redis:消息发布与订阅频道
    redis:hash哈希类型的操作
    redis:order set有序集合类型的操作(有序集合)
    redis:set集合类型的操作(无序集合)
    redis:list列表类型的操作
    C#之多线程
    C# 操作FTP
    C# 导出导入TXT文件
  • 原文地址:https://www.cnblogs.com/douzujun/p/6511328.html
Copyright © 2020-2023  润新知