当前位置: 技术问答>linux和unix
请问,虚拟地址会冲突吗
来源: 互联网 发布时间:2016-12-12
本文导语: 最近刚看虚拟地址,线性地址,物理地址的转换问题,被虚拟地址搞的很混乱,查看了前辈们的相关文章,但是还是没有得到明确的答案,在此再多问一次: 按书上说,虚拟地址是由[段选择符:段内偏移]来给出的,...
最近刚看虚拟地址,线性地址,物理地址的转换问题,被虚拟地址搞的很混乱,查看了前辈们的相关文章,但是还是没有得到明确的答案,在此再多问一次:
按书上说,虚拟地址是由[段选择符:段内偏移]来给出的,而我们的应用程序在编译生成可执行文件时,其中的地址都是段内的偏移地址,并没有给出段选择符,那么:
1.段选择符是怎么得到的?还是操作系统在创建任务时才设定的?
2.假设,当A进程的虚拟地址为[0x10000:0xffff],那么,在这个操作系统中会不会还有一个进程,它的虚拟地址也是[0x10000:0xffff],从而使得这两个进程的虚拟地址在转换成线性地址时,造成线性地址相同,从而在映射到物理内存时会映射到同一个物理内存块上?如果不会,那用什么机制保证不会呢?
3.由于每个进程有4G的虚拟地址空间,那会出现虚拟地址是[0x20000000:0xf0000000]这样的虚拟地址吗?
4.由于操作系统支持很多段,那么这些段之间会出现虚拟地址之间的重叠,比如A进程的虚拟地址空间是[0x100000:0x70000],B进程的虚拟地址空间是[0x120000:0x90000],那么A进程和B进程将在[0x120000:0x70000]出现重叠,请问会出现这种情况吗,如果出现,怎么处理?
4个疑惑,麻烦知道的同志,详细的解释一下。没有几个分了,请客好吧。只要我们同城
按书上说,虚拟地址是由[段选择符:段内偏移]来给出的,而我们的应用程序在编译生成可执行文件时,其中的地址都是段内的偏移地址,并没有给出段选择符,那么:
1.段选择符是怎么得到的?还是操作系统在创建任务时才设定的?
2.假设,当A进程的虚拟地址为[0x10000:0xffff],那么,在这个操作系统中会不会还有一个进程,它的虚拟地址也是[0x10000:0xffff],从而使得这两个进程的虚拟地址在转换成线性地址时,造成线性地址相同,从而在映射到物理内存时会映射到同一个物理内存块上?如果不会,那用什么机制保证不会呢?
3.由于每个进程有4G的虚拟地址空间,那会出现虚拟地址是[0x20000000:0xf0000000]这样的虚拟地址吗?
4.由于操作系统支持很多段,那么这些段之间会出现虚拟地址之间的重叠,比如A进程的虚拟地址空间是[0x100000:0x70000],B进程的虚拟地址空间是[0x120000:0x90000],那么A进程和B进程将在[0x120000:0x70000]出现重叠,请问会出现这种情况吗,如果出现,怎么处理?
4个疑惑,麻烦知道的同志,详细的解释一下。没有几个分了,请客好吧。只要我们同城
|
每个进程都有虚拟地址,比如A的0x12345678和B的0x12345678存放不一样的数据,映射到物理内存的时候会映射到不同的区域
|
1)段选择符应该是操作系统在创建进程的时候确定的
2)从虚拟地址转换到线性地址的时候,不会出现转换的线性地址一样,因为有MMU的存在,它会对内存的实际映射进行保护
3)进程的地址空间只是4G空间中的2G或者3G,因为其它的地址空间是留给了内核的
4)不存在这种问题,重叠的地址空间应该映射的不是相同的物理页面
2)从虚拟地址转换到线性地址的时候,不会出现转换的线性地址一样,因为有MMU的存在,它会对内存的实际映射进行保护
3)进程的地址空间只是4G空间中的2G或者3G,因为其它的地址空间是留给了内核的
4)不存在这种问题,重叠的地址空间应该映射的不是相同的物理页面