内存管理的主要工作就是对物理内存进行组织,然后对物理内存的分配和回收。但是Linux引入了虚拟地址的概念。
虚拟地址的作用如果用户进程直接操作物理地址会有以下的坏处:1、 用户进程可以直接操作内核对应的内存,破坏内核运行。2、 用户进程也会破坏其他进程的运行CPU 中寄存器中存储的是逻辑地址,需要进行映射才能转化为对应的物理地址,然后获取对应的内存。通过引入逻辑地址,每个进程都拥有单独的逻辑地址范围。当进程申请内存的时候,会为其分配逻辑地址和物理地址,并将逻辑地址和物理地址做一个映射。所以,Linux内存管理涉及到了以下三个部分:动态映射分为三种:1>、动态内存映射: 使用完对应的物理内存后,就可以映射其他物理内存了。2>、永久内存映射: 一个虚拟地址只能映射一个物理地址。如果需要映射其他物理地址,需要解绑。3>、固定内存映射: 只能被某些特定的函数来调用引用物理地址。动态内存映射和直接映射的区别动态映射和直接映射的区别就是逻辑地址到物理地址的转化规则。直接映射直接映射的规则是死的,一个逻辑地址对应的物理地址是固定的。通过逻辑地址加或者减去一个数,就可以得到对应的物理地址。动态映射动态映射是动态的绑定,每个逻辑地址对应的物理地址是动态的,通过页表进行查询。用户空间映射:用户空间采用动态映射,每个虚拟地址可以被映射到一个物理地址,映射到ZONE_HIGHMEM。为什么用户空间不采用直接映射呢?因为物理内存是多个进程所有的,每个进程都有一个用户空间。如果采用直接映射的话,对应的物理地址是会冲突的。其用户空间的逻辑地址大小都为 3G,所以存在逻辑地址相同,但是对应的物理地址不同。需要通过页表来转化,一个进程会对应一个页表。
全部0条评论
快来发表一下你的评论吧 !