簡體   English   中英

在xv6中內核啟動后如何獲取系統調用次數?

[英]How to get number of the system calls after the kernel boot in xv6?

我想編寫一個簡單的“C”程序來查找OS啟動后的系統調用次數。 我正在關注其他系統調用,如fork()或getpid(),並基本上復制他們的大部分東西。 我不確定何時/何時應該增加我的櫃台? 任何例子?

在kernel / syscall.c中定義計數器並相應地增加它是一個好主意嗎?

void
syscall(void)
{
  int num;
  counter++; //mona
  num = proc->tf->eax;
  if(num > 0 && num < NELEM(syscalls) && syscalls[num] != NULL) {
    proc->tf->eax = syscalls[num]();
  } else {
    cprintf("%d %s: unknown sys call %d\n",
            proc->pid, proc->name, num);
    proc->tf->eax = -1;
  }
}

另外這里是我在kernel / sysproc.c中為我的簡單系統調用獲得的代碼:

sys_getsyscallinfo(void)
{

 return counter;  //mona
}

但是我收到此錯誤:

kernel/sysproc.c: In function ‘sys_getsyscallinfo’:
kernel/sysproc.c:48: error: ‘counter’ undeclared (first use in this function)
kernel/sysproc.c:48: error: (Each undeclared identifier is reported only once
kernel/sysproc.c:48: error: for each function it appears in.)
make: *** [kernel/sysproc.o] Error 1

我在kernel/defs.h計數器變量定義為extern int,並在syscall定義中將其用作kernel/sysproc.c的返回值,並在kernel/syscall.c完成所有陷阱處理的位置。 我希望它有所幫助。

這需要編輯entry.S文件。 上次我使用內核時,它位於.../arch/kernel/目錄中。 在該文件中,它首先驗證系統調用,使用call指令調用它。 在驗證之后和實際放入系統調用之前,您必須執行操作。

您無需擔心如何在User Land中訪問變量,該條目中有基指針。

順便說一下,這是調用系統調用的“新”方式(感謝P II +處理器)..最初曾經是軟件中斷int 0x80 因此,還要檢查您正在使用的內核版本。

我可能在這里錯了。我只是根據一些知識解釋一種方式(可能是最差和/或錯誤)。 如果你/ someone_else實現了這個,請用最少的代碼發布成功/失敗。

一旦我從Windows中獲得時間(可能性更小),我將自己編寫此代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM