《Linux內核分析》第五週筆記 扒開系統調用的三層皮(下)

扒開系統調用的三層皮(下)函數

1、給menuOS增長time和time-asm學習

  經過內核調試系統調用。將上次作的實驗加入到menusOS,變成menusOS裏面的兩個命令。spa

1 int Getpid(int argc , char * argv[])3d

2{調試

3 int pid;blog

4 pid=getpid();進程

5 printf("pid=%d\n",pid);get

6 return 0;it

7 }asm

8

9 int Getpidasm(int argc , char *argv[])

10 {

11 int pid;

12 asm volatile(

13 "mov $0,%%ebx\n\t"

14 "mov $0x14,%%eax\n\t"

15 "int $0x80\n\t"

16 "mov %%eax, %0\n\t"

17 :"=m"(pid)

18 );

19 printf("pid = %d\n",pid);

20 return 0;

21 }

/*強制刪除當前的menuOS*/

/*克隆一個menu*/

/*運行腳本*/

此次的menuOS支持的命令增長,增長了time和time-asm兩條命令。

2、使用gdb跟蹤系統調用內核函數sys_time

/*13號time對應的內核處理函數sys_time*/

/*啓動到menuOS,執行time命令系統調用,停在system time函數的位置*/

 

若是一直按n單步執行會進入schedule函數。

sys_time返回後進入彙編代碼處理gdb沒法繼續跟蹤。

執行0x80以後cpu自動跳轉到system_call.

3、系統調用在內核代碼中的處理過程

一、系統調用在內核代碼中的工做機制和初始化

從int 0x80觸發一個系統調用到執行系統調用處理的函數sys time,到返回用戶態的整個過程是很重要的。進程調度的時機很是關鍵。

system call系統調用的處理過程:

初始化中斷向量的過程當中將0x80與system call聯繫起來。

經過系統調用號將system call與sys_xyz聯繫起來。

返回用戶態以前有一個調度時機,從systime退出後會跟蹤到schedule。

系統調用機制的初始化:

二、簡化後便於理解的system call僞代碼

系統調用是特殊的中斷

system call handler stub ENTRY(system_call)              

RING0_INT_FRAME            

ASM_CLAC     pushl_cfi %eax            

SAVE_ALL              /*宏*/    

GET_THREAD_INFO(%ebp)                       

testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp)     

jnz syscall_trace_entry        

cmpl $(NR_syscalls), %eax      

jae syscall_badsys         

syscall_call:     call *sys_call_table(,%eax,4) /*根據系統調用號查sys_call_table表裏的位置,調用處理函數*/

syscall_after_call:                  

movl %eax,PT_EAX(%esp)     

syscall_exit:     LOCKDEP_SYS_EXIT                   

DISABLE_INTERRUPTS(CLBR_ANY)                          

TRACE_IRQS_OFF           

movl TI_flags(%ebp), %ecx     

testl $_TIF_ALLWORK_MASK, %ecx    

jne syscall_exit_work  /*檢測當前任務處理jne syscall_exit_work*/

syscall_exit_work: /*若是不處理任務就結束了*/    

testl $_TIF_WORK_SYSCALL_EXIT, %ecx    

jz work_pending     /*處理信號*/    

TRACE_IRQS_ON         

ENABLE_INTERRUPTS(CLBR_ANY)    

movl %esp, %eax    

call syscall_trace_leave    

jmp resume_userspace   /*恢復用戶空間 */

END(syscall_exit_work)

work_pending:     testb $_TIF_NEED_RESCHED, %cl    

jz work_notifysig      work_resched:     call schedule     /*從新調度*/    

 

在系統調用返回以前有可能發生進程調度(call schedule)

在當前進程有信號發生進程間通信他會處理當前進程

進程調度過程當中會發生進程上下文切換

將內核抽象成不少箇中斷處理的集合

三、分析system_call到iret的過程

4、總結

  此次實驗我學習到從int 0x80觸發一個系統調用到執行系統調用處理的函數sys time,到返回用戶態的整個過程。學習到了進程調度的時機很是關鍵。system call系統調用的處理過程是:初始化中斷向量的過程當中將0x80與system call聯繫起來。經過系統調用號將system call與sys_xyz聯繫起來。返回用戶態以前有一個調度時機,從systime退出後會跟蹤到schedule。此次課程使我對系統調用的過程有了更深的瞭解。

相關文章
相關標籤/搜索