xv6的程序修改入门(riscv)

增加可执行文件

在user文件夹中添加文件print-pid.c,同时在Makefile里面添加:

Add print-pid.c to Makefile

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

int main()
{
  printf("My PID is : %d", getpid());
  exit(1);
}

然后可以在操作系统中验证:

Verify in the operating system

增加系统调用(我们将以getcpuid为例子)

增加系统调用我个人理解可以分为下面四个步骤,下面我们按照步骤进行解析(PS:这里我们先跳过原理部分):

  • 增加系统调用号
  • 增加用户态入口
  • 修改kernel/syscall.c中的跳转表
  • 实现系统调用函数

增加系统调用号

kernel/syscall.h后面增加定义就好:

Add system call number in kernel/syscall.h

增加用户态入口

修改user/user.h

user/user.h中定义了程序在用户态下能使用的所有函数。如同上面的第一个例子,我们使用了getpid,但是其实我们是已经定义在user.h中了。

Definition of getpid in user/user.h

我们往其中加入getcpuid

// user/user.h
...
int getcpuid(void);
...

kernel/usys.S定义用户态入口函数

这个的作用就是把系统调用号赋值给a7寄存器,为后面使用syscall()进行分发的时候提供依据。

// kernel/usys.S
...
SYSCALL(getcpuid)
...

这样就完成了用户态入口的定义。

Hey!

If you have any non-algorithmic questions about the code, send me a message and I will be happy to help. I also hope to make more like-minded friends.