一步步问,我要了解虚拟内存真相(1)
虚拟地址空间有64T的大小,但是由于这个64T不是平面空间,而是二维空间(段+偏移),这个空间是重叠的。基于GDT/LDT的访问模式,一个任务可以覆盖的地址基地址是32位的,可以在0——4G之间移动,而段限长为32位为0——4G之间,所以最多可以访问到的其实是0——8G之间的平面地址。这样理解对吗?
假设上面的理解是对的,那么把逻辑地址转为的线形地址的时候,线形地址是32位的,那么当逻辑地址表示的平面地址超过4G的时候怎么表示呢?
还有就是按照逻辑地址到线形地址的转换,64T到4G,这里面是会有很多重叠的,加入两个不同的逻辑地址都被映射到同一个线形地址,那么CPU怎么区别这是两个不同的逻辑地址呢?CPU对上面的这些东西一无所知啊。下面的分页机制也是在线性地址下层的。怎么能区别出来呢?
虚拟地址空间有64T的大小,但是由于这个64T不是平面空间,而是二维空间(段+偏移),这个空间是重叠的。基于GDT/LDT的访问模式,一个任务可以覆盖的地址基地址是32位的,可以在0——4G之间移动,而段限长为32位为0——4G之间,所以最多可以访问到的其实是0——8G之间的平面地址。这样理解对吗?
>不对,一个任务的虚拟地址空间是GDT+LDT=2^14个段,而每个段可以是4G大小,所以是64T
>一个任务可由多个段构成,每个段都可以有它自己的基地址,每个段都可以访问它的段内偏移4G
>但这只是二维空间的,你如果把这个任务的逻辑地址利用分段机制转换为线性地址(平面)
>64T->4G 当然你的段基址+它的段限,各个段之间会有重叠,但是如何让各个段之间不互相干扰就是程序设计者的问题了,如果你基于操作系统,那么这些问题交给操作系统了
>单片机就是一个典型的MCU,你也可以用它来实现这些硬件操作,一切地址都是你设计者自己设计的
>即,逻辑地址是你设计的,线性地址也是你设计的,这样你就可以把A,B两个任务区别开了.
>CPU啥都不会,它只会执行你的命令,它不会辨别东西