(114) 4-23 函tell_father,namei ,进程结束时候是要给父进程发信号的。以及打开文件:
(115) 4-24 _exit及do_exit调用链:
(116)4-25 函execve,sys_execve,do_execve 及其调用链。通过 fork + execve 让新进程执行新函数,新代码,新功能:
(117) 4-26 函count,结构exec,汇编指令stosb及lodsb ,这些将会被 execve 在创建新函数时被调用:
(118) 4-27 函strchr,get_ds,get_fs,set_fs,结构sigaction:
(119) 4-28 函copy_strings ,名字是字符串的复制,但功能要复杂些,比如要记录写入内存的位置:
(120) 4-29 函set_limit ,修改段描述符中的段界限字段:
(121) 4-30 函put_page及tcb.brk 成员的名称起源。 put_page 主要是把本进程已申请已掌握的内存页注册到线性地址空间里,即页目录表和页表里:
(122) 4-31 函change_ldt ,修正本进程的 LDT 表,很显然,只有内核态,不需要使用 LDT 表进行寻址时候,才可以进行此操作:
(123) 4-32 函create_tables ,创建表,继续在未来的要执行的代码的栈的顶端完善参数数组和环境字符串数组。所以说,看反汇编的时候,感觉函数的参数和局部变量是在栈里,也是有道理的。栈指针以上是初始化的数据,栈以下留给栈使用 :
(124) 4-33 函do_execve 上 ,分析最重要的函数,完成执行新代码的准备工作,修改 tcb 块,删除源代码的占据的内存,因本函数太大,一版面放不下,把对脚本文件的执行放到下一页:
(125) 4-34 函do_execve 下脚本解析 。可见,执行脚本文件,其实是运行跟脚本匹配的解释器程序,比如各版本的 shell :
(126) 4-35 函free_page_tables,free_page 。释放原代码占据的内存页面,这些页面包含了原代码的代码与数据,execve 用不上这些了:
(127) 4-36 函do_execve调用链:
(128) 4-37 函strncpy,namei :
(129) 4-38 函 change_lgt 的合理性 ,为何修改和删除当前正在运行进程的 LDT 表和页目录项 而不会引起程序崩溃:
(130)
谢谢