zl程序教程

您现在的位置是:首页 >  其他

当前栏目

震惊!Linux调用C Main,居然使用的缺页异常

2023-03-07 09:09:19 时间

前言: 在研究Linux调用C Main入口的时候,发现它居然使用缺页异常来调用间接调用的Main,感觉有点不可思议。

概括 C Main的用户态

_start->Glibc->Main

C Main的内核态

`start_thread
Load_elf_binary
kernel_init
ret_from_fork
__switch_to
switch_to
context_switch
__schedule
__get_vm_area_node
start_kernel`

当start_thread返回的时候,它首先会尝试调用设置的IP Register。内核态调用用户态的IP自然是报错的

Process 1 stopped
* thread #1, stop reason = step over failed (Could not create return address breakpoint.)
    frame #0: 0x00000000004016b0
error: memory read failed for 0x401600

什么是缺页异常: 当前指令要访问的内存不存在,或者无法读写内存。导致的,上面的提示内存读出错。刚好对应着着情况。

DECLARE_IDTENTRY_RAW_ERRORCODE(X86_TRAP_PF,	exc_page_fault);

通过中断符:X86_TRAP_PF。exc_page_fault函数处理了这个缺页异常,让它能够访问用户态的第一个地址,也就是Glibc前面的_start函数,从而顺利的访问C Main。

注意点: 这里主要注意下RSP的运作,ret:pop rsp和Jmp rsp。 __schedule的人物调用里面调用链可能呈现的invalid thread。 __switch_to和switch_to和里的jmp和call。 ret_from_fork的Assembly代码。 第一个断点在thread_start的new_ip设置之后,否则无法断下。

结尾: 作者:江湖评谈