21,497
社区成员




在学习页式存储管理时看到一句话:数据共享时不同进程可以使用不同页号共享数据页;程序共享时不同进程必须使用相同页号共享代码页,原因是共享代码中的(JMP<页内地址>)指令使用不同页号时做不到。
我的疑问是:逻辑地址与物理地址通过页表进行了映射,不同进程可以使用不同页号共享数据页,那是不是说明不同进程使用的页表可以是不同的?不同进程通过不同的页表获取同一共享代码页的页号可能是不同的,但指向的物理地址是一样的,那为什么使用汇编指令时不能使用不同的页号?
因为数据不需要重定位,代码(通常)需要重定位,如果把某物理地址的代码同时映射到不同的页号,也就是逻辑地址不一样,那么重定位就处理不了(near/far类型的jmp、call指令和mov数据的指令,short类型的jmp、call不需要重定位),所以在x64中特意增加了基于rip的寻址模式,便于写位置无关的代码(PIC)