Linux_内存、虚拟内存

一、内存的管理方案
分区:固定分区:操作系统启动时将内存分配完成
                            大小相等的固定分区:将内存分配成大小相等的区块,会产生内部碎片
                            放置策略:为每一个区块维护一给队列,为整体维护一个等待队列
                            大小不等的固定分区:将内存分配成大小不等的区块,会产生内部碎片
                            放置策略:将程序放到能够容纳的最小分区,放到当前能够容纳的最小空闲分区
                            加载进程时,一个进程只能占一个分区,
           动态分区:进程执行时,才会动态分配内存,会产生外部碎片,
           动态分区的三种方式:
                            首次适配:按分区在内存的先后次序,从上次分配的分区起找到合适的第一个
                            临近适配: 从上一次放置的地方开始扫描,找下一个合适的空闲分区
                            最佳适配:按分区在内存的次序从头查找,找到相差最小的空闲分区

分页:在大小相等的固定分区上的扩展,操作系统会将内存分区成固定大小的区块(4k),称为“页”,将页分成表。操作系统会为每一个进程维护一个页表,一个进程可以占有多个页帧,同一个进程加载到空间上的区块可以不连续, 页帧*4k+偏移 = 逻辑地址

分段:动态分区上的扩展,与分页类似,加载进程时根据进程断加载,一个进程可以被分为多个段,操作系统为每一个进程维护一个段表,一个进程可以占有多个段表,同一个进程的所有段可以不连续,段号、基地址、段大小

分段分页的相同:
都采用离散分配方式,都通过地址映射机构来实现地址变换
分段分页的不同:
1、分页是为了实现离散分配方式,以减少内存的碎片,提高内存的利用率,分页仅仅是由于系统管理的需要。段是信息的逻辑单位,它含有一组其意义相对完整的信息,分段的目的是为了更好地满足用户的需要。
2、一条指令或一个操作数可能会跨越两个页的分界处,而不会跨越两个段的分界处。
3、页大小固定且由系统决定,把逻辑地址划分为页号和页内地址两部分,由机器硬件实现的。段的长度不固定,决定于用户所编写的程序,通常由编译系统在对源程序进行编译时根据信息的性质来划分。
4、逻辑地址表示:页式系统地址空间是一维的,即单一的线性地址空间,程序员只需利用一个标识符,即可表示一个地址。分段的作业地址空间是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。
5、段表比页表短,可以缩短查找时间,提高访问速度。

伙伴系统:分配内存时,如果可用的内存空间较大,则将其一分为二,称为伙伴分区,直到分配的空间不能再次分割(再分割会小于申请空间),就将其中一个分配给申请的进程,当内存释放后,如果其伙伴分区空闲,则合并两个分区

交换分区:扩充出来的内存,在磁盘上开辟的一块空间,以内存的方式管理,作为对内存的扩充,当内存不足时,可以将内存上的部分数据放在交换分区。使得内存上可以驻留更多的进程,每一个进程都可以将数据放在交换分区,使得系统可以允许比内存大的进程

段页式:分段和分页结合的存储组织方法,可充分利用分段和分页的优点。
用分段方法来分配和管理虚拟存储器。程序的地址空间按逻辑单位分成基本独立的段,而每一段有自己的段名,再把每段分成固定大小的若干页。用分页方法来分配和管理实存。即把整个主存分成与上述页大小相等的存储块,可装入作业的任何一页。程序对内存的调入或调出是按页进行的。但它又可按段实现共享和保护。

二、Linux下32位系统的进程的4G虚拟地址空间布局


实模式与保护模式:

80X86体系:
CPU位数:ALU宽度、CPU的计算能力
地址总线:CPU的寻址能力

实地址模式下的地址映射:   
DS<<4                  +                        IP                              =                   物理地址        
段基地址                +          偏移地址/偏移量/逻辑地址       =                   物理地址

保护地址模式下的地址映射:
二级页面映射

三、地址映射
在x86体系之前是16位地址空间,也就是2^16 = 64k,但是在x86之后,变成了20位地址空间,为了兼容16位地址空间,我们定义大小为个20位的段,我们从16位开始开始使用,低4不使用,即规定段的大小为16的倍数,段的起始位置是16的倍数,段的大小范围是0--64k,从而更好的兼容16位与20位地址空间。

在段的机制中,我们需要记录段的起始地址,段的长度以及权限。在32位系统中,16位的寄存器就不足以用来记录信息,引入两个32位的寄存器:GDTR全局段描述符表寄存器,LDTR局部段描述符表寄存器。

为了计算物理地址采用16位的寄存器:CS(代码段寄存器)、DS(数据段寄存器)、SS(堆栈段寄存器)、ES(附加段寄存器),以及指令指针寄存器IP的值(偏移寄存器),来进行计算。

16位寄存器:将寄存器划分为三部分,段选择子13位(2^13 = 8192,操作系统:12,用户:8180)、TI描述符表寄存器标志位1位,RPL用户态内核态标记2位

段描述符表项的定义


64位
B:32位基地址
L:20位段长度,2^20 = 1M
G:段长度单位 0:byte     1M * 1byte = 1M
                          1:页(4k)  1M *  4k   =   4G

CR0:最高PG位 0  1 内存是否开启分页机制
CR2:发生缺页异常的虚拟地址
CR3:页目录的起始地址
CR4:PAE位,物理地址扩展 0 1

保护地址模式下的地址映射:
IPE:IP 32位地址记录偏移量

二级页面映射:

PT大小为4M,可以放在交换分区减少内存资源的使用,在段页式系统中,为了获得一条指令或数据,须三次访问内存。第一次访问是访问内存中的段表,从中取得页表始址;第二次访问是访问内存中的页表,从中取出该页所在的物理块号,并将该块号与页内地址一起形成指令或数据的物理空间;第三次访问才是真正从第二次访问所得的地址中,取出指令或数据。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值