轉自:http://crquan.blogbus.com/logs/5618102.html
syscall調用介面從2.6.19開始移到應用程式層,原來核心中使用_syscallN宏的方式來聲明函數原型的方法不再有效:
如聲明:
_syscall1(int, sysinfo, struct sysinfo *, info);
不再需要,而是在程式中需要的時候直接調用:
int syscall(int number, ...);
- 第一個number是後面要接的參數個數,不是該系統調用的參數個數;(註:關於這個number,man手冊上說的是: syscall() performs the system call whose assembly language interface has the specified number with the specified arguments. Symbolic constants for system
calls can be found in the header file <sys/syscall.h>.
)
- number後面順序接上該系統調用的所有參數即可
相應標頭檔包含也改變為
於是調用sysinfo就變為:
struct sysinfo s_info;
syscall(2, __NR_sysinfo, &s_info);
可見新的調用方式變得更為簡潔了。
References:
- http://lxr.linux.no/source/include/asm-i386/unistd.h
- http://lxr.linux.no/source/include/asm-i386/unistd.h?v=2.6.18
- http://www.kernel.org/pub/linux/kernel/v2.6/snapshots/patch-2.6.19-git13.log
- commit f5738ceed46782aea7663d62cb6398eb05fc4ce0 of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git