[英]Implementing a syscall in xv6
我正在嘗試實現一個名為 getprocs() 的系統調用,它返回實際進程的數量。 我已經實現了添加新系統調用的所有必要條件。 這個系統調用的作用是獲取表中的進程並將它們復制到一個結構數組中。 該結構體稱為 uproc,其成員為 int pid、int ppid 和 char name。 然后我在 ac 文件中創建了一個程序,試圖以樹格式打印進程,但我在打印進程名稱時遇到了麻煩。我不知道從哪里開始。 下面我附上了我的代碼,其中我定義了 getprocs()、struct uproc 和我嘗試打印進程的程序。 我還包括它向我拋出的錯誤。
proc.c 中的 getprocs() 定義:
int
sys_getprocs(void)
{
int max;
struct uproc *p;
int i = 0;
argint(0, &max);
argptr(1, (char **)&p, max*sizeof(struct uproc));
struct proc *ptr = ptable.proc;
for(; ptr < &ptable.proc[NPROC]; ptr++) {
if(!(ptr->state == UNUSED)) {
continue;
}
p[i].pid = ptr->pid;
p[i].ppid = ptr->parent->pid;
strncpy(p[i].name, ptr->name, 16);
i++;
}
return i;
}
uproc.h 中的 struct uproc:
struct uproc {
int pid;
int ppid;
char name[16];
};
試圖在 pstree.c 中打印進程的程序:
#include "types.h"
#include "stat.h"
#include "user.h"
#include "uproc.h"
int main() {
printf(20, "Made it into main\n");
int maxElements = 64;
struct uproc *processes = malloc(maxElements*sizeof(struct uproc));
int N = getprocs(maxElements, &processes);
int i = 0;
printf(10, "Starting\n");
for(; i < N; i++) {
printf(16, processes[i].name);
}
return 0;
}
屏幕上沒有打印任何內容,嘗試運行 pstree 后出現以下錯誤:
pid 3 pstree: trap 14 err 4 on cpu 1 eip 0x6da addr 0x42444cb--kill proc
對於sys_getprocs
,更改此...
if(!(ptr->state == UNUSED)) { continue; }
至...
if((ptr->state == UNUSED)) { continue; }
因為您要獲取所有正在運行的進程。
在main
,改變...
int N = getprocs(maxElements, &processes);
至...
int N = getprocs(maxElements, processes);
因為進程已經定義為指針
更改代碼的這兩部分將使程序正常工作。
將1作為第一個參數賦予printf。
例如:
printf(1, "NOPE");
就像Unix中的fprintf一樣,您需要為其提供文件描述符。 1是標准配置。
我對陷阱的最佳猜測是,當printf嘗試查找端口10或20時,它將訪問未映射的內存,並且您將獲得陷阱14,這是頁面故障的代碼。
您應該使用exit()而不是返回0。它應該可以工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.