PA3.2用户程序和系统调用
!!!!!!实验手册是最好的教材!!!!!!
加载第一个用户程序
实验指引中说到:目前的loader只需要做一件事情: 将ramdisk中从0开始的所有内容放置在0x4000000, 并把这个地址作为程序的入口返回即可。
所以这部分,我们需要用到如下两个函数
size_t ramdisk_read(void *buf, size_t offset, size_t len);
size_t get_ramdisk_size();
ics-pa/nanos-lite/src/src/loader.c文件中的loade()函数,然后再proc.c文件中的init_proc()函数中调用naive_load()函数。就可以完成第一个用户程序的加载,并触发1号未处理事件:
系统调用
根据实验指引中的:上述内联汇编会先把系统调用的参数依次放入%eax, %ebx, %ecx, %edx四个寄存器中, 然后执行自陷指令int $0x80 的这句话,可以正确的实现nexus-am/am/arch/x86-nemu/include/arch.h中的GPR?宏。
然后记住系统调用的接口在navy-apps/libs/libos/src/nanos.c,这个文件需要频繁的使用。
按照实验手册的要求实现SYS_yield和SYS_exit调用,即可正确执行dummy。
标准输出和堆栈管理
在fs.c文件中按照要求写好write()函数,然后不要忘了修改接口函数和写系统调用。
此时输出时,每输出一个字符就调用一次sys_write。
为了改善效率,需要实现堆栈操作,其中实验手册中描述了_sbrk()的工作原理:
- program break一开始的位置位于_end
- 被调用时, 根据记录的program break位置和参数increment, 计算出新program break
- 通过SYS_brk系统调用来让操作系统设置新program break
- 若SYS_brk系统调用成功, 该系统调用会返回0, 此时更新之前记录的program break的位置, 并将旧program
- break的位置作为_sbrk()的返回值返回
- 若该系统调用失败, _sbrk()会返回-1
按照这个流程,编写函数。
完成后,如果没有错误的话,输出不再是按每个字符进行输出: