Xv6 系统调用

Xv6 System Calls

我目前正在为大学做作业,我在必须为 Xv6 创建的几个系统调用方面遇到了一些问题。

这些系统调用的目的是从用户程序中以 0x13 模式绘制。

我的问题是:

如果尝试在 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;

}