亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2165 | 回復(fù): 1
打印 上一主題 下一主題

linux 0.11 中 fork 的實現(xiàn) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2009-12-22 15:02 |只看該作者 |倒序瀏覽

                                                在 ./init/main.c 中第一次出現(xiàn)fork調(diào)用
static inline _syscall0(int,fork)
void main(void)
{
    if( !fork() ){
        init();
    }
}
其中 _syscall0 是一個宏定義,在 ./include/initd.h 中
#define _syscall0(type,name) \
type name(void) \
{ \
long __res; \
__asm__ volatile ( "int $0x80" \
    :"=a" (__res) \
    :"" (__NR_##name));\
if (__res >= 0) \
    return (type) __res;\
errno = -__res; \
return -1;\
}
在 ./include/unistd.h 中
#define __NR_fork  2
將fork進行宏替換
static int fork(void)
{
    long _res;
    _asm_ volatile ("int $0x80" : "=a"(_res) : "0"(_NR_fork));
    if( _res >= 0 )
        return (int) _res;
    errno = -_res;
    return -1;
}
函數(shù)是用NR_fork 來初始化eax (eax=2), 說明fork就是int 0x80的 2號調(diào)用,好,進入中斷
在 ./kernel/system_call.s 中找到int 0x80中斷的處理函數(shù)
.align 2
_system_call:
    cmpl $nr_system_calls-1,%eax
    ja bad_sys_call
    push %ds
    push %es
    push %fs
    pushl %edx
    pushl %ecx        # push %ebx,%ecx,%edx as parameters
    pushl %ebx        # to the system call
    movl $0x10,%edx        # set up ds,es to kernel space
    mov %dx,%ds
    mov %dx,%es
    movl $0x17,%edx        # fs points to local data space
    mov %dx,%fs
    call _sys_call_table(,%eax,4)
在./include/linux/sched.h 中有 fn_ptr 的定義
    typedef int (*fn_ptr) ()
在 ./include/linux/sys.h 中
fn_ptr sys_call_table[] = { sys_setup, sys_exit,sys_fork,...}
所以call 的調(diào)用地址就是 _sys_call_table + %eax * 4 即:sys_fork ( 其中eax=2, 每個指針的長度是4, 所以用_sys_call_table的首地址加 2*4, 就是 _sys_call_table 數(shù)組中的第二個元素的地址,即sys_fork )
call _sys_call_table(,%eax,4) 即:call _sys_fork
在./kernel/system_call.s中
.align 2
_sys_fork:
    call _find_empty_process
    test1 %eax,%eax
    js 1f
    push  %gs
    pushl %esi
    pushl %esi
    pushl %esi
    pushl %esi
    call _copy_process
    add $20,%esp
1:    ret
可見fork又主要是調(diào)用了兩個函數(shù):
    find_empty_process 和 copy_process ;它們都在kernel/fork.c中實現(xiàn)
說明:gcc編譯器在生成匯編代碼,其函數(shù)名及變量名前都會都會加_,所以在匯編中調(diào)用C的函數(shù)或變量的時候,需要手動加上一個下劃線。
               
               

本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u3/107080/showart_2127998.html

論壇徽章:
0
2 [報告]
發(fā)表于 2013-10-05 17:52 |只看該作者
寫的很好,大贊一個!
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP