蛋疼的概念,总是让人琢磨不透,每每遇到这些形似的名词,我总感觉是我小学时候近义词练习做少了。因为每次我都要花很多时间才能真正的能够说服自己的搞懂这些概念。
逻辑地址:很简单,就是你源程序里使用的地址,或者源代码经过编译以后编译器将一些标号,变量转换成的地址,或者相对于当前段的偏移地址。
线性地址:这个地址很重要,也很不容易理解。分段机制下CPU寻址是二维的地址即,段地址:偏移地址,CPU不可能认识二维地址,因此需要转化成一维地址即,段地址*16+偏移地址,这样得到的地址便是线性地址(在未开启分页机制的情况下也是物理地址)。这样有什么意义呢?或者说这个一维地址的计算方法随便一个学计算机的人都知道,但是你真的理解它的意思吗?要想理解它的意思,必须要知道什么是地址空间,下文详述。
物理地址:很简单,将内存条看出一个大的数组,下标从0开始到0xFFFFFFFF,其中任意一个下标标记一个内存条上的一个字节的存储空间
虚拟地址:虚拟地址就是逻辑地址,又叫虚地址
地址空间:这个很重要,不理解地址空间,你就不理解进程,不理解用户空间,不理解内核空间,不理解虚拟存储,不理解分页机制,你就没学过计算机。操作系统为了支持多任务,保护各个任务合理的共享和隔离一些数据和代码,还为了其他很多原因,必须要让每个任务都有自己的地址空间,就是说你在给编写每个程序代码的时候可以随意读写地址空间内的数据,而不用担心会不会读写到其他程序的代码块中去了。32位OS中,每个程序都有4G的内存空间,就是说A程序可以往0X12345中写一个值,B程序也可以往0X12345中写一个值,两个值虽然表面上写到一个地方去了,但是你根本不用担心,它们根本没有写到一个地方去了,它们都是写在自己的用户空间中,经过几次地址映射就映射到不同的物理地址上去了。4G内存空间的地址就是线性地址,也就是说线性地址就是用来标识这个4G的虚拟的用户空间的。
用户空间:每个程序都有4G内存空间,但是分为两个部分,0-3G是用户空间,3-4G是内核空间。
内核空间:既然3-4G是内核空间,那么为什么要搞个内核空间呢?我们自己的程序,比如一个helloworld,要拿1个G的空间出来给内核干毛呢?其实是这样的,这1个G必须拿,而且每个程序都要拿,而且拿的位置都一样。为了使OS内核代码与所有其他程序代码相隔离,同时又要让OS内核代码可以被其他程序代码所调用访问,必须要把OS内核也看成一个任务,存放在内存某个区域,然后每个普通程序对应的页表中都加入这么一段,使该程序的高1G内存空间,映射到相同的物理区域中,这个物理区域就是OS内核所在的地方,这样就可以认为内核空间为所有进程共有。如果看不懂,建议补充相关知识!
特权级:特权级指的是一段程序内部各个段所处的级别。即一个程序源代码有好几个段,那么每一个段都对应一个特权级,每一个特权级都有自己独立的堆栈,当程序从一个段访问到另一个段并发生特权级转换的时候,需要更改程序使用的堆栈。