VMA(vm_area_struct) 的 nopage/fault 操作是在缺页异常中被调用,如果请求的页面不在主存中而在磁盘上,就需要从磁盘上读取内容到主存中,这时就会有文件IO操作(意味着会睡眠),但如果 nopage/fault 可以睡眠,那它就不能运行在缺页异常(中断上下文)中。
如何缺页异常中需要IO操作了,内核是怎么做的?跟了一下缺页异常的代码,有些复杂,目前还没头绪。难道是当需要IO操作时就先将当前进程挂起,然后再启动一个内核线程,当缺页异常退出后再由这个内核线程完成被推后的 IO 操作并唤醒被挂起的进程?(只是猜测,在内核源码中还没找到有这样的代码)
如何缺页异常中需要IO操作了,内核是怎么做的?跟了一下缺页异常的代码,有些复杂,目前还没头绪。难道是当需要IO操作时就先将当前进程挂起,然后再启动一个内核线程,当缺页异常退出后再由这个内核线程完成被推后的 IO 操作并唤醒被挂起的进程?(只是猜测,在内核源码中还没找到有这样的代码)
中断和异常都保存了进程的上下文,只要中断开着,执行进程切换理论上也是可行的。
至于中断中为什么不能睡眠,看了下面这篇文章,了解个大概:
http://www.360doc.com/content/13/0911/15/7377734_313740608.shtml