|
|
|
@ -32,8 +32,6 @@ lab5_small
|
|
|
|
|
|
|
|
|
|
完成一切后,我们就可以正式进入实验二了!
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 3.2 实验内容
|
|
|
|
|
|
|
|
|
|
实验要求:了解系统调用的执行过程,并实现一个自定义的系统调用。
|
|
|
|
@ -85,7 +83,7 @@ PKE IS RUNNING
|
|
|
|
|
physical mem_size = 0x80000000
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
可以看到,默认情况下,spike的物理内存是2G
|
|
|
|
|
可以看到,默认情况下,spike的物理内存是2GB
|
|
|
|
|
|
|
|
|
|
你可以修改-m选项,运行app3观察输出。
|
|
|
|
|
|
|
|
|
@ -117,7 +115,7 @@ Score: 20/20
|
|
|
|
|
|
|
|
|
|
**3.3.1 系统调用**
|
|
|
|
|
|
|
|
|
|
首先,我们要知道什么是系统调用。
|
|
|
|
|
首先,我们要知道什么是系统调用。
|
|
|
|
|
|
|
|
|
|
例如读文件(read)、写文件(write)等,其实我们已经接触过形形色色的系统调用。系统调用和函数调用的外形相似,但他们有着本质的不同。
|
|
|
|
|
|
|
|
|
@ -264,8 +262,6 @@ Score: 20/20
|
|
|
|
|
|
|
|
|
|
这个函数中,我们对应用程序的ELF文件进行解析,并且最终运行应用程序。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**3.3.3 中断的处理过程**
|
|
|
|
|
|
|
|
|
|
考虑一下,当程序执行到中断之前,程序是有自己的运行状态的,例如寄存器里保持的上下文数据。当中断发生,硬件在自动设置完中断原因和中断地址后,就会调转到中断处理程序,而中断处理程序同样会使用寄存器,于是当程序从中断处理程序返回时需要保存需要被调用者保存的寄存器,我们称之为callee-saved寄存器。
|
|
|
|
@ -400,9 +396,4 @@ handle_trap函数中实现了S模式下各类中断的处理。可以看到,
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
do_syscall中通过传入的系统调用号n,查询syscall_table得到对应的函数,并最终执行系统调用。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|