linux内存管理机制--学习整理汇总(1)

linux 内核几种内存管理的方法,内存使用场景以及内存使用的那些坑

2、内存地址——用户态&内核态

用户态:Ring3 运行于用户态的代码则要受到处理器的诸多

内核态:Ring0 在处理器的存储保护中,核心态

用户态切换到内核态的 3 种方式:系统调用、异常、外设中断

区别:每个进程都有完全属于自己的,独立的,不被干扰的内存空间;用户态的程序就不能随意操作内核地址空间,具有一定的安全保护作用;内核态线程共享内核地址空间;

3、内存地址——MMU 地址转换

MMU 是一种硬件电路,它包含两个部件,一个是分段部件,一个是分页部件

分段机制把一个逻辑地址转换为线性地址

分页机制把一个线性地址转换为物理地址

linux内存管理机制--学习整理汇总(1)_第1张图片

 linux内存管理机制--学习整理汇总(1)_第2张图片

cs-----内存段寄存器,指向含有代码指令的段;cs寄存器还有一个重要的功能:用于区分用户模式和内核模式,它包含一个指定当前优先级别(CPL, current priviledge level)的的2比特的域。如果该域的值为0,表明优先级最高;如果该值为3,表明最低的优先级。 Linux只使用了0和3,用以区分内核模式和用户模式

ss-----堆栈段寄存器,指向包含当前程序栈的段;

ds-----数据段寄存器,指向包含静态和全局数据的段

ARM64处理器不支持完全的64位虚拟地址

虚拟地址的最大宽度是48位

内核虚拟地址在64位地址空间的顶部,高16位是全1,范围是[0xFFFF_0000_0000_0000, 0xFFFF_FFFF_FFFF_FFFF];

用户虚拟地址在64位地址空间的底部,高16位全是0,范围是[0x0000_0000_0000_0000, 0x0000_FFFF_FFFF_FFFF];

高16位是全1或全0的地址称为规范的地址,两者之间是不规范的地址,不允许使用。

linux内存管理机制--学习整理汇总(1)_第3张图片

vmalloc和kmalloc区别

1,kmalloc对应于kfree,分配的内存处于3GB~high_memory之间,这段内核空间与物理内存的映射一一对应,可以分配连续的物理内存; vmalloc对应于vfree,分配的内存在VMALLOC_START~4GB之间,分配连续的虚拟内存,但是物理上不一定连续。都是在内核态使用

2,vmalloc() 分的物理地址无需连续,而kmalloc() 确保页在物理上是连续的
3,kmalloc分配内存是基于slab,因此slab的一些特性包括着色,对齐等都具备,性能较好。物理地址和逻辑地址都是连续的。
4,最主要的区别是分配大小的问题,比如你需要28个字节,那一定用kmalloc,如果用vmalloc,分配不多次机器就罢工了。
    尽管仅仅在某些情况下才需要物理上连续的内存块,但是,很多内核代码都调用kmalloc(),而不是用vmalloc()获得内存。这主要是出于性能的考虑vmalloc()仅在绝对必要时才会使用,最典型的就是为了获得大块内存时,例如,当模块被动态插入到内核中时,就把模块装载到由vmalloc()分配的内存上

 linux内存管理机制--学习整理汇总(1)_第4张图片

 linux内存管理机制--学习整理汇总(1)_第5张图片

 

 

你可能感兴趣的:(linux,学习,运维)