我理解系统调用的存在是为了提供用户空间无法访问的功能,例如使用 read()
系统调用访问硬盘。我也知道这些被抽象为用户模式层的库调用,例如 fread()
,以提供跨硬件的兼容性。
因此从应用程序开发者的角度来看,我们有像这样的 东西:
//library //syscall //k_driver //device_driver
fread() -> read() -> k_read() -> d_read()
我的问题是:为什么我不能直接将
fread()
和read()
函数中的所有指令内联到我的程序中?这些指令都是相同的,所以CPU应该以相同的方式运行,对吧?虽然我没有尝试过,但我认为这不起作用的原因是我没有考虑到的某些原因。否则,任何应用程序都可以获得任意内核模式操作。简而言之:是什么使系统调用“进入”无法被应用程序复制的内核模式?
<usermode execution><*switch*><kernelmode execution>
如果我将所有这些内容内联到比如一个shellcode中,为什么我没有得到内核模式执行? - lynks