❓你的疑问本质是:
当
lcall使用调用门进入内核时,为什么说“从调用门中取出目标 CS:EIP”,却没看到它先压到内核栈里?不应该也要 push 进去再跳过去吗?
结论先说:
❗不是把目标 CS:EIP 压到栈里才跳过去,而是直接“跳转”到调用门里指定的目标段和偏移地址。真正压入栈的是“用户态的返回地址”(也就是从哪来的,而不是去哪的)。
✅ 我来给你完整梳理流程(关键一步步走)
✅ ① 你执行的是:
lcall selector:offset ; selector 是 GDT 中的“调用门”段选择子
✅ ② CPU 读取调用门描述符(来自 GDT):
包含以下内容:
| 字段 | 作用 |
|---|---|
Target Selector |
目标代码段(比如 Ring0 的 CS) |
Target Offset |
目标代码段内的入口偏移(EIP) |
DPL |
调用门可访问权限(谁可以调用) |
Par |

最低0.47元/天 解锁文章
855

被折叠的 条评论
为什么被折叠?



