分页式 分段式 段页式实现原理

在这篇博客中,来详细介绍一下程序地址空间的概念,一开始叫做进程地址空间。在内核当中创建一个进程,会有这个PCB(进程控制块),在这个PCB中,有一个内存指针struct mm_struct mm指向程序地址空间,或者叫做进程地址空间。
那么内核空间在哪里呢?
是在用户空间中,在这里讨论的都是以32位系统为参照的。这样自说很枯燥,上个图.
分页式 分段式 段页式实现原理
在父进程PCB中,内存指针指向虚拟地址空间,但是在系统调用出一个子进程的时候,虚拟地址空间是不会被fork出的。父子进程是抢占式执行的,这就是万恶之源,他们使用了同一个地址空间。这是为什么呢?因为进程虚拟地址空间是认为规定的,不能存储数据,要存储数据需要靠的是介质,也就是物理内存。物理内存里存放的是物理地址,那么逻辑地址会指向物理地址,存储数据时首先改变逻辑地址,然后通过一个叫做页表的结构,在页表这个结构中存放逻辑地址和物理地址,这个fork后也会拷贝给子进程。 所以页表的功能子进程也可以继承。
分页式 分段式 段页式实现原理
分页式 分段式 段页式实现原理
这上面就是基本的实现方式。
这种主要是需要一个写时拷贝:当数据发生修改的时候,才会分配一个物理内存,并且将页表当中的映射关系改掉。
接下来介绍三种存储方式

分页式:

前提:
会将虚拟地址空间分成一页一页的格式,会将物理内存分为一块一块一块的格式
这个块的大小分成4096
分页式逻辑地址组成为页号和页内偏移
页号指向块号:块起始地址+页内偏移
假设虚拟地址为5000,请你计算物理地址,页号,页内偏移(块号为4096)
页号=虚拟地址/块大小 5000/4096=1
页内偏移=虚拟地址%块的大小 5000%4096=4
快的起始地址=块号块大小 54096
物理地址=块的起始地址加页内偏移
分页式 分段式 段页式实现原理

分段式

将虚拟地址映射成为物理地址的结构不是页表而是段表
虚拟地址的构成为段号和段内偏移
对比分页式和分段式的优缺点
分页式数据存储效率高,分段式效率低
分段式对程序很友好,可以通过段表的结构,可以找到虚拟地址空间的一段
段号 段起始地址
通过段号拿到段起始地址+段内偏移==物理地址
分页式 分段式 段页式实现原理
分页式和分段式的优缺点
分页式数据存储效率高,分段式效率低
分段式对程序很友好,可以通过段表的结构,找到虚拟地址空间的一段。

段页式

存储的时候采用了段表结构和页表结构
虚拟地址的构成
段号 页号 页内偏移
通过段号在段表中找到了页的起始地址,因为在段表中存放的式段号和页的起始地址
通过页的起始地址指向页表中的页号 在页表中存放的式页号和块号
通过块号指向物理空间找到一个起始块,得到它的块的起始地址。
然后块的起始地址+页内偏移===物理地址
给了一个段号,对应数据段的,然后在这之中分成页,建立一个页表更好管理。
分页式 分段式 段页式实现原理