1. 系统调用的实现

  开发程序需所有的接口在user.h中,包含两部分system call和ulib

  user.h中的系统接口函数在usys.S中通过汇编实现

#define SYSCALL(name) \
.globl name; \
name: \
movl $SYS_ ## name, %eax; \
int $T_SYSCALL; \
ret SYSCALL(fork)
.......

  把系统调用ID放入eax中,使用int T_SYSCALL中断

2. int 指令

  int n 指令是调用n号中断的中断过程。最终效果和函数调用类似,中断过程执行结束过后返回。

3. xv6 中断处理

  在tvinit中生成了中断描述表(IDT),然后在idtinit中加载该中断描述表,注册0-255中断的处理过程。在tvinit函数中我们可以看到T_SYSCALL中断要求的调用权限是 DPL_USER,所有我们可以在用户空间调用T_SYSCALL中断。

  每个中断的处理过程在vectors.S(vector.pl生成)中实现,压入不同参数过后执行alltraps。在alltraps中准备参数trapframe,然后调用c实现的函数trap。

  trap函数实现如下:

  

void trap(struct trapframe *tf)
{
if(tf->trapno == T_SYSCALL){
if(myproc()->killed)
exit();
myproc()->tf = tf;
syscall();
if(myproc()->killed)
exit();
return;
}
.....
}

  当中断是T_SYSCALL时执行函数syscall, syscall根据eax中的系统调用id,确定具体函数,执行相应函数,把执行结果放入eax中。

void syscall(void)
{
int num;
struct proc *curproc = myproc(); num = curproc->tf->eax;
if(num > && num < NELEM(syscalls) && syscalls[num]) {
curproc->tf->eax = syscalls[num]();
} else {
cprintf("%d %s: unknown sys call %d\n",
curproc->pid, curproc->name, num);
curproc->tf->eax = -;
}
}

//TODO trapframe 是如何构建的

参考:https://th0ar.gitbooks.io/xv6-chinese/content/content/chapter0.html

最新文章

  1. 关于SharpDevelop 4版本以上没有ILAsm模板项目问题
  2. Activity Intent相关FLAG介绍
  3. clang编译器简介
  4. Java基础:继承,封装,多态,抽象类,接口
  5. Qt工程转化为Vs工程
  6. [Azure] Notification Hubs注册模式
  7. Android应用开发高效工具集1---ant构建简单Android项目
  8. 后台接受ajax传递值的实例代码
  9. fastclick插件 导致 input[type=&quot;date&quot;] 无法触发问题解决方案
  10. C++实现一个多线程同步方式的协同工作程序示例
  11. android--使用Struts2服务端与android交互
  12. C#中Predicate的一点理解
  13. PHP 初学者的学习线路和建议【1】
  14. uva 10560 - Minimum Weight(数论)
  15. NHibernate教程(12)--延迟加载
  16. 重装系统windows10/8/7,绝对纯净版永久激活的详细步骤和固态硬盘找不到分区的原因
  17. SQLServer之创建索引视图
  18. 2018总结--&gt;2019新目标
  19. 结对项目3-功能增强型带基本函数计算java计算器
  20. ELK+SpringBoot+Logback离线安装及配置

热门文章

  1. 虚拟机上安装SVN服务
  2. 微信小程序语音(A)发给别人(B),也能播放,是需要先把语音上传到自己的服务器上才可以
  3. uboot源码分析2-启动第二阶段
  4. 实验吧-web-Guess Next Session(session简介)
  5. 整合 nginx php-fpm
  6. POJ 3614:Sunscreen 贪心+优先队列
  7. MongoDB 副本集搭建
  8. 启用root关闭客人会话
  9. SpringBoot#自定义配置的封装
  10. 72.Python中ORM聚合函数详解:Avg,aggregate,annotate