扒開系統調用的三層皮(下)函數
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。此次課程使我對系統調用的過程有了更深的瞭解。