系統(tǒng)調(diào)用(system call)是操作系統(tǒng)內(nèi)核提供的函數(shù),在內(nèi)核態(tài)運(yùn)行(kernel mode),屬于函數(shù)中的低等下人,終身代號(hào)9527,雖然低等,但是誰也離不開他們,因?yàn)殡x開他們就沒辦法和內(nèi)核打交道了,沒辦法和內(nèi)核打交道就什么都歇菜了。。。 linux3.0.0-14的系統(tǒng)調(diào)用有346個(gè),可以在源碼的 linux-3.0/arch/x86/kernel/syscall_table_32.S文件中找到所有的系統(tǒng)調(diào)用編號(hào),如果以匯編的方法調(diào)用這些系統(tǒng)函數(shù),那么放在EAX寄存器里面的值就是想要調(diào)用的函數(shù)的號(hào)碼,把前20個(gè)貼在下面了,很多貌似很熟悉的吧:)ENTRY(sys_call_table)
.long sys_restart_syscall /* 0 - old "setup()" system call, used for restarting */ .long sys_exit .long ptregs_fork .long sys_read .long sys_write .long sys_open /* 5 */ .long sys_close .long sys_waitpid .long sys_creat .long sys_link .long sys_unlink /* 10 */ .long ptregs_execve .long sys_chdir .long sys_time .long sys_mknod .long sys_chmod /* 15 */ .long sys_lchown16 .long sys_ni_syscall /* old break syscall holder */ .long sys_stat .long sys_lseek .long sys_getpid /* 20 */ 庫(kù)函數(shù)是在系統(tǒng)調(diào)用上的一層包裝,運(yùn)行在用戶態(tài)(user mode),打個(gè)比方吧,庫(kù)函數(shù)相當(dāng)于包工頭,系統(tǒng)調(diào)用是工人,我們可以自己找工人分任務(wù),但一般是把任務(wù)攤給包工頭,包工頭再去給工人分任務(wù)。所以雖然最終所有的工作都是系統(tǒng)調(diào)用做的,但是我們更通常的做法是調(diào)用庫(kù)函數(shù),有以下幾個(gè)原因:- 庫(kù)函數(shù)提供了抽象,抽象是個(gè)好東西,可以讓我們把更多的注意力集中在要解決問題的核心。
- 庫(kù)函數(shù)給我們提供的接口更人性化,所以調(diào)用起來更方便。
- 調(diào)用庫(kù)函數(shù)更安全,內(nèi)存管理不用自己太操心。
- 調(diào)用庫(kù)函數(shù)效率更高,程序跑的更快。雖然庫(kù)函數(shù)最終是調(diào)用系統(tǒng)函數(shù),但是庫(kù)函數(shù)會(huì)比我們用更好的方式方法調(diào)用系統(tǒng)函數(shù)。
例子可以參考這篇文章http://blog.csdn.net/high_high/article/details/7102081
|