Linux内存管理子系统

地址类型:
    a.物理地址:出现在CPU外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果
    b.线性地址(虚拟地址):
    c.逻辑地址:在程序经过编译后,在汇编程序中使用的地址

CPU要将一个逻辑地址转换为物理地址,需要两步:首先CPU利用段式内存管理单元,将逻辑地址转换成虚拟地址,再利用页式内存管理单元,把线性地址最终转换为物理地址

 

段式管理:
16位的CPU内部有20位的地址线,他的寻址范围就是2的20次幂,也就是1M的内存空间。但是16位的CPU用于存放地址的寄存器只有16位,因此只能访问65535个内存单元,64K
为了能够访问1M的内存空间,CPU在内部加入了 段寄存器。16位的CPU把1M的内存空间分为若干个逻辑段,每个逻辑段的要求如下:
    1.逻辑段的起始地址(段地址)必须是16的整数倍,即最后四个二进制位全为0
    2.逻辑段的最大容量为64K
    物理地址的形成方式:段地址寄存器左移4位得到实际的段地址,用实际的段地址加上偏移地址,就可以唯一的确定内存单元的物理地址
    例如:CS+IP寄存器用于代码段的访问,SS+SP用于堆栈段的访问,DS+BX用于数据段的访问,ES+BX用于附加段的访问
    在32位的PC中仍然采用分段管理模式,其采用了两种不同的工作方式:实模式和保护模式
实模式:32位CPU的内存管理与16位的CPU是一致的
保护模式:段基地址长达32位,每个段最大容量可达4G,段寄存器的值是段地址的选择器,用该选择器从内存中得到一个32位的段地址,存取单元的物理地址就是该段地址加上段内偏移量

 

分页管理:
    从管理和效率的角度出发,线性地址被分为固定长度的组,称为页(Page),例如32位的机器,线性地址最大可为4G,如果采用4KB为一个页的话,整个线性地址就被划分为2的20次幂个页

 

Linux内存管理
    Linux内核的设计并没有全部采用inter多提供的段机制,这不仅简化了Linux内核的设计,也为移植创造了条件,因为很多RISC处理器并不支持段机制
    所有段的基地址均为0,由此可以得出,每个逻辑地址的空间范围为0~4GB,由于每个段的基地址均为0,因此,逻辑地址到线性地址的映射保持不变。所有他完全利用的是分页管理。Linux2.6.29采用的是四级分页管理,并保持向下兼容。

 

虚拟内存
    Linux操作系统采用虚拟内存管理技术,使得每个进程都有独立的进程地址空间,用户空间的大小为3G,用户看到的和接触的都是虚拟地址,这种方法不但能起到保护操作系统的作用,还可以使用户程序使用比实际物理内存更大的地址空间
    Linux将4G的细腻地址空间划分为两个部分--用户空间和内核空间。用户空间从0到3G,内核空间从3G到4G,用户进程通常只能访问用户空间的虚拟地址,不能访问内核空间的虚拟地址。例外的情况是用户进程通过系统调用或者是中断访问内核空间。
    每当进程发生切换的时候,用户空间会跟着变化。
    创建进程fork(),程序载入execve(),动态分配内存malloc()等进程相关操作都需要分配内存给进程。这时进程申请和获得的不是物理地址,仅仅是虚拟地址。


内核内存分配
在应用程序中常使用malloc函数来进行动态内存分配,而在Linux内核中,通常是使用kmalloc函数来动态分配内存
kmalloc原型:
#include <linux/slab.h>
void *kmalloc(size_t size,int flags)
size:需要分配的内存的大小
flags:分配标志,他控制kmalloc的行为


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值