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òn về defs.h thì sao? –
Phải bạn là Reut, defs.h cũng được yêu cầu. – itzhaki