
以下关于系统调用和常规调用的说法中,错误的是()
A.系统调用一般比常规函数调用的执行开销大B.系统调用需要切换堆栈C.系统调用可以引起特权级的变化D.常规函数调用和系统调用都在内核态执行...
A.系统调用一般比常规函数调用的执行开销大
B.系统调用需要切换堆栈
C.系统调用可以引起特权级的变化
D.常规函数调用和系统调用都在内核态执行 展开
B.系统调用需要切换堆栈
C.系统调用可以引起特权级的变化
D.常规函数调用和系统调用都在内核态执行 展开
1个回答
展开全部
【答案】:D
系统调用相对常规函数调用执行开销要大,因为这会涉及到用户态栈和内核态栈的切换开销,特权级变化带来的开销,以及操作系统对用户态程序传来的参数安全性检查等开销。如果发出请求的请求方和应答请求的应答方都在内核态执行,则不用考虑安全问题了,效率还是需要的,直接用常规函数调用就够了。 以ucr S为例,我们可以看到系统调用的开销在执行“it 0x80”和“irt”带来的用户态栈和内核态栈的切换开销,两种特权级切换带来的执行状态(关注 kr/trap/trap.h中的trapfram数据结构)的保存与恢复等(可参看 kr/trap/traptry.S的__alltraps和__traprt的实现)。而函数调用使用的是"call"和“rt”指令,只有一个栈,不涉及特权级转变带来的各种开销。如要了解call, rt, it和irt指令的具体功能和实现,可查看“英特尔 64 和 iA-32 架构软件开发人员手册卷 2a's,指令集参考(A-M)”和“英特尔64 和 iA-32 架构软件开发人员手册卷 2B’ s,指令集参考(-Z)”一书中对这些指令的叙述。
系统调用相对常规函数调用执行开销要大,因为这会涉及到用户态栈和内核态栈的切换开销,特权级变化带来的开销,以及操作系统对用户态程序传来的参数安全性检查等开销。如果发出请求的请求方和应答请求的应答方都在内核态执行,则不用考虑安全问题了,效率还是需要的,直接用常规函数调用就够了。 以ucr S为例,我们可以看到系统调用的开销在执行“it 0x80”和“irt”带来的用户态栈和内核态栈的切换开销,两种特权级切换带来的执行状态(关注 kr/trap/trap.h中的trapfram数据结构)的保存与恢复等(可参看 kr/trap/traptry.S的__alltraps和__traprt的实现)。而函数调用使用的是"call"和“rt”指令,只有一个栈,不涉及特权级转变带来的各种开销。如要了解call, rt, it和irt指令的具体功能和实现,可查看“英特尔 64 和 iA-32 架构软件开发人员手册卷 2a's,指令集参考(A-M)”和“英特尔64 和 iA-32 架构软件开发人员手册卷 2B’ s,指令集参考(-Z)”一书中对这些指令的叙述。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询