1. 程式人生 > >2018-2019-1 20189205《Linux核心原理與分析》第六週作業

2018-2019-1 20189205《Linux核心原理與分析》第六週作業

跟蹤系統呼叫

除錯MenuOS新增的函式

重新下載 menu.git可以看到 在test.c檔案中增加了新的函式TimeTimeAsm

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;
}

其呼叫介面分別為timetime-asm

    MenuConfig("time","Show System Time",Time);
    MenuConfig("time-asm","Show System Time(asm)",TimeAsm);

其功能為顯示當前系統時間,
make rootfs 可以開啟增加了新功能的MenuOS系統,在系統中使用新增的功能timetime-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版本後問題解決。