2011-11-05 21 views
12

Bất kỳ một thể cho tôi biết/chỉ cho tôi bất kỳ tài liệu tham khảo để làm thế nào để thêm một hệ thống gọi/tiện ích trong XV6làm thế nào để thêm một hệ thống gọi/tiện ích trong xv6

tìm kiếm đầy đủ trên google là vô ích và hack một cách khó khăn cũng không hiệu quả cho đến nay.

cuốn sách tham khảo cũng không có bất kỳ ví dụ hello world để bắt đầu với bất kỳ sự giúp đỡ rất nhiều đánh giá cao

Trả lời

39

Để thêm một cuộc gọi hệ thống có thể được gọi trong vỏ xv6 của, bạn nên để một cái gì đó với năm file

  • sysproc.c thêm việc thực hiện thực tế của phương pháp của bạn ở đây
  • syscall.h xác định vị trí của các vector hệ thống gọi kết nối với thực hiện của bạn
  • user.h xác định chức năng mà có thể được gọi thông qua vỏ
  • syscall.c bên ngoài xác định các chức năng kết nối các vỏ và hạt nhân, sử dụng các vị trí quy định tại syscall.h để thêm chức năng để các vector hệ thống gọi
  • usys.S sử dụng vĩ mô để xác định kết nối cuộc gọi của người dùng đến chức năng hệ thống gọi

  • defs.h thêm một tuyên bố về phía trước cho cuộc gọi hệ thống mới của bạn

  • sysfunc.h thêm trình xử lý cuộc gọi hệ thống mới vào tệp này cũng giống như "int sys_newsystemcall (void)"
+3

Còn về defs.h thì sao? –

+0

Phải bạn là Reut, defs.h cũng được yêu cầu. – itzhaki

5

Tôi sẽ giải thích một ví dụ đơn giản về cách thêm cuộc gọi hệ thống vào xv6.

Giả sử bạn phải thêm cuộc gọi hệ thống để nhận kích thước vùng địa chỉ của chương trình người dùng hiện đang chạy. Bạn có thể đặt tên cho hệ thống của bạn gọi là getmysize() và gọi hệ thống này từ bên trong một chương trình người dùng.

Bạn có thể viết chương trình người dùng của mình như sau. Hãy để tên chương trình là myprog.c Tôi giả sử rằng bạn biết cách thêm chương trình người dùng vào xv6. Vì vậy, tôi sẽ bỏ qua đề cập đến các bước ở đây bởi vì nó sẽ được tắt chủ đề.

#include "types.h" 
#include "stat.h" 
#include "user.h" 

int main(void){ 
    printf(1,"The size of my address space is %d bytes\n", getmysize()); 
    exit(); 
} 

Chương trình này chỉ nhằm mục đích chứng minh hoạt động của cuộc gọi hệ thống.

Bây giờ, chúng tôi sẽ thêm cuộc gọi hệ thống của chúng tôi vào xv6.

Đầu tiên hãy thêm dòng sau vào cuối tệp syscall.h.

#define SYS_getmysize 23 

Lưu ý rằng 23 tại đây có thể thay đổi tùy thuộc vào số được đưa ra trước dòng bạn sẽ thêm vào tệp. Đó là nếu số hệ thống gọi là 22 trong dòng trước dòng bạn sẽ thêm, dòng của bạn nên có số 23. Đơn giản như vậy.

Bây giờ, hãy thêm các dòng sau vào tệp syscall.c.

extern int sys_getmysize(void); 

và trong mảng của syscalls, thêm dòng sau vào.

[SYS_getmysize] sys_getmysize, 

Trong tập tin sysproc.c, đó là nơi mà việc thực hiện các cuộc gọi hệ thống của bạn đi nếu nó là một hệ thống gọi liên quan đến xử lý quá trình hoặc quản lý bộ nhớ, đặt việc thực hiện các cuộc gọi hệ thống của chúng tôi như sau.

int 
sys_getmysize(void) 
{ 
    return proc->sz; 
} 

Bây giờ trong usys.S tập tin, thêm dòng,

SYSCALL(getmysize) 

Sau đó, trong user.h tập tin, thêm như sau. Đây là cách chương trình người dùng của bạn nhìn thấy cuộc gọi hệ thống của bạn.

int getmysize(void); 

Ok. Bây giờ bạn đã sẵn sàng để chạy chương trình người dùng của mình và xem cách cuộc gọi hệ thống của bạn chạy.

Khi bạn chạy myprog.c gọi cuộc gọi hệ thống của bạn, kích thước của không gian địa chỉ của cùng một chương trình này sẽ được trả về theo những gì chúng tôi đã triển khai ở đây.

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