linux 系统调用分析
本文為我學習孟寧老師的linux內(nèi)核課程的總結(jié),同時也作為課程學習的作業(yè)。
唐建,《Linux內(nèi)核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000
1、系統(tǒng)調(diào)用概述
通常用戶空間是無法直接訪問內(nèi)核空間的,但是有時候確實需要這樣做,于是就產(chǎn)生的系統(tǒng)調(diào)用,系統(tǒng)調(diào)用是操作系統(tǒng)對用戶空間提供的訪問內(nèi)核空間的API。?
系統(tǒng)調(diào)用分為:系統(tǒng)調(diào)用API、封裝例程、系統(tǒng)調(diào)用處理程序、系統(tǒng)調(diào)用服務程序,其中系統(tǒng)調(diào)用處理程序和服務程序在內(nèi)核空間。
? ? ? ?API 1 ? ? ? ? 系統(tǒng)調(diào)用例程1 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 處理程序1
? ? ? ?API2 ? ? ? ? 系統(tǒng)調(diào)用例程2 ? ? ? ? ? ? ?system_call ? ? ? ? 處理程序2
? ? ? API3 ? ? ? ? ?系統(tǒng)調(diào)用例程3 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?處理程序3
? ? ? …… ? ? ? ? ?…… ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ……
? ? 四者對應關(guān)系如上,多個API可能對應一個系統(tǒng)調(diào)用,一個API也可能對應對個系統(tǒng)調(diào)用,一個系統(tǒng)調(diào)用對應一個封裝例程。
2、系統(tǒng)調(diào)用流程
? ? ? 用戶態(tài)調(diào)用系統(tǒng)調(diào)用API時,調(diào)用到系統(tǒng)調(diào)用封裝例程,例程通過命令觸發(fā)一個軟終端(系統(tǒng)調(diào)用專用,中斷號:0x80),系統(tǒng)進入內(nèi)核態(tài),并走到
system_call,可以認為這個就是此軟終端的中斷服務程序入口,然后通過傳遞過來的系統(tǒng)調(diào)用號來決定調(diào)用相應的系統(tǒng)調(diào)用服務程序。
3、詳細流程,及舉例
? ? ?下面我通過跟蹤和模擬系統(tǒng)調(diào)用來展示整個流程。
(1)/下圖是一個簡單的程序,里面使用了open、read 這兩個最常用的系統(tǒng)調(diào)用。右邊是輸出結(jié)果。
? ? ?
(2)、下面我們將API改成匯編,直接通過匯編來調(diào)用系統(tǒng)調(diào)用,進而分析系統(tǒng)調(diào)用的過程。
? ? 首先查看系統(tǒng)調(diào)用號到文件/arch/x86/syscalls/syscall_32.tbl 或者syscall_64.tbl 文件。如下圖,第四列就是對應的內(nèi)核中的處理函數(shù)。
? ? ? ? ? ??
?
? ??
? ? ? ?上述代碼與前面的c代碼對比。第一部分是 open系統(tǒng)調(diào)用,第二部分是read 系統(tǒng)調(diào)用。
__asm__ __volatile__ (
"mov %1, %%ebx\n\t" ? ——將open需要的參數(shù)準備好,文件路徑
"mov %2, %%ecx\n\t" ? ——準備參數(shù),文件打開權(quán)限
"mov $5,%%eax\n\t" ? ?——系統(tǒng)調(diào)用號,open的系統(tǒng)調(diào)用號為5
"int $0x80\n\t" ? ? ? ? ? ? ——觸發(fā)中斷0X80
"mov %%eax, %0\n\t" ?——系統(tǒng)調(diào)用返回了,將返回參數(shù)取出來。
:"=m"(fd)
:"p"(path), "c"(O_RDONLY)
);
__asm__ __volatile__ (
"mov %2, %%ecx\n\t" ? ——準備入?yún)?br /> "mov $3, %%eax\n\t" ? ——系統(tǒng)調(diào)用號
"int $0x80\n\t" ? ? ? ? ? ? ——觸發(fā)中斷
"mov %%eax, %0\n\t" ?——取出返回值
:"=m"(n)
:"b"(fd),"p"(buf),"d"(20)
);
4、總結(jié)
? ?(1)、 每個系統(tǒng)調(diào)用都對應一個系統(tǒng)調(diào)用號,而系統(tǒng)調(diào)用號就對應內(nèi)核中的相應處理函數(shù)。
? ?(2)、所有系統(tǒng)調(diào)用都是通過中斷0x80來觸發(fā)的。
? ?(3)、使用系統(tǒng)調(diào)用時,通過eax 寄存器將系統(tǒng)調(diào)用號傳遞到內(nèi)核,系統(tǒng)調(diào)用的入?yún)⑼ㄟ^ebx、ecx……依次傳遞到內(nèi)核
? ? (4)、和函數(shù)一樣,系統(tǒng)調(diào)用的返回值保存在eax中,所有要從eax中取出
? ?
? ? ?
?
轉(zhuǎn)載于:https://www.cnblogs.com/tjyuanxi/p/9221975.html
總結(jié)
以上是生活随笔為你收集整理的linux 系统调用分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: poj2456 二分搜索 挑战程序设计竞
- 下一篇: USACO-Section1.5 Ari