作者:开心小笨笨猪 | 来源:互联网 | 2023-05-17 07:05
如题:编写LINUX中断上下文函数时注意的几点:1.不能向用户空间发送或接受数据2.不能使用可能引起阻塞的函数3.不能使用可能引起调度的函数2,3很好理解,但1为什么
如题:
编写LINUX 中断上下文函数时注意的几点:
1.不能向用户空间发送或接受数据
2.不能使用可能引起阻塞的函数
3.不能使用可能引起调度的函数
2,3很好理解,但1为什么不能向用户空间发送和接收数据呢,访问不是通过CR3寄存器 找到 目录项,再根据虚拟地址借助页表项最后找到物理地址访问吗,为什么不可以呢
4 个解决方案
处于中断上下文时,跟任何进程是没有关系的,因为没有进程概念,所以也就没有进程那种虚拟地址映射表,如果你这时候让中断程序去访问用户空间的地址,它去访问哪个进程的用户空间地址?如果你说是当前进程的用户空间,那么中断可能在任何进程运行时发生,那么中断代码就没法写得适用于所有进程。
基于很多考虑,中断中干脆就禁止访问用户空间了。
进程虚拟地址映射表是存在的,但是中断运行在中断上下文,而不是进程上下文,在中断上下文中只有物理地址逻辑地址这些整个系统公用的东西才有意义(也就是说中断代码可以看到这些映射表,而进程私有的东西,中断是不会去看的),而用户空间地址是进程私有的,中断服务代码中如果真的去访问进程私有空间,那么同样的中断代码在不同的时刻会有不可预测的行为和结果,因为中断可能发生在任何进程运行的时间点。
确实虚拟地址映射表中会有某些虚地址没有分配物理内存的情况,但是跟这个问题没有关联。而且可以验证的是,如果在isr中访问非法地址肯定会挂掉。即使你在用户空间访问一个不存在于映射表的地址,也一样会出错,只是系统没有挂掉而已。