2018-2019-1 20189205《Linux核心原理與分析》第六週作業
阿新 • • 發佈:2018-11-19
跟蹤系統呼叫
除錯MenuOS新增的函式
重新下載 menu.git
可以看到 在test.c
檔案中增加了新的函式Time
和TimeAsm
:
int Time(int argc, char *argv[]) { time_t tt; struct tm *t; tt = time(NULL); t = localtime(&tt); printf("time:%d:%d:%d:%d:%d:%d\n",t->tm_year+1900, t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec); return 0; } int TimeAsm(int argc, char *argv[]) { time_t tt; struct tm *t; asm volatile( "mov $0,%%ebx\n\t" "mov $0xd,%%eax\n\t" "int $0x80\n\t" "mov %%eax,%0\n\t" : "=m" (tt) ); t = localtime(&tt); printf("time:%d:%d:%d:%d:%d:%d\n",t->tm_year+1900, t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec); return 0; }
其呼叫介面分別為time
和time-asm
:
MenuConfig("time","Show System Time",Time);
MenuConfig("time-asm","Show System Time(asm)",TimeAsm);
其功能為顯示當前系統時間,
make rootfs
可以開啟增加了新功能的MenuOS系統,在系統中使用新增的功能time
和time-asm
。
gdb跟蹤除錯sys_time
在gdb中連線MenuOS的1234埠,對其中的time函式進行除錯,檢視其執行過程。由於其呼叫了系統呼叫sys_time
對該系統呼叫進行跟蹤,檢視其呼叫的功能。
system_call
ENTRY(system_call) RING0_INT_FRAME ASM_CLAC pushl_cfi %eax //儲存系統呼叫號; SAVE_ALL //可以用到的所有CPU暫存器儲存到棧中 GET_THREAD_INFO(%ebp) //ebp用於存放當前程序thread_info結構的地址 testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp) jnz syscall_trace_entry cmpl $(nr_syscalls), %eax //檢查系統呼叫號(系統呼叫號應小於NR_syscalls), jae syscall_badsys //不合法,跳入到異常處理 syscall_call: call *sys_call_table(,%eax,4) //合法,對照系統呼叫號在系統呼叫表中尋找相應服務例程 movl %eax,PT_EAX(%esp) //儲存返回值到棧中 syscall_exit: testl $_TIF_ALLWORK_MASK, %ecx //檢查是否需要處理訊號 jne syscall_exit_work //需要,進入 syscall_exit_work restore_all: TRACE_IRQS_IRET //不需要,執行restore_all恢復,返回使用者態 irq_return: INTERRUPT_RETURN //相當於iret
system_call流程圖:
問題與分析
在MenuOS系統中使用time-asm
功能時,系統會發生溢位導致崩潰
但是函式本身並沒有問題,因此猜可能是在make
編譯的過程中出現問題,將Makefile
檔案中的gcc編譯器改為4.8版本後問題解決。