2014-11-21 15 views
5

Tôi đang cố tạo một trình lập lịch biểu dựa trên mức độ ưu tiên đơn giản trong XV6. Để thực hiện điều này, tôi cũng phải tạo một cuộc gọi hệ thống sẽ cho phép một quy trình thiết lập mức độ ưu tiên của nó. Tôi đã làm tất cả mọi thứ cần thiết để tạo ra các cuộc gọi hệ thống như đã thảo luận ở đây và các nơi khác:Làm thế nào để chuyển một giá trị vào một hàm gọi hệ thống trong XV6?

how do i add a system call/utility in xv6

Vấn đề là, tôi không thể vượt qua bất kỳ biến khi tôi gọi hàm, hay đúng hơn, nó chạy như không có gì là sai nhưng các giá trị chính xác không hiển thị bên trong hàm.

extern khai (syscall.c):

... 
extern int sys_setpty(void); 

static int (*syscalls[])(void) = { 
... 
[SYS_setpty] sys_setpty, 
}; 

Sys-gọi Vector (syscall.h):

#define SYS_setpty 22 

thực hiện (sysproc.c):

void 
sys_setpty(int pid, int pty) 
{ 
    cprintf("function pid: %d \n", pid); 
    cprintf("function pty: %d \n", pty); 
} 

(defs.h & user.h):

void setpty(int, int); 

Macro (usys.S):

SYSCALL(setpty) 

Chức năng cuộc gọi:

setpty(3, 50); 

Output:

function pid: 16843009 
function pty: 16843009 

Các giá trị luôn là con số chính xác giống nhau: 16843009. Tôi có kiểm tra xem liệu cprintf có hoạt động chính xác hay không bằng cách gán giá trị cho pid và pty. Tôi đã dành khoảng 6 giờ cố gắng mọi kết hợp có thể có của tất cả mọi thứ tôi có thể nghĩ đến và tôi bắt đầu nghĩ rằng không có cơ chế tích hợp để truyền các giá trị thông qua một cuộc gọi hệ thống trong XV6. Tui bỏ lỡ điều gì vậy? Cảm ơn bạn trước.

Trả lời

8

Việc chuyển đối số từ các hàm cấp người dùng đến các hàm mức hạt nhân không thể được thực hiện trong XV6. XV6 có các hàm dựng sẵn của riêng nó để chuyển các đối số vào một hàm hạt nhân. Ví dụ, để truyền vào một số nguyên, hàm argint() được gọi. Trong việc thực hiện mà tôi sử dụng cho các chức năng thiết lập ưu tiên, điều đó sẽ giống như thế:

argint(0, &pid); 

... để có được những số đầu tiên đó là Process ID, và:

argint(1, &pty); 

. .. để có được đối số thứ hai là ưu tiên mong muốn. Cuộc gọi chức năng từ quá trình người dùng giống như sau:

setpty(getpid(), priority); 
+0

Tôi bị kẹt ở cùng một điểm mà bạn có thể phấn khởi? – WannaBeCoder

+0

Đó là một vài tháng kể từ khi tôi chơi với điều này, tôi sẽ cố gắng nhưng tôi không rõ ràng về những gì bạn cần được xây dựng. – bertmoog

+0

Nhờ câu trả lời của riêng bạn +1, tôi đã nhận được cách chuyển các tham số từ không gian người dùng đến không gian hạt nhân. Tuy nhiên tôi không thể thực hiện việc lập lịch dựa trên mức độ ưu tiên. :( – WannaBeCoder

Các vấn đề liên quan