0

カーネル(2.6.30 x86_64)モード(r0)で実行されているサンプルコードを使用して、iretをシミュレートしようとしています。インテルのマニュアルガイドの下で変数をプッシュしていますが、iret命令の位置で実行時の障害が発生しています。

一般保護違反:fffc [#] SMP

asm volatile(
    "mov %%ss,%%ax \n\t"
    "push %%rax \n\t"/*ss*/
    "push %%rsp \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*/
    "iret \n\t"/*here is the fault rip!!!!!!*/
    "._restart_code:"
    "nop" :);
4

2 に答える 2

0

それがあなたの問題を解決するかどうかはわかりませんが、ここでいくつかの考慮事項があります:

"mov %%cs,%%ax \n\t"
"push %%rax \n\t"/*cs*/

EAXの下位バイトを更新しているため、RAXの上位バイトは0とは異なる可能性があります(そうではありません)。

"mov $._restart_code,%%rax \n\t"

$._restart_codeここでも同じですが、それは標準形であると主張する必要があります。

"mov %%ss,%%ax \n\t"
"push %%rax \n\t"/*ss*/
"push %%rsp \n\t"/*rsp*/

同じ特権レベルに戻るので、役に立たない。

于 2012-08-02T10:20:40.827 に答える
0

バグは、プッシュ後に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" :);

ありがとう!!!

于 2012-08-02T11:52:11.673 に答える