C x86上对代码段的远端调用

C x86上对代码段的远端调用,c,exception,assembly,x86,memory-segmentation,C,Exception,Assembly,X86,Memory Segmentation,我正在尝试从一个具有平面代码段、平面数据段和环0权限级别的任务到另一个具有相同权限级别(偏移量为零)的代码段进行远程调用,但我确实遇到了GP错误 我是如何进行远程呼叫的: __asm__ volatile ("lcall *%0" :: "m" (ptr)); 其中,ptr是以下数据的变量(far_ptr_t): 当我调试它时,我发现它在调用指令上失败了,有什么原因我应该考虑,以便知道为什么我得到GP故障?HM,你能在原则上到达偏移点指向的内存位置吗?解释:这看起来对我来说是“合适的”。您没有

我正在尝试从一个具有平面代码段、平面数据段和环0权限级别的任务到另一个具有相同权限级别(偏移量为零)的代码段进行远程调用,但我确实遇到了GP错误

我是如何进行远程呼叫的:

__asm__ volatile ("lcall *%0" :: "m" (ptr));
其中,ptr是以下数据的变量(far_ptr_t):


当我调试它时,我发现它在调用指令上失败了,有什么原因我应该考虑,以便知道为什么我得到GP故障?

HM,你能在原则上到达偏移点指向的内存位置吗?解释:这看起来对我来说是“合适的”。您没有处于真实模式,即,您的内存保护禁止您访问未映射到进程内存中的内存您是否在BOCHS中尝试过这种方法,您可以从外部单步操作虚拟机?它的内置调试器也可能会向您显示#GP错误的原因。您甚至不必深入挖掘。这是全科医生的错误。McCurmüL勒说,唯一的地址转换是从逻辑到线性地址,我认为我的线性地址是物理地址,因为分页被损坏了。所以,是的,我看到的线性地址指的是物理地址,它实际上在SRAM范围内进行中继。你说什么东西没有排列在这里?嗯,原则上,你能到达偏移量指向的内存位置吗?解释:我觉得这看起来“合适”。您没有处于真实模式,即,您的内存保护禁止您访问未映射到进程内存中的内存您是否在BOCHS中尝试过这种方法,您可以从外部单步操作虚拟机?它的内置调试器也可能会向您显示#GP错误的原因。您甚至不必深入挖掘。这是全科医生的错误。McCurmüL勒说,唯一的地址转换是从逻辑到线性地址,我认为我的线性地址是物理地址,因为分页被损坏了。所以,是的,我看到的线性地址指的是物理地址,它实际上在SRAM范围内进行中继。什么意思?这里有些东西排不上?
  typedef struct {

    void* offset;
    uint16_t sel;

} __attribute__((packed)) far_ptr_t;