Xv6 系统调用
Xv6 System Calls
我目前正在为大学做作业,我在必须为 Xv6 创建的几个系统调用方面遇到了一些问题。
这些系统调用的目的是从用户程序中以 0x13 模式绘制。
我的问题是:
- 有一个系统调用接收一些坐标以供另一个系统调用使用。我如何以及在哪里实际存储这些坐标(两个 int 值)。
- 在实际绘制一条线的系统调用中,我需要将像素的值设置为一种颜色,从第一个系统调用调用系统调用来设置像素不会做任何事情,是否可以从另一个系统调用进行系统调用?
如果尝试在 sysproc.c 文件上创建两个 int 全局变量,但我不确定它们是否被存储。
There's a system call that receives some coordinates to save for another system call to use. How and where to I actually store these coordinates (Two int values).
你可以创建一对新的静态变量,你可以在内核中找到一些这样的例子,比如struct superblock sb;
in fs.c
,或者int nextpid = 1;
in proc.c
所以在你的情况下,你可以有这样的东西:
int draw_xy[2];
On a system call to actually draw a line I need to set the value of a pixel to a colour, calling the system call to set a pixel from the first system call doesn't do anything, is it possible to make a system call from another system call?
我认为你不应该,但你可以有一个解决方案。
让我们想象一下,您有一个名为 draw_pixel(x, y, color);
的系统调用,在您的代码中,您将有类似的内容:
sys_draw_pixel(void) {
int x, y, color;
// read params
if(argint(0, &x) < 0 || argint(1, &y) < 0 || argint(2, &color) < 0)
return -1;
// call implementation
return _draw_pixel_color(x, y, color);
}
如果draw_pixel_color
是通过_draw_pixel_color
实现的,您可以调用它进行其他系统调用。
在那种情况下,你可以有这样的东西:
sys_draw_line(void) {
int x0, x1, y0, y1, color;
// read params
if(argint(0, &x0) < 0 || argint(1, &x1) < 0 ..... )
return -1;
int i, j;
for(i = x0; i < y1; ++i)
for(j = y0; j < y1; ++j)
_draw_pixel_color(x, y, color);
return 0;
}
我目前正在为大学做作业,我在必须为 Xv6 创建的几个系统调用方面遇到了一些问题。
这些系统调用的目的是从用户程序中以 0x13 模式绘制。
我的问题是:
- 有一个系统调用接收一些坐标以供另一个系统调用使用。我如何以及在哪里实际存储这些坐标(两个 int 值)。
- 在实际绘制一条线的系统调用中,我需要将像素的值设置为一种颜色,从第一个系统调用调用系统调用来设置像素不会做任何事情,是否可以从另一个系统调用进行系统调用?
如果尝试在 sysproc.c 文件上创建两个 int 全局变量,但我不确定它们是否被存储。
There's a system call that receives some coordinates to save for another system call to use. How and where to I actually store these coordinates (Two int values).
你可以创建一对新的静态变量,你可以在内核中找到一些这样的例子,比如struct superblock sb;
in fs.c
,或者int nextpid = 1;
in proc.c
所以在你的情况下,你可以有这样的东西:
int draw_xy[2];
On a system call to actually draw a line I need to set the value of a pixel to a colour, calling the system call to set a pixel from the first system call doesn't do anything, is it possible to make a system call from another system call?
我认为你不应该,但你可以有一个解决方案。
让我们想象一下,您有一个名为 draw_pixel(x, y, color);
的系统调用,在您的代码中,您将有类似的内容:
sys_draw_pixel(void) {
int x, y, color;
// read params
if(argint(0, &x) < 0 || argint(1, &y) < 0 || argint(2, &color) < 0)
return -1;
// call implementation
return _draw_pixel_color(x, y, color);
}
如果draw_pixel_color
是通过_draw_pixel_color
实现的,您可以调用它进行其他系统调用。
在那种情况下,你可以有这样的东西:
sys_draw_line(void) {
int x0, x1, y0, y1, color;
// read params
if(argint(0, &x0) < 0 || argint(1, &x1) < 0 ..... )
return -1;
int i, j;
for(i = x0; i < y1; ++i)
for(j = y0; j < y1; ++j)
_draw_pixel_color(x, y, color);
return 0;
}