Linux0.11中的fork实现和一些注意事项(2)

pushl %eax
call _copy_process       # 调用C 函数copy_process()(kernel/fork.c,68)。
addl $20,%esp            # 丢弃这里所有压栈内容。
1: ret
里面的_find_empty_process和copy_process()就是fork的主要子函数了.

问题1:请问我这个思路是不是对的。
问题2:汇编调用C函数为什么名字不一样啊
汇编里是_find_empty_process 而在fork.c里该函数名字是find_empty_process()
汇编这样调用能找到这个函数么????
问题3:__asm__ volatile ( "int $0x80" \         // 调用系统中断0x80。
:"=a" (__res) \                                 // 返回值??eax(__res)。
:"" (__NR_##name));这个内嵌汇编里的__NR_##name值是怎么传给eax的?以让后面的call _sys_call_table(,%eax,4)正确调用sysfork;
希望能给我详细讲解这条指令:__asm__ volatile (仅这条)调用中断int $0x80的具体操作
问题1:
差不多,但是有一個地方需要強調一下。static inline _syscall0 (int, fork),這個實際上隱含指出了系統調用的參數個數,注意這裡是以0結尾的,也就是說這個系統調用不需要傳遞參數。你應該還能從代碼中看到 _syscall1,_syscall2這樣的定義。
问题2:
gcc的C編譯器compile的時候,會在函數名字前面加上一個下劃綫,所以在彙編裏面調用C的函數的時候,要手動的加上這個下劃綫。注意:這裡說的是C編譯器,不包括C++的,C++的編譯器和C的有很多的不同,所以才會有extern "C"的存在。
问题3:
开头你自己也说了NR_name 是定义的好的值。具体在 <>unistd.h>头文件里。怎么传给eax的?:"" (__NR_
##name) 这条语句就是传给eax的意思。引号中省略表示用和输出一样的寄存器,也就是输出中的a(eax)。gcc嵌入汇编的格式你应该了解吧。int $0x80就是调用系统中断了,设置系统中断的操作在sched.c 最后一行 set_system_gate(0x80,&system_call); set_system_gate是一个嵌入式宏汇编语句,设置中断描述符表表项。具体实现在system.h.这样调用0x80系统中断后,执行的是 system_call  eax中存放的是定义好的NR_name的值,以后处理过程你都说了。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/25145.html