Linux iret错误:一般保护故障fffc
我有一个在内核(2.6.30 x86_64)模式(r0)下运行的示例代码,试图模拟iret。我在《英特尔手册》的指导下推送变量。但结果表明,iret指令的pos中存在运行时错误: 一般保护故障:fffc[#]SMPLinux iret错误:一般保护故障fffc,linux,assembly,linux-kernel,Linux,Assembly,Linux Kernel,我有一个在内核(2.6.30 x86_64)模式(r0)下运行的示例代码,试图模拟iret。我在《英特尔手册》的指导下推送变量。但结果表明,iret指令的pos中存在运行时错误: 一般保护故障:fffc[#]SMP 我不确定它是否能解决您的问题,但这里有一些考虑: "mov %%cs,%%ax \n\t" "push %%rax \n\t"/*cs*/ 您正在更新EAX的低阶字节,因此RAX的高阶字节可能不同于0(不应该) 同样,您应该声明$。\u restart\u code是标准格式的 "
我不确定它是否能解决您的问题,但这里有一些考虑:
"mov %%cs,%%ax \n\t"
"push %%rax \n\t"/*cs*/
您正在更新EAX的低阶字节,因此RAX的高阶字节可能不同于0(不应该)
同样,您应该声明$。\u restart\u code
是标准格式的
"mov %%ss,%%ax \n\t"
"push %%rax \n\t"/*ss*/
"push %%rsp \n\t"/*rsp*/
无用,因为您返回到相同的权限级别。错误在于推送后rsp发生了更改
asm volatile(
"mov %%ss,%%ax \n\t"
"push %%rax \n\t"/*ss*/
"push %%rsp \n\t"/*rsp ##########error here!!!!!!! */
"pushfq \n\t"/*rflags*/
"mov %%cs,%%ax \n\t"
"push %%rax \n\t"/*cs*/
"mov $._restart_code,%%rax \n\t"
"push %%rax \n\t"/*rip*/
"iret \n\t"/*###iretq should be used under 64bit mode*/
"._restart_code:"
"nop" :);
因此,在所有推送指令之前保存rsp。正确的代码是:
asm volatile(
"mov %%rsp,%%rbx \n\t"
"mov %%ss,%%ax \n\t"
"push %%rax \n\t"/*ss*/
"push %%rbx \n\t"/*rsp*/
"pushfq \n\t"/*rflags*/
"mov %%cs,%%ax \n\t"
"push %%rax \n\t"/*cs*/
"mov $._restart_code,%%rax \n\t"
"push %%rax \n\t"/*rip*/
"iretq \n\t"
"._restart_code:"
"nop" :);
谢谢
asm volatile(
"mov %%ss,%%ax \n\t"
"push %%rax \n\t"/*ss*/
"push %%rsp \n\t"/*rsp ##########error here!!!!!!! */
"pushfq \n\t"/*rflags*/
"mov %%cs,%%ax \n\t"
"push %%rax \n\t"/*cs*/
"mov $._restart_code,%%rax \n\t"
"push %%rax \n\t"/*rip*/
"iret \n\t"/*###iretq should be used under 64bit mode*/
"._restart_code:"
"nop" :);
asm volatile(
"mov %%rsp,%%rbx \n\t"
"mov %%ss,%%ax \n\t"
"push %%rax \n\t"/*ss*/
"push %%rbx \n\t"/*rsp*/
"pushfq \n\t"/*rflags*/
"mov %%cs,%%ax \n\t"
"push %%rax \n\t"/*cs*/
"mov $._restart_code,%%rax \n\t"
"push %%rax \n\t"/*rip*/
"iretq \n\t"
"._restart_code:"
"nop" :);