2015-02-11 44 views
1

我想實現一個系統調用,其中我傳遞了一個對結構變量的引用,然後我想在相同的文件中顯示這些值。如何實現具有結構參數的系統調用?

例如我有以下結構。

struct procInfo{ 
int processID[64]; // the PID of each process 
}; 

比方說,系統調用我想要實現是int getProcessIds(struct procInfo*),我把它稱爲pcid.c文件中。

我希望系統調用從proc.c文件內的調度程序中獲取進程ID,以便我可以在我的pcid.c文件中打印它們。

我知道如何創建沒有輸入參數的常規系統調用。我也知道如何在proc.c文件中使用此係統調用來打印進程ID,但是我不知道如何在pcid.c文件中打印它們。我不明白結構指針是如何返回的,所以我可以在pcid.c中打印它。

我跟着一個類似的系統調用int fstat(int fd, struct stat*)但我看不到結構指針是如何返回的。

我希望我的問題很清楚,我使用的是XV6操作系統,謝謝!

更新

我能得到它的工作,我也沒必要使用malloc分配內存。儘管這是一件奇怪的事情,但我在結構中添加了另一個變量,所以它就變成了這樣。

struct procInfo{ 
int processID[64]; // the PID of each process 
char processname[64][16] // the name of each process 
}; 

系統調用proc.c文件後,這裏是我如何打印值。

printf(1,"Name = %s\n" ,procInfo->processname[0]); 
printf(1,"PID = %d\n" , procInfo->processID[0]); 

但奇怪的是,我得到的trap 14 err 4 on cpu 1 eip 0x510 addr 0x7417ba08--kill proc,但是我試着打印只有一個值和它的工作。

printf(1,"Name = %s\n" ,procInfo->processname[0]); 
//printf(1,"PID = %d\n" , procInfo->processID[0]); 

或者

//printf(1,"Name = %s\n" ,procInfo->processname[0]); 
printf(1,"PID = %d\n" , procInfo->processID[0]); 

時,我只打印其中的一個爲什麼工作?我打印正確嗎?

回答

1

指針不返回,但指向syscall將寫入的分配內存。內存需要在調用系統調用之前由調用者分配。

如果已經在proc.c裏面分配了一個這樣的結構體,你應該把它複製到memcpy提供的緩衝區中。除了存在巨大的安全風險之外,您不應該將內核內存引用到用戶空間程序中,除非程序知道它在任何時候都可能會發生更改,或者存在於程序無法訪問的內存區域中。

一個典型的用法是這樣的:

用戶空間的一部分:

struct procInfo info; 
getProcessIds(&info); 

內核空間的一部分:

int getProcessIds(struct procInfo *info) 
{ 
    struct procInfo *localInfo = getProccessInfoFromScheduler(); 
    memcpy(info, localInfo, sizeof(struct procInfo)); 
    return 0; 
} 
+0

,所以如果我聲明如下'結構procInfo * procInfo;',我在進行系統調用之前如何爲它分配內存?現在我進行系統調用,但是我沒有爲結構分配任何內存。 – Ammar 2015-02-11 02:38:36

+1

'malloc(sizeof(struct procInfo))''。或者,您可以像堆棧中常用的那樣將它分配到堆棧上(不使用'*'來定義它)。 – StenSoft 2015-02-11 02:39:59

+0

你是這樣說的嗎? 'struct procInfo * procInfo = malloc(sizeof(struct procInfo));'我不認爲它的工作! – Ammar 2015-02-11 02:45:43