操作系统中内存使用与分段

计算机运行本质

计算机运行的本质是取址执行。
1、这里的取址就是从内存中的某个地址处取得指令,然后放入CPU中进行解析该指令
2、这里的执行就是在CPU解析完该指令后,按照该指令的意愿去处理一些任务,比如读数或写数。

内存中的物理地址与程序中的虚拟地址

计算机操作系统上电运行时会把存储在磁盘上的程序指令读入到内存中。我们知道程序每次运行一个周期都会取址一次,这里的地址就是对应着我们在写程序时对各函数或变量赋值的地址。不过计算机取址的地址是内存的地址,被称为物理地址。我们在编写程序的时候其实并不知道将来这段程序具体在内存中哪个位置跑的,所以我们只好用虚拟地址来暂时表明程序要在内存中占用的位置。

程序地址运行时重定位

当我们知道程序运行在内存中的具体位置时,我们可以在编写程序、编译、载入内存等阶段将虚拟地址换算为计算机取址的地址。但是这些方法不够灵活,因为操作系统的进程多了后,不好为某些进程分配指定的内存区间。所以通用操作系统采用了另一种策略,在操作系统每次取址前都会将程序中的虚拟地址换算成物理地址后,再获取指令执行。这种就特别灵活方便了,编程者在编程时不用考虑自己的程序具体在哪一片内存中存放,这些都由操作系统搞定。这种策略也叫作运行时重定位策略。

操作系统中如何实现运行时的重定位策略

操作系统中维护了一张GDT表,该表维护着每个进程段的基地址,这样在切换到每个进程前,会读取到对应的基地址,然后将读取到的基地址加上自己在程序中写的逻辑地址就是即将要取址的地址,即内存的物理地址。GDT表如下图所示:
GDT表
这样靠着这张GDT表就可以实现程序运行时的重定位策略。

内存分段

1、内存中分为文本段、数据段、bss段。可是为什么要这样分呢?假如不分段,那样一个程序中执行指令和数据会杂糅在一起并保存在内存中,由于执行指令写到内存后不能被用户修改的,属于只读属性的。而程序中的数据是可读可写的,所以当计算机取址执行时还要判断该对应内存地址下的是指令还是数据,这个样就不好判断了。所以我们将指令与数据用地址区间来分开,这样计算机在取址时通过判断地址就可以知道取的是指令还是数据,便于执行程序。所以人们为了计算机方便,就将程序中的具有相同属性的内容放到同一块内存片段。

2、内存分段后,程序运行中重定位时不用把程序中所有的内容重定位一次,提高效率,比较灵活。

总结

分析内存使用时最好配合代码分析,待完善。

猜你喜欢

转载自blog.csdn.net/m0_38099380/article/details/88780966