Kernel 当RCX持有正确的返回地址时,为什么SYSRET返回地址0?

Kernel 当RCX持有正确的返回地址时,为什么SYSRET返回地址0?,kernel,system-calls,Kernel,System Calls,我的爱好是x86_64 UEFI内核,其中用户代码调用系统代码,但它在0x1B:0x0处生成错误代码0的一般保护故障(0x1B是用户模式代码段选择器)。单步执行后,我意识到SYSRET不会返回到RCX中保存的地址,而是返回到零。我使用qemu-system-x86_64进行调试,无论是否使用KVM。附上两张关于这一现象的截图。谁能解释一下,告诉我我做错了什么 MSR 0xC0000080 = 0x0000000000000501 MSR 0xC0000081 = 0x001B00083D906D

我的爱好是x86_64 UEFI内核,其中用户代码调用系统代码,但它在0x1B:0x0处生成错误代码0的一般保护故障(0x1B是用户模式代码段选择器)。单步执行后,我意识到SYSRET不会返回到RCX中保存的地址,而是返回到零。我使用qemu-system-x86_64进行调试,无论是否使用KVM。附上两张关于这一现象的截图。谁能解释一下,告诉我我做错了什么

MSR 0xC0000080 = 0x0000000000000501
MSR 0xC0000081 = 0x001B00083D906D79
MSR 0xC0000082 = 0x000000003D906D79
MSR 0xC0000083 = 0x000000003D906D79
MSR 0xC0000084 = 0x0000000000000300
使用cli和本地APIC条目禁用中断

GDT:


编辑:在再次阅读说明手册后,我注意到在长模式下,返回的CS将是(STAR.SYSRET_CS+16)| 3,因此我复制了用户模式段描述符只是为了确定,但结果是相同的。

在SYSEXIT上,RCX==返回RSP和RDX==返回RIP。请参阅英特尔指令集参考。

否。正如4-668第2B卷RCX中所述,您是否找到了解决方案?我也面临同样的问题。不。我现在正在使用中断。
{ 0, 0, 0, 0x9A, 0x20, 0 }; // 0x08 ring 0 code
{ 0, 0, 0, 0x92, 0x00, 0 }; // 0x10 ring 0 data
{ 0, 0, 0, 0xFA, 0x20, 0 }; // 0x1B ring 3 code
{ 0, 0, 0, 0xF2, 0x00, 0 }; // 0x23 ring 3 data
{ 0, 0, 0, 0xFA, 0x20, 0 }; // 0x2B ring 3 code
{ 0, 0, 0, 0xF2, 0x00, 0 }; // 0x33 ring 3 data

typedef struct PACKED ENTRY
{
    U16 limit_0_15;
    U16 base_0_15;
    U8  base_16_23;
    U8  access;
    U8  granularity;
    U8  base_24_31;
} ENTRY, *PENTRY;