【发布时间】:2018-10-23 09:39:40
【问题描述】:
目前我正在阅读了解 linux 内核的系统调用一章,我无法理解 linux 内核如何知道通过 syscall() 传递的地址参数是无效的这一事实。
Book 提到地址检查会延迟到它被使用,当 linux 使用这个地址时它会产生页面错误。 它进一步提到在内核模式下可能会在三种情况下发生故障
• 内核尝试寻址属于该进程的页面 地址空间,但要么对应的页框不存在,要么 或者内核正在尝试写入只读页面。
• 某些内核函数包含一个编程错误,该错误会导致 执行该程序时引发的异常;或者, 该异常可能是由暂时性硬件错误引起的。
• 系统调用服务例程尝试读取或写入 地址已作为系统调用参数传递的内存区域, 但该地址不属于进程地址空间。
这些情况必须通过缺页处理程序来区分,因为要采取的操作完全不同。缺页处理程序可以通过确定错误的线性地址是否包含在所拥有的内存区域中来轻松识别第一种情况过程。
但是内核如何区分剩余的两种情况。虽然在教科书中有解释,但对我来说似乎很陌生。请帮忙解释一下。
【问题讨论】:
-
您的问题有问题。当内核模式下可能发生页面错误时,您的三种情况似乎都没有解决。
标签: linux linux-kernel operating-system system-calls