开启分页机制

必须说明的是,必须在保护模式下才能启动分页功能。本章的引导程序依然用第13章的。

开启分页机制之前,必须创建页目录和页表。因为内核是在开启页功能之前加载的,段在内存中的位置已经固定。在这种情况下,即使开启了分页功能,线性地址也必须和物理地址相同才行,不然就会“跑飞”。

因为我们的内核很小,将其加载到内存后,连低端的1MB空间都没有占完全,所以只需要将低端1MB内存做特殊处理,使这部分内存的线性地址和物理地址相同即可。这样做的好处是:内核不用做任何变动即可在分页模式下继续正常工作,再也不会担心“跑飞”了。

对于页目录和页表,页目录必须在内存中,页目录和页表必须各自占用一个自然页,也就是说它们的物理地址的低12位必须全零。

一个页表最多可以容纳1024个表项,对应1024个页,也就是4MB内存。对于我们的内核,还不到1MB,所以一个页目录和一个页表足矣。作者的设计是把页目录放在物理地址0x0002_0000处,把页表放在0x0002_1000处。

926         ;页目录表清零
927         mov ecx,1024                       ;1024个目录项
928         mov ebx,0x00020000                 ;页目录的物理地址
929         xor esi,esi
930  .b1:
931         mov dword [es:ebx+esi],0x00000000  ;页目录表项清零
932         add esi,4
933         loop .b1

以上代码将页目录和页表的所有目录项清零。之所以这样做,主要是使所有目录项的P位为0.

935         ;在页目录内创建指向页目录自己的目录项
936         mov dword [es:ebx+4092],0x00020003
937
938         ;在页目录内创建与线性地址0x00000000对应的目录项
939         mov dword [es:ebx+0],0x00021003    ;写入目录项(页表的物理地址和属性)   

创建2个目录项。
936:P=1;RW=1;US=0;这个目录项指向了自己,为的是可以方便地用线性地址访问自己。
939:添加一个表项,使其指向页表。P=1;RW=1;US=0。

942         mov ebx,0x00021000                 ;页表的物理地址
943         xor eax,eax                        ;起始页的物理地址
944         xor esi,esi
945  .b2:
946         mov edx,eax
947         or edx,0x00000003
948         mov [es:ebx+esi*4],edx             ;登记页的物理地址
949         add eax,0x1000                     ;下一个相邻页的物理地址
950         inc esi
951         cmp esi,256                        ;仅低端1MB内存对应的页才是有效的
952         jl .b2
953
954  .b3:                                      ;其余的页表项置为无效
955         mov dword [es:ebx+esi*4],0x00000000
956         inc esi
957         cmp esi,1024
958         jl .b3 

上面的代码用来填写页表项。填写后,内核的页目录和页表视图如下。

960         ;令CR3寄存器指向页目录,并正式开启页功能
961         mov eax,0x00020000                 ;PCD=PWT=0
962         mov cr3,eax
963
964         mov eax,cr0
965         or eax,0x80000000
966         mov cr0,eax                        ;开启分页机制

961~962:PWT=0,PCD=0;登记页目录表的基地址。

964~966:正式开启分页机制。

分页机制开启后,根据上面的页目录和页表视图,可以算出:
线性地址:0x0000_0000~0x0000_FFFF
映射到
物理地址:0x0000_0000~0x0000_FFFF;

线性地址:0x8000_0000~0x8000_FFFF
也映射到
物理地址:0x0000_0000~0x0000_FFFF;

开启分页机制———《x86汇编语言:从实模式到保护模式》读书笔记44相关推荐

  1. X86汇编语言从实模式到保护模式09:32位x86处理器编程架构

    目录 1. IA-32架构的基本执行环境 1.1 寄存器的扩展 1.1.1 通用寄存器的扩展 1.1.2 IP寄存器的扩展 1.1.3 FLAGS寄存器的扩展 1.1.4 段寄存器的扩展 1.2 32 ...

  2. 实模式和保护模式区别及寻址方式

    64KB-4GB-64TB? 我记得大学的汇编课程.组成原理课里老师讲过实模式和保护模式的区别,在很多书本上也有谈及,无奈本人理解和感悟能力实在太差,在很长一段时间里都没真正的明白它们的内含,更别说为 ...

  3. [书]x86汇编语言:从实模式到保护模式 -- 第17章 中断、任务切换、分页机制、平坦模型

    # 任务切换 内核任务.用户任务1.用户任务2,之前的轮询切换 利用RTC芯片的硬件中断来实现任务切换 计算机主板上有实时时钟芯片RTC,可以设置RTC芯片,使得它每次更新CMOS中的时间信息后,发出 ...

  4. [书]x86汇编语言:从实模式到保护模式 -- 第16章 分页机制、平坦模型

    # 分页机制 二级页表:页目录.页表 ==> 4KB物理页 32位线性地址中:高10位为页目录中的索引号(乘4得偏移量),该目录项指向页表的基地址:中间10位为页表中的索引号,该页表项指向4KB ...

  5. X86汇编语言从实模式到保护模式20:平坦模型

    1 引入平坦模型(Flat Model)的原因 1.1 内存管理模型变迁 1.1.1 分段模型 1.1.1.1 基本特点 1. 在程序中按结构组织为多个段 2. 在加载程序时,为程序中的每个段创建段描 ...

  6. x86汇编语言从实模式百度云_Intel x86 CPU 32位保护模式杂谈之任务切换 上

    目录: 什么是任务 任务由什么组成 任务门描述符是什么东东?有了TSS描述符为什么要有任务门描述符? 参考文献 什么是任务 任务(task)是处理器可以分配.执行.挂起的工作单位,笔者认为和我们操作系 ...

  7. ASM:《X86汇编语言-从实模式到保护模式》第10章:32位x86处理器的编程架构

    ★PART1:32位的x86处理器执行方式和架构 1. 寄存器的拓展(IA-32) 从80386开始,处理器内的寄存器从16位拓展到32位,命名其实就是在前面加上e(Extend)就好了,8个通用寄存 ...

  8. 【OS修炼指南目录】----《X86汇编语言-从实模式到保护模式》读书笔记目录表

    学习交流加(可免费帮忙下载CSDN资源): 个人微信: liu1126137994 学习交流资源分享qq群1(已满): 962535112 学习交流资源分享qq群2: 780902027 本文是将个人 ...

  9. 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16...

    一.Intel 32 位处理器的工作模式 如上图所示,Intel 32 位处理器有3种工作模式. (1)实模式:工作方式相当于一个8086 (2)保护模式:提供支持多任务环境的工作方式,建立保护机制 ...

最新文章

  1. VC中读写ini文件
  2. oracle快速导出1t数据,使用sqluldr2快速高效大批量导出Oracle数据
  3. EditText获得焦点后,如何关闭软键盘
  4. 5渲染判断if_React 16 渲染流程
  5. mysql 优化设计库_MySQL 数据库最优化设计原则
  6. append()与extend()
  7. 用 CSS 实现元素垂直居中,有哪些好的方案?
  8. 结对项目 刘静 201303014059 计科高职13-2
  9. iOS关键代码遭泄露;Google正式抛弃HTTP;微博网页版出故障 | 一周业界事
  10. bootstrap居中
  11. Python版学生管理系统源码分享【考试/作业必备】
  12. sql server完全卸载
  13. 泰坦尼克号数据下载链接
  14. 电脑端微信用户图片DAT格式解码为图片(TK版)
  15. cocos2d-x传智播客_Hanselminutes播客30-Outlook加载项和个人生产力增强器
  16. Contrastive Learning
  17. Linux那些事儿 之 我是PCI(1)PCI,我们来了
  18. 安卓京东自动炸年兽v4.1.1
  19. 【旋转矩阵和旋转向量】
  20. 计算机微程序控制器实验报告,计算机组成原理微程序控制器实验报告

热门文章

  1. DML触发器实现日志功能
  2. hdu 3068 最长回文(manacher算法)
  3. 信息属性列表关键字 info.plist
  4. 怎样维护成功的开源项目
  5. RHEL 6 下VNC Server 的安装配置
  6. loss=nan解决办法
  7. [云炬创业学笔记]第二章决定成为创业者测试10
  8. 【12】 全国外电音DJ 3000首 32G
  9. [云炬创业基础笔记]第七张创业团队测试5
  10. [云炬学英语]每日一句2020.8.26