0%

打印进程地址转换过程

打印进程地址转换过程

实验目的

  • 深入理解操作系统的段、页式内存管理,深入理解段表、页表、逻辑地址、线性地址、物理地址等概念;
  • 实践段、页式内存管理的地址映射过程;
  • 编程打印特定进程地址转换过程。

知识储备

线性地址和物理地址之间的变换

image-20220613200700988

页目录和页表的表项格式

image-20220613200727069

主内存区域

image-20220613200748502

进程代码和数据在其逻辑地址空间中的分布

image-20220613200817319

实验过程

修改sys.h

把debug_paging函数声明为全局变量,添加中断函数表。

image-20220613201246999

修改系统调用函数

把对应的函数个数进行修改

image-20220613201325695

增加系统调用号

需要在unistd.h 中修改,注意进行挂载。

运行 sudo ./mount-hdc 可以把虚拟机硬盘挂载在 oslab/hdc 目录下。
hdc/usr/include 目录下修改 unistd.h

image-20220613201526522

新增debug_paging.c文件

将完成的文件放入linux-0.01/kernel 目录下

image-20220613204253402

修改makefile

image-20220613201730179

编写test.c

image-20220613201838239

实现fprintk

image-20220613202027276

实验结果

image-20220613203314373

image-20220613203534624

image-20220613203427810

问题回答

  • 页表中正在使用的页表项是连续的吗?这体现了分页的什么优点?
1
不是。可以充分利用碎片的内存空间,提高空间利用率。
  • 你觉的分段是必要的吗?现在的 Linux (x86-64) 是怎么处理分段的?
1
不是。在64位模式下:处理器把CS/DS/ES/SS的段基都当作0,忽略与之关联的段描述符中的段基地址。因为在64位模式中,CPU可以访问所有可寻址的内存空间。x86工作在保护模式下时,分段单元将逻辑地址转换成线性地址,分页单元(MMU开启情况下)将线性地址转换成物理地址。当CPU启用了MMU,CPU核发出的地址将被MMU截获,从CPU到MMU的地址称为虚拟地址,而MMU将这个地址翻译成另一个地址发到CPU芯片的外部地址引脚上,也就是将虚拟地址映射成物理地址,在x86_64上,处理器把CS/DS/ES/SS的段基都当作0,实际上摒弃了段式管理,不再使用。指令中使用的地址就是线性地址,当CPU开启MMU时,通过页式管理单元翻译成物理地址。