x86系统上的内存分页
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系统上的内存分页相关推荐
- linux下实现内存监视,shell脚本来监视Linux上的内存使用情况
shell脚本来监视Linux上的内存使用情况 监视所有内容,例如CPU利用率,内存利用率,交换利用率,磁盘空间利用率等等. 如果您只有很少的系统并且要监视它们,那么编写一个小的Shell脚本可以使您 ...
- sql2005性能优化(在32位系统上突破2G内存使用量的方法)
服务器磁盘为(SAS)IBM组成RAID0+1,SQL2K5只识别4G内存,实际只占用2G内存.而使用 AWE的话,应用程序可以直接将操作系统允许的最大物理内存量保留为未分页的内存.使用 AWE 使 ...
- 鸿蒙os吃内存吗,终于上手机!华为鸿蒙 OS 2.0 系统:128KB 内存就能跑
终于上手机!华为鸿蒙 OS 2.0 系统:128KB 内存就能跑 2020-09-11 10:51:48 0点赞 0收藏 0评论 9月11日消息,华为昨天下午在东莞松山湖举办了全球开发者大会,本次大会 ...
- linux系统snmpd服务内存偏高,Red Hat Enterprise Linux 5.4 64位系统SNMP内存泄漏(上)
1.SNMP的内存泄漏问题 SNMP的内存泄漏问题,我最早是在CDN的一台负载均衡调度机上看到的.一个snmpd进程,占用的VIRT将近4G.重启snmpd后VIRT降到150M左右,机器为Red H ...
- 64位系统上运行32位程序的内存限制
64位系统上运行32位程序能否申请到8G内存? 收藏到手机 转发 评论 2010-01-20 10:56 申请不到,因为64为系统在运行32位程序的时候只是为了向下兼容而已,对于32位程序来 ...
- linux安装文件多大空间,你的Linux系统上安装了多少内存?又使用了多少?
[51CTO.com快译]几个命令可报告Linux系统上安装和使用了多少内存.你可能淹没于细节,也可能获得快速简易的答案,这看你使用哪个命令. 有好多方法可以获取Linux系统上已安装内存方面的信息, ...
- 线上系统的JVM内存是否设置的越大越好?
"线上系统的JVM内存是否设置的越大越好?"乍一听到这个问题,我第一个反应就是"NO",但是,具体为什么不行,又说不出什么所以然来. 其实,说一个东西不行,我们 ...
- mac catalina删除系统多余文件 内存不足_macOS Catalina Patcher(如何在旧mac上安装Catalina系统)...
macOS Catalina Patcher是一款macOS Catalina修补程序,可以在旧mac上安装最新的Catalina系统工具.macOS Catalina 10.15是Apple受欢迎的 ...
- 操作系统学习:内存分页与中断
本文参考书籍 1.操作系统真相还原 2.Linux内核完全剖析:基于0.12内核 3.x86汇编语言 从实模式到保护模式 ps:基于x86硬件的pc系统 内存分页机制 内存信息的获取 在进行内存分页之 ...
最新文章
- HTTP服务器端常用推送技术
- 对ajax中数据的得到以及绑定的认识
- stm32f4xx 的EXTI使用的一般步骤
- eclipse中修改内存
- dyld: Library not loaded: @rpath/libswiftCore.dylib 解决方法
- IIS负载均衡-Application Request Route详解第三篇:使用ARR进行Http请求的负载均衡
- 字典树 ZOJ1109 HDU1251 PKU1204 HDU1075
- 圆章能随便刻吗_自己晒干的蒲公英能长期当茶随便喝吗?医生:3个危害不请自来...
- php中简单ubb案例,php Ubb代码编辑器函数代码
- ArcGIS Pro + PS 矢量化用地规划图
- 易班自动答题脚本_一款功能强大的答题小程序,更智能的在线考试系统,出好试卷,随机出题的微信小程序...
- Android Toast的立即取消与显示
- Matla + SVD 求解变换矩阵
- 田野调查手记·浮山摩崖石刻(二)
- mscorsvw.exe关闭方法
- 1 Bootstrap 4起步
- Markdown还能这么玩?这款开源神器绝了
- 重庆华侨城携手T.M.D PCP 发财潮流文化节2.0国庆重磅来袭
- Windows+CPU only+VS2013安装caffe以及配置Python接口
- MineMap地图web端定位问题处理
热门文章
- GL绘制自定义线条3_自定义线帽
- 时间序列数据预测的类型
- Redis集群(windows版本操作)
- Redis分布式集群部署安装及细节(多主机搭建集群开启多个服务)
- Aspose.Words for .NET v22.12.0 Crack
- 玩转Redis-京东签到领京豆如何实现
- OpenSuSE之新手常见问题
- blender学习记录 —— 广为人知的甜甜圈教程
- .NET Core/.NET5/.NET6 开源项目汇总9:客户端跨平台UI框架
- 操作系统的作用及各种操作系统的区别