System Call 專題討論, #6:unistd.h(x86)

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

unistd.h 是一個重要的標頭檔,裡頭是 system call 編號的定義;另外,linux/arch/i386/kernel/entry.S 則是每一個 system call 的進入點,也就是 system call table(位於 .data section)。

unistd.h也定義了處理不同參數個數的 system call handler,在這個標頭檔裡可以看到處理 0~6個參數的 handler(_syscall0~_syscall6)。例如以下是處理 1 個參數的handler:

#define _syscall1(type,name,type1,arg1) \
type name(type1 arg1) \
{ \
long __res; \
__asm__ volatile ("int $0x80" \
	: "=a" (__res) \
	: "0" (__NR_##name),"b" ((long)(arg1))); \
__syscall_return(type,__res); \
}

type, name分別為 system call的傳回值型別與函數名稱,例如呼叫 fork(),則此巨集展開後會變:

int fork(type 1 arg1)
{
…
}

 

讀者留言 (1)

  • fr3@K 於 April 4, 2007 18:14:

    我在解決一個 module 編譯問題的 Internet research 過程中, 意外逛到你的 blog, good stuffs.

    If you are not aware of this, this is for your information:

    Syscall macros (along with other macros) 已經被 remove 掉了. Please see http://git.kernel.org/?p=linux/kernel/git/stable/linux-2.6.20.y.git;a=commit;h=f5738ceed46782aea7663d62cb6398eb05fc4ce0

    這也正好是我遇到的問題, 請問你知道 remove 的原因以及 work around for modules?

    ps. my apology in advance if my response (and questions) is not the kind you would like to receive. thank you anyway. cheers.

留言功能維護中。將於近日重新開放。

連絡作者

Jollen Chen,Moko365(仕橙3G教室)講師,熱愛研究 Linux 與 Android 技術。曾為 Motorola、HTC、Foxconn、LG、OPPO、騰迅、廣達電腦、緯創、仁寶等超過 50 家企業講授課程。目前在 MokoVersity 擔任軟體工程師,撰寫 Node.js 程式,也在幾家科技廠兼任 Android Framework 研發顧問。您可透過電子郵件 <jollen (at) jollen (dot) org> 或這裡與我連絡。