我想在PintOS(pintos/src/lib/user/syscall.c中定義的halt(),create()...)中實現已定義的系統調用。 pintos/src/userprog/syscall.c中的當前系統調用處理程序不會執行任何操作。我如何創建一個進行系統調用的進程。此外,我需要自己添加一些系統調用。我該如何繼續。但首先我需要實現現有的系統調用。Pintos中的系統調用實現
0
A
回答
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,等待是不容易實現......
乾杯:)
相關問題
- 1. Linux'socketcall'系統調用實現
- 2. 系統調用實現
- 3. 使用LKM實現Linux系統調用
- 4. sys_sendto Linux系統調用實現
- 5. 在用戶空間中實現可取消的系統調用
- 6. 實現android系統
- 7. 爲菜單系統實現lua回調
- 8. 系統調用實現中的加載模塊
- 9. 將Minix 3.3系統調用實現爲libc庫調用
- 10. 如何在Linux/Android 2.6.29中查找系統調用實現?
- 11. PintOS等數據庫系統的教育項目?
- 12. 其他操作系統是否實現Linux系統調用拼接?
- 13. Laravel中的評分系統實現
- 14. F中的文件系統實現#
- 15. Linux系統調用來發現設備的文件系統
- 16. 標籤系統實現
- 17. 實現排名系統
- 18. 系統定時器實現
- 19. 聊天系統實現
- 20. 變子系統實現
- 21. 實現CPU熱插拔的系統調用
- 22. 如何實現具有結構參數的系統調用?
- 23. stdio系統如何調用open的wrapper實現?
- 24. 如何根據Linux系統調用實現過程的背景?
- 25. 系統調用中的宏
- 26. Unix中的系統調用
- 27. 使用OpenID實現會員系統
- 28. Gravatar實現進入用戶系統
- 29. 在Rails中實現標記系統
- 30. 在java中實現存儲系統
感謝。但是我想知道必須完成哪些編輯。我知道syscall處理程序必須被修改,但是需要寫入的語句是什麼。 – Dynamite
編輯系統調用之一需要做的更改 – Deepthought
鏈接已損壞請修復它 –