Commit c64b596b authored by 夏彦文's avatar 夏彦文
Browse files

clear

No related merge requests found
Showing with 0 additions and 72 deletions
+0 -72
......@@ -4,9 +4,6 @@
- qemu-system-riscv64 version 7.0.0
- riscv64-linux-gnu toolchain
# doc
AVX512OS.pdf in doc directory
# run on qemu
make all
make qemu-run
......
File deleted
# 思路
初赛提测的思路是考虑xv6初始化完成后,将会运行initcode.S中的代码,这个程序的主要作用是执行系统调用exec(/init),故而,我们可以在initcode.S中直接运行测试程序,注意这里我们是可以直接拿到测试程序的名称的。
其实最基本的思路应该是检测根目录下所有的文件,但是考虑到用户程序根本无法带到测评环境,如何使项目中包含用户代码便有些困难。故而我出此下策,使用纯汇编代码运行所有的程序。
提测代码为了便于区别,增加文件init-for-test.S。
首先,注意打开控制台以给出stdin,同时使用dup系统调用给出stdout和stderror。
```
.globl start
start:
li a0, 2 //O_RDWR
la a1, 1 //console
li a2, 0
li a7, SYS_dev
ecall # dev(O_RDWR, CONSOLE, 0);
li a0, 0
li a7, SYS_dup
ecall # dup(0); // stdout
li a0, 0
li a7, SYS_dup
ecall # dup(0); // stderr
```
接下来举一个测试程序brk的例子。先使用fork以创建一个子进程,接着子进程执行brk测试程序,父进程跳到下一段代码中去,使用wait系统调用,等待子进程运行结束,再去创建下一个子进程,下一个子进程执行第二个测试程序,循环往复。
```
li a7, SYS_fork
ecall
bne a0, zero, after_brk
la a0, brk
la a1, argv_brk
li a7, SYS_exec
ecall
after_brk:
li a0, 0
li a7, SYS_wait
ecall
```
其中 brk和argv_brk的定义如下:
```
brk:
.string "/brk\0"
argv_brk:
.long brk
.zero 12 //不知道为什么要填充12个字节,实际上才能让编译出来的代码填充了8个0字节。
```
brk是待运行程序的字符串,argv_brk是程序的运行参数argv的指针数组,第一个指针指向/brk字符串,第二个应该为空指针。理论上应该为8字节long long类型的0,也就是空指针,但是鉴于一些编译器的神奇操作,在这里我们使用.zero 12才可以是编译出来的二进制代码在这里填写8字节的 0。
后续程序按照上述示例照着写即可。
# 编译运行
makefile中已经写好了相关的编译命令,只需执行
make all
然后利用tools/cmd.txt中的命令,将二进制代码按照我们指定的格式提取出来。随后将其加入到我们创建的uchar init_for_test[] 数组中,直接初始化。
考虑到这个uchar数组的大小没有超过4096Bytes,也就是一页,我们直接修改第一个用户程序的映射函数即可。(在 void userinit(void))
```
//uvminit(p->pagetable , p->kpagetable, initcode, sizeof(initcode));
uvminit(p->pagetable , p->kpagetable, init_for_test, sizeof(init_for_test));
```
如果要进入shell,运行上面的代码,如果要运行测试程序,运行下面的代码。
\ No newline at end of file
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment