Linux系统中为什么不适用物理地址而是使用虚拟地址

1、物理地址

    物理地址实际上就是硬件设备上实际的存储设备

2、虚拟地址

    虚拟地址是Linux内核虚拟出来的地址,经由MMU内存管理单元映射到实际的物理地址。MMU是实际的管理内存的硬件。

3、直接使用物理地址

    如果直接使用物理地址的话:

    (1)安全风险

            每个进程都可以访问0-4G的任意的内存空间,这也就意味着任意一个进程都能够去读写系统相关内存区域,如果是一个

    木马病毒,那么他就能随意的修改内存空间,让设备直接瘫痪

    (2)地址不确定

            众所周知,编译完成后的程序是存放在硬盘上的,当运行的时候,需要将程序搬到内存当中去运行,如果直接使用物理地址的话,我们无法确定内存现在使用到哪里了,也就是说拷贝的实际内存地址每一次运行都是不确定的,比如:第一次执行a.out时候,内存当中一个进程都没有运行,所以搬移到内存地址是0x00000000,但是第二次的时候,内存已经有10个进程在运行了,那执行a.out的时候,内存地址就不一定了

     (3)效率低下

            如果直接使用物理内存的话,一个进程就是作为一个整体(内存块)操作的,如果出现物理内存不够用的时候,我们一般的办法是将不常用的进程拷贝到磁盘的交换分区中,好腾出内存,但是如果是物理地址的话,就需要将整个进程一起拷走,这样,在内存和磁盘之间拷贝时间太长,效率较低。

4、虚拟地址实现

    虚拟地址实际上就相当于在物理地址和进程间引入一个第三者,一般实现方法有两种:分段映射和分页映射。


                                                                        分段映射(来源网络)

    分段映射能够解决安全隐患、地址不确定问题,但是对于效率问题仍然没有很好的解决。因此引出了新的方法:分页方式。分页的方式实际上就是讲内存以4KB为单位分页(一页4KB),然后在Linux内核中提供页项目表、页表,一个大小占多个页的进程,在运行的时候,并不是所有的也都在运行,这时候将运行的页拷贝到内存,这样就缓解了效率的问题。

                        

5、进程虚拟4G内存空间

    对于硬件来说只有4G的实际物理地址,每个程序在编译的时候,都在链接阶段,将elf程序虚拟地址设置在0x8048000开始,解决程序运行地址不固定的问题

猜你喜欢

转载自blog.csdn.net/CSDNmianfeixiazai001/article/details/79416949