Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux iret错误:一般保护故障fffc_Linux_Assembly_Linux Kernel - Fatal编程技术网

Linux iret错误:一般保护故障fffc

Linux 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是标准格式的 "

我有一个在内核(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 %%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" :);