x86系列处理器上的页式内存管理

硬件层直接支持内存分页机制

默认情况下不使用内存分页机制(段式内存管理)

分页机制启动后,使用二级页表对内存进行管理

x86系列处理器的分页方式

x86分页机制示意图

x86系列处理器的分页方式

一些重要结论(针对32位x86处理器)

页目录占用1内存页(可访问1024个子页表)

单个子页表占用1内存页(可访问1024个页面)

页面起始地址按4K字节对齐(总是4096整数倍)

分页后可访问的虚拟内存空间为:4K * (1024 * 1024) = 4G

最简单的分页构建方式

x86系列处理器的页属性

由于物理页面的地址必须按照4K字节对齐,所以它低12位都为0

因此,页目录(页表)可使用地址的低12位进行属性描述

x86系列处理器上的页属性

x86对分页的硬件支持

将cr3指向页目录地址(可切换不同的页目录)

将cr0最高位置1(硬件级开启分页机制)

汇编贴士

%include "inc.asm"PageDirBase    equ    0x200000
PageTblBase    equ    0x201000org 0x9000jmp ENTRY_SEGMENT[section .gdt]
; GDT definition
;                                 段基址,         段界限,       段属性
GDT_ENTRY       : Descriptor        0,              0,            0
CODE32_DESC     : Descriptor        0,         Code32SegLen - 1,  DA_32 + DA_C
VIDEO_DESC      : Descriptor     0xb8000,           0x7fff,       DA_32 + DA_DRWA
DATA32_DESC     : Descriptor        0,         Data32SegLen - 1,  DA_32 + DA_DRW
STACK32_DESC    : Descriptor        0,          TopOfStack32,     DA_32 + DA_DRW
PAGE_DIR_DESC   : Descriptor    PageDirBase,       4095,          DA_32 + DA_DRW
PAGE_TBL_DESC   : Descriptor    PageTblBase,       1023,          DA_32 + DA_DRW + DA_LIMIT_4K
; GDT end  GdtLen     equ      $ - GDT_ENTRY
GdtPtr:    dw   GdtLen - 1dd    0; GDT Selector
Code32Selector    equ    (0x0001 << 3) + SA_TIG + SA_RPL0
VideoSelector     equ    (0x0002 << 3) + SA_TIG + SA_RPL0
Data32Selector    equ    (0x0003 << 3) + SA_TIG + SA_RPL0
Stack32Selector   equ    (0x0004 << 3) + SA_TIG + SA_RPL0
PageDirSelector   equ    (0x0005 << 3) + SA_TIG + SA_RPL0
PageTblSelector   equ    (0x0006 << 3) + SA_TIG + SA_RPL0
; end of [section .gdt]TopOfStack16 equ    0x7c00[section .dat]
[bits 32]
DATA32_SEGMENT:DTOS             db    "D.T.OS!", 0DTOS_Offset         equ   DTOS - $$ HELLOWORLD          db    "Hello, World!", 0HELLOWORLD_Offset   equ   HELLOWORLD - $$Data32SegLen equ   $ - DATA32_SEGMENT[section .s16]
[bits 16]
ENTRY_SEGMENT:mov ax, csmov ds, axmov es, axmov ss, axmov sp, TopOfStack16; initialize GDT for 32 bits code segmentmov esi, CODE32_SEGMENTmov edi, CODE32_DESCcall InitDescItemmov esi, DATA32_SEGMENTmov edi, DATA32_DESCcall InitDescItemmov esi, STACK32_SEGMENTmov edi, STACK32_DESCcall InitDescItem; initalize GDT pointer structmov eax, 0mov ax, dsshl eax, 4add eax, GDT_ENTRYmov dword [GdtPtr + 2], eax; 1. load GDTlgdt [GdtPtr]; 2. close interruptcli ; 3. open A20in al, 0x92or al, 00000010bout 0x92, al; 4. enter protect modemov eax, cr0or eax, 0x01mov cr0, eax; 5. jump to 32 bits codejmp dword Code32Selector : 0; esi    --> code segment labelBACK_ENTRY_SEGMENT
; edi    --> descriptor label
InitDescItem:push eaxmov eax, 0mov ax, csshl eax, 4add eax, esimov word [edi + 2], axshr eax, 16mov byte [edi + 4], almov byte [edi + 7], ahpop eaxret[section .s32]
[bits 32]
CODE32_SEGMENT:mov ax, VideoSelectormov gs, axmov ax, Stack32Selectormov ss, axmov eax, TopOfStack32mov esp, eaxmov ax, Data32Selectormov ds, axmov ebp, DTOS_Offsetmov bx, 0x0cmov dh, 13mov dl, 33call PrintStringmov ebp, HELLOWORLD_Offsetmov bx, 0x0cmov dh, 14mov dl, 30call PrintStringcall SetupPagejmp $;
;
SetupPage:push espush eaxpush ecxpush edi   mov ax, PageDirSelectormov es, axmov edi, 0mov ecx, 1024   ;  1K sub page tablesmov eax, PageTblBase | PG_P | PG_USU | PG_RWWcldstdir:stosdadd eax, 4096loop stdirmov ax, PageTblSelectormov es, axmov edi, 0mov ecx, 1024 * 1024     ; 1M pagesmov eax, PG_P | PG_USU | PG_RWWcldsttbl:stosdadd eax, 4096loop sttbl    mov eax, PageDirBasemov cr3, eaxmov eax, cr0or  eax, 0x80000000mov cr0, eaxpop edipop ecxpop eaxpop esret   ; ds:ebp    --> string address
; bx        --> attribute
; dx        --> dh : row, dl : col
PrintString:push ebppush cxpush eaxpush dxpush ediprint:mov cl, [ds:ebp]cmp cl, 0je endmov eax, 80mul dhadd al, dlshl eax, 1mov edi, eaxmov ah, blmov al, clmov [gs:edi], axinc ebpinc dljmp printend:pop edipop dxpop eaxpop cxpop ebpretCode32SegLen  equ    $ - CODE32_SEGMENT[section .gs]
[bits 32]
STACK32_SEGMENT:times 1024 * 4 db 0Stack32SegLen    equ    $ - STACK32_SEGMENT
TopOfStack32    equ    Stack32SegLen - 1

因为我们要实现x86处理器上的分页,所以我需要先定义页目录和子页表,我们定义页目录的起始地址位0x200000,大小为 4 * 1024 = 4K字节,子页表的起始地址为0x201000,大小为 4 * 1024 *1024 = (4K * 1024)字节,随后我们给页目录和子页表定义了相应的段描述符和选择子,19行中的DA_LIMIT_4K告诉我们段界限这里使用的单位不是字节,而是页,所以把子页表的段界限设为1023。

149行-192行我们定义了一个设置页表的函数,首先设置页目录的相关信息,然后设置子页表的相关信息,最后再开启分页设置。

x86系统上的内存分页相关推荐

  1. linux下实现内存监视,shell脚本来监视Linux上的内存使用情况

    shell脚本来监视Linux上的内存使用情况 监视所有内容,例如CPU利用率,内存利用率,交换利用率,磁盘空间利用率等等. 如果您只有很少的系统并且要监视它们,那么编写一个小的Shell脚本可以使您 ...

  2. sql2005性能优化(在32位系统上突破2G内存使用量的方法)

    服务器磁盘为(SAS)IBM组成RAID0+1,SQL2K5只识别4G内存,实际只占用2G内存.而使用 AWE的话,应用程序可以直接将操作系统允许的最大物理内存量保留为未分页的内存.使用 AWE 使  ...

  3. 鸿蒙os吃内存吗,终于上手机!华为鸿蒙 OS 2.0 系统:128KB 内存就能跑

    终于上手机!华为鸿蒙 OS 2.0 系统:128KB 内存就能跑 2020-09-11 10:51:48 0点赞 0收藏 0评论 9月11日消息,华为昨天下午在东莞松山湖举办了全球开发者大会,本次大会 ...

  4. linux系统snmpd服务内存偏高,Red Hat Enterprise Linux 5.4 64位系统SNMP内存泄漏(上)

    1.SNMP的内存泄漏问题 SNMP的内存泄漏问题,我最早是在CDN的一台负载均衡调度机上看到的.一个snmpd进程,占用的VIRT将近4G.重启snmpd后VIRT降到150M左右,机器为Red H ...

  5. 64位系统上运行32位程序的内存限制

    64位系统上运行32位程序能否申请到8G内存? 收藏到手机    转发   评论 2010-01-20 10:56 申请不到,因为64为系统在运行32位程序的时候只是为了向下兼容而已,对于32位程序来 ...

  6. linux安装文件多大空间,你的Linux系统上安装了多少内存?又使用了多少?

    [51CTO.com快译]几个命令可报告Linux系统上安装和使用了多少内存.你可能淹没于细节,也可能获得快速简易的答案,这看你使用哪个命令. 有好多方法可以获取Linux系统上已安装内存方面的信息, ...

  7. 线上系统的JVM内存是否设置的越大越好?

    "线上系统的JVM内存是否设置的越大越好?"乍一听到这个问题,我第一个反应就是"NO",但是,具体为什么不行,又说不出什么所以然来. 其实,说一个东西不行,我们 ...

  8. mac catalina删除系统多余文件 内存不足_macOS Catalina Patcher(如何在旧mac上安装Catalina系统)...

    macOS Catalina Patcher是一款macOS Catalina修补程序,可以在旧mac上安装最新的Catalina系统工具.macOS Catalina 10.15是Apple受欢迎的 ...

  9. 操作系统学习:内存分页与中断

    本文参考书籍 1.操作系统真相还原 2.Linux内核完全剖析:基于0.12内核 3.x86汇编语言 从实模式到保护模式 ps:基于x86硬件的pc系统 内存分页机制 内存信息的获取 在进行内存分页之 ...

最新文章

  1. HTTP服务器端常用推送技术
  2. 对ajax中数据的得到以及绑定的认识
  3. stm32f4xx 的EXTI使用的一般步骤
  4. eclipse中修改内存
  5. dyld: Library not loaded: @rpath/libswiftCore.dylib 解决方法
  6. IIS负载均衡-Application Request Route详解第三篇:使用ARR进行Http请求的负载均衡
  7. 字典树 ZOJ1109 HDU1251 PKU1204 HDU1075
  8. 圆章能随便刻吗_自己晒干的蒲公英能长期当茶随便喝吗?医生:3个危害不请自来...
  9. php中简单ubb案例,php Ubb代码编辑器函数代码
  10. ArcGIS Pro + PS 矢量化用地规划图
  11. 易班自动答题脚本_一款功能强大的答题小程序,更智能的在线考试系统,出好试卷,随机出题的微信小程序...
  12. Android Toast的立即取消与显示
  13. Matla + SVD 求解变换矩阵
  14. 田野调查手记·浮山摩崖石刻(二)
  15. mscorsvw.exe关闭方法
  16. 1 Bootstrap 4起步
  17. Markdown还能这么玩?这款开源神器绝了
  18. 重庆华侨城携手T.M.D PCP 发财潮流文化节2.0国庆重磅来袭
  19. Windows+CPU only+VS2013安装caffe以及配置Python接口
  20. MineMap地图web端定位问题处理

热门文章

  1. GL绘制自定义线条3_自定义线帽
  2. 时间序列数据预测的类型
  3. Redis集群(windows版本操作)
  4. Redis分布式集群部署安装及细节(多主机搭建集群开启多个服务)
  5. Aspose.Words for .NET v22.12.0 Crack
  6. 玩转Redis-京东签到领京豆如何实现
  7. OpenSuSE之新手常见问题
  8. blender学习记录 —— 广为人知的甜甜圈教程
  9. .NET Core/.NET5/.NET6 开源项目汇总9:客户端跨平台UI框架
  10. 操作系统的作用及各种操作系统的区别