上交os lec3 中断,异常与系统调用

  • OS如何外设交互,键盘等外设具有控制器和缓冲区,将输入存入缓冲区,而OS去获取输入数据有两种方式,一种是轮询(OS会去读状态寄存器,如果标记位ready,OS等待1s或者10s,确保数据ready,那么OS就会去读数据寄存器,这样太慢了),一种是中断对于linux中处理万兆的网络,会聚集一些包,发一个中断,在去轮询处理这些网络包,轮询中断会结合使用
  • 用户态也可以直接去控制硬件,但是需要OS实现配置。
  • 中断是指外部设备的信号,是异步的,而异常是同步的,也就说是在程序执行的时候产生的事件,包括系统调用
  • 在不同的体系结构里面对于异常中断的称呼不同
  • AArch64的中断分为两种重置中断,系统刚上电或者watchdog监控到系统有问题(比如系统过热)都会触发重置
  • AArch64中(同步)异常有中止(比如page falut或者除零异常)或者异常产生指令(SVC表示系统调用)
  • x86-64中的异常中断

中断的产生

  • GIC(general interrupt)路由中断?
  • 中断控制器需要考虑的问题
  • IRQ与FIQ中断处理起来不同
  • 非向量中断相同处理入口,之后由软件根据寄存器状态去调用具体的处理函数
  • 演进到现在成立GIC
  • 中断不能够占用太多时间?第一种解决方式是batch,累计处理几个中断,比如linux中的网卡数据,第二种方式是delay,但是要选择delay中断的合适的部分,如果delay了不合适的部分,就可能会造成,看视频卡顿之类的不好的结果,也就是可以把中断中非关键的部分推迟
  • 其中Top Half是:保存寄存器,屏蔽其他中断,恢复寄存器,返回原来场景
  • Bottom Half可以是软中断(softirqs),Bottom Half的执行可以被打断
  • 中断处理没有上下文中断处理时不能够去和用户地址空间交换数据,如果和用户态交换数据,可能会引起缺页异常,也可能会破坏当前用户执行过程的状态

异常的处理

  • 异常处理要做一些事,在xv6讲了
  • AArch64处理异常EL0是指特权级
  • 发生异常是在异常向量表中寻找handler,向量表的基址在VBAR_EL1中,选择基于:异常的类型,特权级,处理器状态(栈指针/运行状态)对于这里的异常发生时处理器的状态EL1,使用SP_EL0作为SP,当陷入内核的时候,由于还需要获取用户态的数据,所以SP为SP_EL0,也就是用户态的栈指针,但是在内核态(EL1)时,访问用户态的栈数据,可能会出现缺页异常等问题,所以有对应的异常处理函数一个例子是
  • 类似与xv6中,同步异常,也就是系统调用的处理
  • gbd使用ptrace()系统调用strace 的 -o表示把追踪结果放到 hello.out中
  • 在AArch64是使用寄存器传参,多个参数可以使用结构体,然后传结构体指针,但是这样会存在安全问题所以在系统调用中,用户态的指针一定要去检查linux中检测用户态指针使用的是非全面检查,就是检测最大边界栈空间
  • 更进一步的检测用户指针问题的方法是
  • 系统调用导致性能不行,可以采取batch等方式
posted @ 2022-04-11 16:05  抿了抿嘴丶  阅读(65)  评论(0编辑  收藏  举报