2012-08-27 52 views
0

我想在PintOS(pintos/src/lib/user/syscall.c中定義的halt(),create()...)中實現已定義的系統調用。 pintos/src/userprog/syscall.c中的當前系統調用處理程序不會執行任何操作。我如何創建一個進行系統調用的進程。此外,我需要自己添加一些系統調用。我該如何繼續。但首先我需要實現現有的系統調用。Pintos中的系統調用實現

回答

4

pintos的默認實現終止調用過程。
轉到此link。有關如何修改代碼以實現系統調用的說明。

「src/examples」目錄包含一些示例用戶程序。
此目錄中的「Makefile」編譯提供的示例,並且您可以編輯它以編譯自己的程序。
該程序/進程在運行時會進行系統調用。
使用gdb來跟蹤一個這樣的程序的執行,一個簡單的printf語句將最終調用將系統調用寫入STDOUT文件。
給出的鏈接也有關於如何在gdb上運行pintos的指針,我的猜測是你使用的是bochs或qemu。在任何情況下,只需運行一次gdb就可以運行一個簡單的hello世界程序運行在pintos上。
這會給你一個關於如何進行系統調用的想法。

static void 
syscall_handler (struct intr_frame *f)// UNUSED) 
{ 
    int *p=f->esp; 
switch(*p) 
case *p=SYS_CREATE // NUMBER # DEFINED 

     const char *name=*(p+1); //extract the filename 
     if(name==NULL||*name==NULL) 
      exit(-1); 

     off_t size=(int32_t)*(p+2);//extract file size 

     f->eax=filesys_create(name,size,_FILE); //call filesys_create 
     //eax will have the return value 
} 

這是sys_create僞代碼..所有的文件系統相關的系統調用是很瑣碎, 的filesys realted系統調用,就像打開讀寫接近需要你的文件轉換成它們對應的FD(文件描述符)。您需要添加一個文件表中的每個過程跟蹤此,可以是預處理的數據或全局數據(UR選擇),

case (*p==SYS_WRITE) 
    { 
    // printf("wite syscall\n"); 
     char *buffer=*(p+2); 
    unsigned size=*(p+3); 
    int fd=*(p+1); 
     // getiing the fd of specified file  
    struct file *fil= thread_current()->fdtable[fd];/ my per thread fdtable 
    if(fd==1) goto here; 

    if(is_directory(fil->inode)){ 
     exit(-1); 
     goto done; 
    } 
here: 
    if(buffer>=PHYS_BASE)exit(-1); 
    if(fd<0||fd>=128){exit(-1);} 
    if(fd==0){exit(-1);} // writing to STDIN 
    if(fd==1)  //writing to STDOUT 
    { 
    int a=(int)size; 
    while(a>=100) 
    { 
     putbuf(buffer,100); 
     buffer=buffer+100; 
     a-=100; 
    } 
    putbuf(buffer,a); 
    f->eax=(int)size; 
    } 
    else 
     if(thread_current()->fdtable[fd]==NULL) 
     {f->eax=-1;} 
    else 
    { 
     f->eax=file_write(thread_current()->fdtable[fd],buffer,(off_t)size); 
    } 
done: ; 

    }//printf("write");}     /* Write to a file. */ 

公開賽 - 增加重新進入fdtable並返回FD數你給文件,
關閉 - 從fd表中刪除該條目
讀取 - 類似於寫入。

的process_create,等待是不容易實現......

乾杯:)

+0

感謝。但是我想知道必須完成哪些編輯。我知道syscall處理程序必須被修改,但是需要寫入的語句是什麼。 – Dynamite

+0

編輯系統調用之一需要做的更改 – Deepthought

+0

鏈接已損壞請修復它 –