xv6-----system calls
2015-11-18 11:33
267 查看
本文整理于网上,非原创,,,
注:如果编译错误,请首先检查复制的代码是否包含中文字符,'"()等等。
输出参数,
在fetchint和fetchStr的return正确数前
分别加入
重新编译启动xv6时,会出现下图所示
就说明说明成功了。
步骤:
1. syscall.h添加
2. syscall.c 添加
并在static int (*syscalls[])(void)中添加
3. Makefile中的UPROGS 后添加 _halt\
注意换行开头不能有空格,用Tab键进行缩进,否则会报错!
4. usys.S中添加SYSCALL(halt)
5. sysproc.c中添加sys_halt定义
6. 添加halt.c文件,加一句 halt声明
大功告成!
注:重新编译运行xv6后,输入halt,有可能会出现下图所示错误
这是qemu更新版本的原因,不是实现错误,代码实现到这里就可以了,效果不必要达到。
注:如果编译错误,请首先检查复制的代码是否包含中文字符,'"()等等。
大部分来自于洋大神哥的:http://yalongyang.com/2012/10/xv6-add-system-call/
题目一:为系统调用添加输出
在syscall.c中的,syscall函数改为void syscall(void){ int num; num= proc->tf->eax; if(num > 0 && num < NELEM(syscalls) &&syscalls[num]) { proc->tf->eax = syscalls[num](); char* name; switch(num){ case 1: name= "fork"; break; case 2: name= "exit"; break; case 3: name= "wait"; break; case 4: name= "pipe"; break; case 5: name= "read"; break; case 6: name= "kill"; break; case 7: name= "exec"; break; case 8: name= "fstat"; break; case 9: name= "chdir"; break; case 10: name= "dup"; break; case 11: name= "getpid"; break; case 12: name= "sbrk"; break; case 13: name= "sleep"; break; case 14: name= "uptime"; break; case 15: name= "open"; break; case 16: name= "write"; break; case 17: name= "mknod"; break; case 18: name= "unlink"; break; case 19: name= "link"; break; case 20: name= "medir"; break; case 21: name= "close"; break; case 22: name= "halt"; break; default: panic("Wrong"); } cprintf("%s -> %dn", name, proc->tf->eax); }else { cprintf("%d %s: unknown sys call %dn", proc->pid, proc->name, num); proc->tf->eax = -1; } }
输出参数,
在fetchint和fetchStr的return正确数前
分别加入
cprintf("argu: %d\n", *ip);
cprintf("argu: %s\n", *pp);
重新编译启动xv6时,会出现下图所示
就说明说明成功了。
题目二:为系统添加halt系统调用
模仿uptime系统调用,在xv6 pdf 搜索。加入halt系统调用。步骤:
1. syscall.h添加
#define SYS_halt 22
2. syscall.c 添加
extern int sys_halt(void);
并在static int (*syscalls[])(void)中添加
[SYS_halt] sys_halt,
3. Makefile中的UPROGS 后添加 _halt\
注意换行开头不能有空格,用Tab键进行缩进,否则会报错!
4. usys.S中添加SYSCALL(halt)
5. sysproc.c中添加sys_halt定义
int sys_halt(void) { char *p = "Shutdown"; for( ; *p; p++) outb(0x8900, *p); return 0; }
6. 添加halt.c文件,加一句 halt声明
#include"types.h" #include"stat.h" #include"user.h" int halt(); int main(int argc,char *argv[]) { halt(); return 0; }
大功告成!
注:重新编译运行xv6后,输入halt,有可能会出现下图所示错误
这是qemu更新版本的原因,不是实现错误,代码实现到这里就可以了,效果不必要达到。
相关文章推荐
- GIT
- 互联网时代IT系统的变革-硬件系统定制化发展
- 取某个表的索引明细
- Spark standlone driver on cluster 用户权限问题
- IOS开发指南读书笔记1(Xcode的基本使用)
- 业界良心机构解密:90后更适合学网络营销的六大理由!
- Linux进程间通信--信号,管道,消息队列,信号量,共享内存,socket
- 使用FastClick的同时造成元素上的trigger('click')无法触发的解决办法
- MySQL入门完全指南及Linux系统下基本的安装教程
- 继续java基础刷题
- service php-fpm restart
- SSH:Spring框架(spring之AOP)
- Android NDK编程,引入第三方.so库
- 二叉线索树(Threaded binary tree)
- IOS滤镜处理
- ARM Linux 的timezoneinfo 数据库的移植
- 入侵网站时的十种小经验
- 【开源】.net 分布式架构之任务调度平台
- PRD产品需求文档
- 下拉选择框 Spinner的用法。