1

Windows7 64 ビットの VMWare に Minix 3 をインストールしました。この VM でアセンブリの練習をしようとしています。手始めに、数字を eax と ebx にロードし、o/s を呼び出してプログラムを終了する簡単なプログラムを試してみました。

.globl _start:
.section .text
_start:
movl $1, %eax
movl $0, %ebx
int $0x80

コンパイラとリンカーはエラーや警告を発生させませんが、実行可能ファイルを実行すると、

PM: coredump signal 11 for 282 / <program name>
memory fault

これは、ホストが 64 ビット マシンであることが原因ですか? minix の o/s 呼び出しが異なるためですか? 特に minix o/s 呼び出しについてネットを検索してみましたが、特定の o/s 呼び出しに対する解決策を見つけましたが、o/s 呼び出しの表は見つかりませんでした。誰かが私をここで正しい方向に向けることができますか?

4

1 に答える 1

4

どうぞ:

minix-exit.S

  .section .text
  .global _start
_始める:
  /* _exit(17) */
  および $0xfffffff0、%esp
  サブ $0x40、%esp
  movl $17, 0x18(%esp) /* 終了ステータス */
  lea 0x10(%esp), %ebx
  movl $1, 0x04(%ebx) /* include/minix/callnr.h で終了 */
  movl $0, %eax /* include/minix/com.h 内の PM_PROC_NR */
  movl $0x3, %ecx /* include/minix/ipcconst.h 内の SENDREC */
  int $33 /* sys/arch/i386/include/asm.h 内の IPCVEC_ORIG */

ビルドして実行:

$ clang -nostdlib minix-exit.S -o minix-exit
$ ./minix-exit; エコー $?
17

Minix 3 の syscall 実装を理解する最も簡単な方法は、コードを読む前に少しリバース エンジニアリングを行うことです。

呼び出しシーケンス

マイクロ カーネルである Minix は、さまざまなマネージャーに送信できるメッセージとしてシステム コールを構造化することを主張します。exit()に送信EXITすることで実装されPM_PROC_NRます:

少しのリバースエンジニアリングでこれを理解する

単純な静的にリンクされた実行可能ファイルのようなものが Minixでどのように/bin/cat実装されるかを見てください。_exit()

dis.gdb

ページネーションを0に設定

ファイル /bin/cat
ログオンの設定
逆アセンブル _exit
逆アセンブル _syscall
x/a 0x8072678
逆アセンブル_sendrec_orig
終了する

走る:

gdb -q -x dis.gdb

GDB 出力

関数 _exit のアセンブラー コードのダンプ:
0x0805b780 : %ebp をプッシュ
0x0805b781 : mov %esp,%ebp
0x0805b783 : および $0xfffffff0,%esp
0x0805b789 : サブ $0x40,%esp
0x0805b78c : mov 0x8(%ebp),%eax
0x0805b78f : mov %eax,0x18(%esp)
0x0805b793 : レア 0x10(%esp),%eax
0x0805b797 : mov %eax,0x8(%esp)
0x0805b79b : movl $0x1,0x4(%esp)
0x0805b7a3 : movl $0x0,(%esp)
0x0805b7aa : 0x805dfc0 を呼び出します
0x0805b7af : 0x805b7af を呼び出します
0x0805b7b4 : nopw %cs:0x0(%eax,%eax,1)
0x0805b7c0 : jmp 0x805b7c0
アセンブラー・ダンプの終わり。
関数 syscall のアセンブラー コードのダンプ:
0x0805dfc0 : %ebp をプッシュ
0x0805dfc1 : mov %esp,%ebp
0x0805dfc3 : プッシュ %esi
0x0805dfc4 : サブ $0xc,%esp
0x0805dfc7 : mov 0xc(%ebp),%eax
0x0805dfca : mov 0x10(%ebp),%esi
0x0805dfcd : mov %eax,0x4(%esi)
0x0805dfd0 : mov %esi,0x4(%esp)
0x0805dfd4 : mov 0x8(%ebp),%ecx
0x0805dfd7 : mov %ecx,(%esp)
0x0805dfda : コール *0x8072678
0x0805dfe0 : テスト %eax,%eax
0x0805dfe2 : ジェ 0x805dfe9
0x0805dfe4 : mov %eax,0x4(%esi)
0x0805dfe7 : jmp 0x805dfec
0x0805dfe9 : mov 0x4(%esi),%eax
0x0805dfec : テスト %eax,%eax
0x0805dfee : jns 0x805e000
0x0805dff0 : mov %eax,%esi
0x0805dff2 : 否定 %esi
0x0805dff4 : 0x805e010 を呼び出します
0x0805dff9 : mov %esi,(%eax)
0x0805dffb : mov $0xffffffff,%eax
0x0805e000 : $0xc,%esp を追加
0x0805e003 : ポップ %esi
0x0805e004 : ポップ %ebp
0x0805e005 : 戻る    
アセンブラー・ダンプの終わり。
0x8072678 : 0x805e100
関数 _sendrec_orig のアセンブラー コードのダンプ:
0x0805e100 : %ebp をプッシュ
0x0805e101 : mov %esp,%ebp
0x0805e103 : %ebx をプッシュ
0x0805e104 : mov 0x8(%ebp),%eax
0x0805e107 : mov 0xc(%ebp),%ebx
0x0805e10a : mov $0x3,%ecx
0x0805e10f : 整数 $0x21
0x0805e111 : ポップ %ebx
0x0805e112 : ポップ %ebp
0x0805e113 : 戻る    
0x0805e114 : レア 0x0(%esi),%esi
0x0805e11a : レア 0x0(%edi),%edi
アセンブラー・ダンプの終わり。
于 2014-03-16T11:30:46.800 に答える