more: Jollen 的 Embedded Linux 教育訓練

« System Call 專題討論, #2:使用 C 語言呼叫 System Call | Home | System Call 專題討論, #4:x86 的 Interrupt »

System Call 專題討論, #3:使用 Assembly 呼叫 System Call(x86)

jollen 發表於 December 1, 2006 4:30 PM

Wrapper routine 透過 0x80 號中斷(軟體中斷)進入 kernel space,並且跳至 system call handler執行。由於透過軟體中斷即可達成呼叫 system call的目地,因此使用 assembly來寫程式時,我們也可以直接呼叫system call。

在產生軟體中斷前,我們必須告訴 Linux kernel 所要呼叫的 system call 編號,system call 的編號透過 %eax 暫存器來指定;若要傳遞參數,則是透過其它暫存器來傳遞。

參數傳遞與傳回值

Linux system call最多可傳遞6個參數,參數的傳遞是透過以下的暫存器來完成:

  • %ebx:第1個參數。
  • %ecx:第2個參數。
  • %edx:第3個參數。
  • %esi:第4個參數。
  • %edi:第5個參數。
  • %ebp:第6個參數(做臨時用途)。

System call 的編號由 %eax 暫存器指定。System call 的傳回值則是存放於 %eax 暫存器。請看以下的範例程式 hello.S

.data

msg:        .ascii	    "Hello, World!\n"
            len = . – msg

.text

            .global _start

_start:

# sys_write
	movl	    $len,%edx
	movl	    $msg,%ecx
	movl	    $1,%ebx
	movl	    $4,%eax
	int      $0x80

# sys_exit
	movl	    	$0,%ebx
	movl	    	$1,%eax
	int      $0x80 

組譯與連結的方法為:

$ as -o hello.o hello.S
$ ld -s -o hello hello.o

透過 assembly 程式,我們便能來初步了解 x86 上的 system call 架構。

--jollen

引用通告

如果您想引用這篇文章到您的Blog,
請複製下面的鏈接,並放置到您發表文章的相應界面中。

http://blog.jollen.org/mt-tb.cgi/250

發表一個評論

(您發表的意見將被立即接受,但需要一點時間與後端伺服器做同步,您的留言才會顯示在網站上。為避免 spam 攻撃,按「發表」後請輸入帳號密碼。使用者帳號:「nospam」、密碼:「nospam」。)

Top | 授權條款 | Jollen's Forum: Blog 評論、討論與搜尋
Copyright(c) 2006 www.jollen.org