网站建设费的摊销期,直通车关键词怎么选 选几个,孝感市建设局网站,wordpress term group认真阅读章节资料#xff0c;掌握什么是分页机制
调试代码#xff0c;掌握分页机制基本方法与思路
代码pmtest6.asm中#xff0c;212行~237行#xff0c;设置断点调试这几个循环#xff0c;分析究竟在这里做了什么
掌握PDE#xff0c;PTE的计算方法
动手画一画这个映…认真阅读章节资料掌握什么是分页机制
调试代码掌握分页机制基本方法与思路
代码pmtest6.asm中212行~237行设置断点调试这几个循环分析究竟在这里做了什么
掌握PDEPTE的计算方法
动手画一画这个映射图为什么代码3.22里面PDE初始化添加了一个PageTblBase(Line 212)而PTE初始化时候没有类似的基地址呢Line224
熟悉如何获取当前系统内存布局的方法
掌握内存地址映射关系的切换
画出流程图
基础题依据实验的代码
自定义一个函数给定一个虚拟地址能够返回该地址从虚拟地址到物理地址的计算过程如果该地址不存在则返回一个错误提示。完善分页管理功能补充alloc_pages, free_pages两个函数功能试试你能一次分配的最大空间有多大如果超出了有什么办法解决呢
进阶题选做
设计一个内存管理器选择其一实现首次适应算法、最佳适应算法、伙伴算法要求实现内存的分配与回收。提示均按照页为最小单位进行分配、对于空闲空间管理可采用位图法或者双向链表法管理 什么是分页机制
分页机制就是通过页目录和页表将物理地址与线性地址进行映射
页就是指一块内存一般来说大小在4 KB。
分页机制使进程运行在线性地址上不必关注物理地址的情况提供了虚拟内存和隔离机制是内存的调度完全由操作系统负责。
分页机制实现的基本方法
分页机制使用二级页表实现
第一级叫页目录大小4 KB共1024表项PDE表项对应一个二级页表
第二级页表1024个表项PTE每个表项对应一个物理页
线性地址转换时
寄存器cr3指定页目录线性地址高十位为页目录索引线性地址第二个十位为二级页表索引
注PDEPTEcr3寄存器都由高二十位进行寻址这是因为页表地址都是4 KB对齐的。
分页机制的标志
cr0寄存器 的 最高位 PG位PG位为1表示分页机制生效
调试 pmtest6.asm
212行----237行 分析
.1 部分是在初始化目录页大小为4096将目录页首地址存在目录页的第一个表项中
.2部分实在初始化其他页表一共1024个页表需要1024 x 1024。
.3预备阶段将目录页基地址赋给cr3将cr0的PG位置1启动分页机制。
magic break断点调试 PDE和PTE的计算方法
映射图 为什么PDE添加了基地址PTE不添加基地址
???不清楚可能PDE是指向页表的映射而页目录本身也是一个页表。PTE是指向物理页的映射所以不存自己页表的地址。
也可能cr3不存页目录基地址只能页目录自己来存而PTE所在页表的基地址在页目录中存放不需要自己额外存。
如何获取当前系统内存布局
使用中断15 h
参数
eax获取内存信息ax赋值0E820h
ebx放置着“后续值continuation value”第一次调用时ebx必须为0。
es : di :指向一个地址范围描述符结构ARDS (Address Range Descriptor Structure) BIOS将会填充此结构。
ecx : es : di所指向的地址范围描述符结构的大小以字节为单位。无论es: di所指向的结构如何设置BIOS最多将会填充ecx个字节。不过通常情况下无论ecx为多大BIOS只填充20字节有些BIOS忽略ecx的值总是填充20字节。
edx 0534D4150hSMAP──BIOS将会使用此标志对调用者将要请求的系统映像信息进行校验这些信息会被BIOS放置到es :di所指向的结构中。
结果
CF CF 0表示没有错误
eax 0534D4150hSMAP
es: di 返回的地址范围描述符结构指针与输入值相同
ecx BIOS填充在地址范围描述符中的字节数量一般是20字节
ebx 下次迭代时原封不动放入ebx就可以通过它获取下一个地址范围描述符如果ebx值为0且CF没有进位表示是最后一个地址描述符
地址描述符结构ARDS20个字节 注调用int 15 h时返回的地址描述符需要存放在一个缓冲区中我们要事先定义一个缓冲区
pmtest7.asm分析
定义256字节的缓冲区es: di指向缓冲区 CF被置位或ebx为0循环结束。
di每次增20字节存一个描述符 内存地址映射关系的切换 6.1 线性地址到物理地址
代码如下
; 显示地址计算过程并进行检查 -----------------------------------------
AddressCheck:mov ax, SelectorFlatRWmov ss, axmov eax, LinearAddrDemoshr eax, 22mov ecx, eaxshl ecx, 2add ecx, PageDirBase1mov eax, ss:[ecx]mov ebx, eaxpush ecxcall DispIntpop ecxshr ebx, 12shl ebx, 12push ebxcall DispIntpop ebxmov eax, LinearAddrDemoshl eax, 10shr eax, 22mov ecx, eaxshl ecx, 2add ebx, ecxmov eax, ss:[ebx]shr eax, 12shl eax, 12push eaxcall DispIntpush ProcBarcall DispIntret
效果展示 6.2 分页管理功能完善
alloc_pages的实现
alloc_pages用于连续物理内存的分配 struct page *alloc_pages(gft_t gfp, unsigned int order) alloc_pages函数用于分配2^order个 连续 的物理页。分配失败返回NULL。
free_pages的实现
void free_pages(unsigned long addr, unsigned int order) 功能:释放逻辑地址addr开始的页面2^order次方个 addr: 页面开始的逻辑地址 order: 释放页面的个数2^order个 实验结果总结
分页和分段有何区别在本次实验中段页机制是怎么搭配工作 的PDE、PTE是什么例程中如何进行初始化CPU是怎样访问 到PDE、PTE从而计算出物理地址的开启分页机制之后在GDT表中、在PDE、PTE中存的地址是物理地址、线性地址还是逻辑地址为什么为什么PageTblBase初始值为2M4K能不能比这个值小怎么读取本机的实际物理内存信息如何进行地址映射与切换如何实现alloc_pages, free_pages 1.分页和分段有何区别在本次实验中段页机制是怎么搭配工作的
区别在于1、从功能上看页是信息的物理单位分页是为实现离散分配方式以消减内存的外碎片提高内存的利用率即满足系统管理的需要而不是用户的需要而段是信息的逻辑单位它含有一组其意义相对完整的信息目的是为了能更好地满足用户的需要。2、页的大小固定且由系统确定而段的长度却不固定决定于用户所编写的程序。3、分页的作业地址空间是一维的而分段的作业地址空间是二维的。
在本次实验中未打开分页机制时线性地址等同于物理地址即逻辑地址通过分段机制直接转化为物理地址由SEG找到对应Descriptor定义的段OFFSET启动了分页机制后要先通过分段机制将逻辑地址转化为线性地址在通过分页机制将线性地址转化为物理地址。首先将页目录的段首地址设置为PageDirBase再将页表的段首地址设置为PageTblBase在页目录中每个表项都指向一个页表而每个页表的表项都指向一个物理地址从而实现了从线性地址到物理地址的映射以及离散分配。
2. PDE、PTE是什么例程中如何进行初始化CPU是怎样访问到PDE、PTE从而计算出物理地址的
PDEPage Directory Entry是页目录表的表项PTEPage Table Entry是页表的表项。例程中初始化的方式是通过循环将每一个PDE初始化成存在的可读可写可执行的用户级别页表其中第一个PDE对应的页表首地址是PageDirBase。类似的页表中每个PTE都被初始化为可读可写可执行的用户级别页表其中第一个页表的首地址是PageTblBase。CPU首先根据分段机制找到描述符所对应的段并加上偏移得到线性地址得到线性地址之后CPU会借助cr3在指定的目录页中根据线性地址的高十位得到页表地址然后再根据线性地址的第二十一位到第十二位在页表中得到物理页首地址最后加上第十二位偏移从而计算出物理地址。
3. 开启分页机制之后在GDT表中、在PDE、PTE中存的地址是物理地址、线性地址还是逻辑地址为什么
在查询GDT表后得到线性地址首先通过选择子确定对应描述符是GDT表中的第几项然后取出段首地址加上逻辑地址的偏移最终得到线性地址。PDE和PTE存放的都是物理地址分别指向页表和真实地址。
4. 为什么PageTblBase初始值为2M4K能不能比这个值小
因为设置页目录表起始位置为2M而页目录表占4K且页目录表与页表在内存中相邻所以是2M4K。在保证寻址大小为4G不变的情况下减小初始值可以选择前移页目录表的起始位置。
5. 怎么读取本机的实际物理内存信息
利用中断15h后循环读取ARDS结构。先填充如下寄存器eax int 15h可完成许多工作主要由ax的值决定要获取内存信息需要将ax赋值为0E820hebx寄存器放置着后续值第一次调用时ebx必须为0。es: di 指向一个地址范围描述符结构ARDS而BIOS将会填充此结构。ecxes:di所指向的地址范围描述符结构的大小以字节为单位。无论es:di所指向的结构如何设置BIOS最多将会填充ecx个字节。edx 0534D4150hSMAP──BIOS将会使用此标志对调用者将要请求的系统映像信息进行校验这些信息会被 BIOS放置到es:di所指向的结构中。
中断调用之后结果存放于下列寄存器之中。CF CF0表示没有错误否则存在错误。eax 0534D4150hSMAP。es: di 返回的地址范围描述符结构指针和输入值相同。ecx BIOS填充在地址范围描述符中的字节数量被BIOS所返回的最小值是20字节。ebx 这里放置着为等到下一个地址描述符所需要的后续值如果 它的值为0并且CF没有进位表示它是最后一个地址范围描述符。
6. 如何进行地址映射与切换
通过改变cr3来转换地址映射。改变cr3从而切换页目录表从而切换页表从而使得同一个线性地址映射到不同的物理地址。
7. 如何实现alloc_pages,free_pages
alloc_pages的实现
alloc_pages用于连续物理内存的分配 struct page *alloc_pages(gft_t gfp, unsigned int order) alloc_pages函数用于分配2^order个 连续 的物理页。分配失败返回NULL。
free_pages的实现
void free_pages(unsigned long addr, unsigned int order) 功能:释放逻辑地址addr开始的页面2^order次方个 addr: 页面开始的逻辑地址 order: 释放页面的个数2^order个