📄 system_call_entry.asm
字号:
;文件名: system_call.asm;说明: 系统调用的汇编入口;作者: marsinfan;日期: 2006/03/02GLOBAL _system_call_entry, _child_ret_from_sys_call, _ret_from_sys_callEXTERN _system_calls, _do_signalSEGMENT _TEXT PUBLIC CLASS = CODE USE32_system_call_entry: push ds push es ; 保存段寄存器 push gs push fs push ebp push edi push esi push edx push ecx push ebx mov bx, 10h ; mov ds, bx ; mov es, bx ; 设置数据段寄存器的值 shl eax, 2 ; 根据需要系统调用序号算出具体偏移 call [eax + _system_calls] ; 调用系统调用 push eax ; 把取到了系统调用的返回值push到栈中保护起来,因为接下来要处理其他的东西 ;处理系统调用后的一些工作 _ret_from_sys_call: ;处理信号 call _do_signal; pop eax ;恢复系统调用后的返回值 (如果是fork系统调用,恢复fork后的返回值(包括父进程和子进程)) pop ebx pop ecx pop edx pop esi pop edi pop ebp pop fs pop gs pop es pop ds iretd ;新fork出的子进程被调度后会从这里直接从ring0回到ring3中_child_ret_from_sys_call: push 0; ;由于新创建的子进程第一次被调度总是从这里进入ring3, ;而在fork子进程中的返回值必定是0, ;因此我们可以把0 push栈中,在_ret_from_sys_call后再pop到eax中 jmp _ret_from_sys_call;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -