逻辑地址:CPU所生成的地址。逻辑地址是内部和编程使用的、并不唯一。
物理地址:加载到内存地址寄存器中的地址,内存单元的真正地址。
虚拟地址:
内碎片:分配给进程的内存,但是部分未能被利用到
外碎片:某种存储管理方法下无法被分配的片段
操作系统内存管理方式:
1)重定位
2)分段分页机制
3)虚拟内存
分页存储方式
分页机制:就是把内存地址空间分为若干个很小的固定大小的页,LINUX中固定为4KB。最大的作用是使得进程的物理地址空间可以是非连续的。
逻辑地址的组成:前部分是页码后部分是页偏移。逻辑地址和物理地址的关系:例:逻辑地址是23B,则逻辑地址到物理地址的映射为:4*5+3;5为页号,3为偏移量。
页号:分页存储管理将进程的逻辑地址空间分成若干页,并将这些页从0开始编号。
物理块:把内存的物理地址分成若干块。
页表:描述逻辑地址到物理地址转换的对应关系
分段存储方式
分段机制:把虚拟地址空间中的虚拟内存组织成一些长度可变的内存单元,用于存放程序的代码、数据和堆栈。
逻辑地址的组成:段名称和偏移
分页和分段的区别?
相同点:都采用离散分配,都是采用地址映射机构来实现地址转换。
不同点:段是信息的逻辑单位,根据用户的需求进行划分,大小不固定由功能决定;页是信息的物理单位,为了管理主存的方便而划分的,对用户透明。
虚拟内存
实现方式:
1)请求分页存储管理。
2)请求分段存储管理。
3)请求段页式存储管理。
CPU 通过一个虚拟地址来访问主存,这个虚拟地址在被送到主存之前会先转换成一个物理地址。将虚拟地址转换成物理地址的任务叫做地址翻译
为何引入虚拟地址:
1)方便操作系统使用内存
2)方便进程间的隔离
3)方便编译器和操作系统安排程序的地址分布
为何虚拟空间采用页机制?
通过段机制转换得到的地址仅仅是作为一个中间地址——线性地址,该地址不代表实际物理地址,而是代表整个进程的虚拟空间地址;在线性地址的基础上,页机制接着会处理线性地址映射:当需要的线性地址(虚拟空间地址)不在内存时,便以页为单位从磁盘中调入需要的虚拟内存;当内存不够时,又会以页为单位把内存中虚拟空间的换出到磁盘上。
虚拟内存的组成:
malloc(),vmalloc()和kmalloc()
1、vmalloc()和kmalloc()是分配内核内存,malloc分配用户内存
2、kmalloc保证分配的内存是物理上连续的,vmalloc保证的在虚拟地址空间上连续,malloc不保证
3、kmalloc内存分配有限
4、内存只有在被DMA访问的时候才需要物理上连续
进程控制块:PCB,存放进程信息的结构体tast_struct。
内存管理:MMU,
1)虚拟地址到物理地址的映射
2)cache缓存控制
3)内存访问权限保护
虚拟文件:VFS,提供一层抽象,屏蔽底层各种文件的差异。
重定位
什么是重定位?
重定位就是在链接地址跟运行地址不同的情况下,执行一段位置无关码,这段位置无关码的作用就是将原来的那份代码全部复制到链接地址那里去,然后自己再长跳转到新的那份代码的刚刚执行的那个位置。这样就实现了链接地址跟运行地址一致的情况了。