• 【日拱一卒行而不辍20220918】自制操作系统


    实模式下地址空间布局

    实模式1MB内存布局

    在早期,Intel 8086处理器有20条地址线(1MB内存空间),寄存器都仅是16位。

    因此对于其内存,会进行一些特别的布置。

    当前虽然CPU已经有了很大的进步,其地址线增长至32位到64位等,但是遵循于兼容性,计算机开机时CPU仍然处于实模式,即仅仅能访问1MB内存,寄存器也是16位的。

    而由于实模式下的内存实在有限,因此往往其各个部分的用途均已约定好,如下所示。

    起始地址结束地址大小用途
    FFFF0FFFFF16BBIOS入口地址
    F0000FFFFF64KB

    BIOS代码,包括上面介绍的BIOS入口地址

    C8000EFFFF160KB映射硬件适配器的ROM或者内存映射式I/O
    C0000C7FFFF32KB显示适配器BIOS
    B8000BFFFF32KB用于文本模式显示适配器
    B0000B7FFF32KB用于黑白显示适配器
    A0000AFFFF64KB用于彩色显示适配器
    9FC009FFFF1KBEBDA(Extended BIOS Data Area)拓展BIOS数据区
    07E009FBFF622080B可用区域
    07C0007DFF512BMBR被BIOS加载到此处
    0050007BFF30464B可用区域
    00400004FF256BBIOS Data Area(BIOS数据区)
    00000003FF1KBInterrupt Vector Table(中断向量表)

    根据上述表格,我们也很容易知道BIOS是如何被进行加载的——直接映射入内存的对应地址即可。这里的映射是通过硬件实现,因此和借助于操作系统等程序进行的加载不同。

    MBR文件格式

    MBR文件必须是原始可执行的二进制文件。

    JMP跳转后,即完成了MBR的加载,会直接执行MBR程序。

    这也就意味着,我们并不能通过gcc生成ELF文件作为MBR,因为ELF文件中还包含诸如魔数,段表等非代码段,其是用于操作系统进行加载的可执行文件格式

    而这里要求的MBR程序是CPU可以直接运行的二进制文件,因此我们必须直接生成该二进制文件。

  • 相关阅读:
    05ShardingSphere-JDBC水平分片
    【IROS 2019】RangeNet++: 快速准确的LiDAR语义分割
    面试官:能用JavaScript手写一个bind函数吗
    TypeScript阶段学习
    04 后端开发总结
    Windows 下 MySQL 8.1 图形化界面安装、配置详解
    CSS中常用属性
    Flume 简介及基本使用
    Linux内核 6.6版本将遏制NVIDIA驱动的不正当行为
    STM32收入高也好找工作,所以我学嵌入式linux终究是错付了吗
  • 原文地址:https://blog.csdn.net/bear_miao/article/details/126915756