青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

jake1036

linux0.11---fork.c函數(shù)分析

1 功能描述 
  fork()系統(tǒng)調(diào)用用于創(chuàng)建子進(jìn)程,Linux中所有的進(jìn)程都是進(jìn)程0的子進(jìn)程。

    copy_process()函數(shù)用于創(chuàng)建并復(fù)制進(jìn)程代碼段和數(shù)據(jù)段以及環(huán)境,在進(jìn)程復(fù)制的過程中,工作主要牽涉到進(jìn)程數(shù)據(jù)結(jié)構(gòu)中信息的設(shè)置。
    系統(tǒng)首先為新建進(jìn)程在主內(nèi)存區(qū)申請一頁內(nèi)存來存放任務(wù)數(shù)據(jù)結(jié)構(gòu)信息,并復(fù)制當(dāng)前進(jìn)程任務(wù)數(shù)據(jù)結(jié)構(gòu)中的所有內(nèi)容作為新進(jìn)程任務(wù)數(shù)據(jù)結(jié)構(gòu)的模板。
    隨后對已經(jīng)復(fù)制的任務(wù)數(shù)據(jù)結(jié)構(gòu)內(nèi)容進(jìn)行修改。把當(dāng)前進(jìn)程設(shè)置為新進(jìn)程的父進(jìn)程,清除信號位圖并復(fù)位新進(jìn)程的各個統(tǒng)計(jì)值。接著根據(jù)當(dāng)前進(jìn)程環(huán)境設(shè)置新進(jìn)程任務(wù)狀態(tài)段TSS中各個寄存器的值,新建進(jìn)程內(nèi)核態(tài)堆棧指針tss.esp0被設(shè)置成為任務(wù)數(shù)據(jù)結(jié)構(gòu)所在內(nèi)存頁面的頂端,而tss.ss0被設(shè)置為內(nèi)核數(shù)據(jù)段選擇符。
  每當(dāng)任務(wù)進(jìn)入內(nèi)核態(tài)運(yùn)行的時候,其內(nèi)核態(tài)堆棧指針初始位置不變,均為任務(wù)數(shù)據(jù)所在頁面的頂端。

 

 


  2源代碼分析

   
 #include <errno.h>
#include 
<linux/sched.h>
#include 
<linux/kernel.h>
#include 
<asm/segment.h>
#include 
<asm/system.h>

extern void write_verify(unsigned long address) ;
long last_pid = 0//最新進(jìn)程號,其值會由get_empty_process生成
void verify_area(void * addr ,  int size)
{
   unsigned 
long start ;
   start 
= (unsigned long) addr ;
   size 
+= start & 0xfff ;
   start 
&= 0xfffff000 ;
   start 
+= get_base(current->ldt[2]) ;
   
while(size > 0){
     size 
-= 4096 ;  
     write_verify(start) ;
     start 
+= 4096 ;
   }

}


//該函數(shù)為新的進(jìn)程在線性地址空間中設(shè)置新的代碼段和數(shù)據(jù)段基地址和限長
int copy_mem(int nr , struct task_struct * p)
{
   unsigned 
long old_data_base , new_data_base , data_limit ;
   unsigned 
long old_code_base , new_code_base , code_limit ;
   code_limit 
= get_limit(0x0f) ;
   data_limit 
= get_limit(0x17) ;
   old_code_base 
= get_base(current->ldt[1]) ;
   old_data_base 
= get_base(current->ldt[2]) ;
   
if(old_code_base != old_data_base)
     panic(
"We donot support seperate ID") ;
   
if(data_limit < code_limit) 
     panic(
"Bad data_limit") ;

   new_data_base 
= new_code_base = nr * 0x4000000 ; //nr * 64MB
   p->start_code = new_code_base ;
   set_base(p
->ldt[1] , new_code_base) ;
   set_base(p
->ldt[2] , new_data_base) ;
   
if(copy_page_tables(old_data_base , new_data_base , data_limit))
    
{
      free_page_tables(new_data_base , data_limit) ;
      
return -ENOMEM ;

    }

    
return 0 ;   
}


//下面是主要的fork程序,負(fù)責(zé)復(fù)制系統(tǒng)進(jìn)程信息
//并且設(shè)置必要的寄存器,還整個地復(fù)制數(shù)據(jù)段

int copy_process(int nr , long ebp , long edi , long esi , long gs , long none ,
 
long ebx , long ecx , long edx , long fs , long es , long ds , long eip ,
long cs , long eflags , long esp , long ss)
{
  
struct task_struct * p ;
  
int i ;
  
struct file * f ;
  p 
= (struct task_struct *) get_free_page() ;
  
if(!p)
    
return -EAGAIN ;
  task[nr] 
= p ;       
  
*= * current ; //并不是指針的賦值 ,而是直接申請了一個空間 
  
//下面開始修改任務(wù)數(shù)據(jù)結(jié)構(gòu)的值
  p->state = TASK_UNINTERRUPTIBLE ; 
  p
->pid = last_pid ;
  p
->father = current->pid ;
  p
->counter = p->priority ;//設(shè)置時間片
  p->signal = 0 ;   //信號位圖置0
  p->alarm = 0 ; //報(bào)警定時器值
  p->leader = 0 ;//進(jìn)程的領(lǐng)導(dǎo)權(quán)
  p->utime = p->stime = 0 ; //用戶態(tài)號和心態(tài)的運(yùn)行時間
  p->cutime = p->cstime = 0 ;//子進(jìn)程用戶態(tài)和和核心態(tài)的運(yùn)行時間  
  p->start_time = jiffies ; //進(jìn)程當(dāng)前的運(yùn)行時間
  

  p
->tss.back_link = 0  ;
  p
->tss.esp0 = PAGE_SIZE + (long) p ; //任務(wù)內(nèi)核態(tài)棧指針
  p->tss.ss0 = 0x10 ;       //內(nèi)核態(tài)的段選擇符,與數(shù)據(jù)段選擇符相同
  p->tss.eip = eip  ;
  p
->tss.eflags = eflags ; 
  p
->tss.eax = 0 ; //這是當(dāng)fork()調(diào)用返回時 新進(jìn)程會返回0的原因
  p->tss.ecx = ecx ;
  p
->tss.edx = edx ;
  p
->tss.ebx = ebx ; 
  p
->tss.esp = esp ;
  p
->tss.ebp = ebp ;
  p
->tss.esi = esi ;
  p
->tss.edi = edi ;
  p
->tss.es = es & 0xffff ;
  p
->tss.cs = cs & 0xffff ;
  p
->tss.ss = ss & 0xffff ;
  p
->tss.ds = ds & 0xffff ;
  p
->tss.fs = fs & 0xffff ;
  p
->tss.gs = gs & 0xffff ;
  p
->tss.ldt = _LDT(nr) ;  
  p
->tss.trace_bitmap = 0x80000000 ;
  

  
if(last_task_used_math == current)
   __asm__(
"clts ; fnsave %0" ::"m"(p->tss.i387)) ;
  
//接下來復(fù)制進(jìn)程頁表,即在線性地址空間設(shè)置新任務(wù)代碼段和數(shù)據(jù)段描述符中的基地址和限長,并復(fù)制頁表。  
  if(copy_mem(nr , p)){
    task[nr] 
= NULL ;
    free_page((
long)p) ;
    
return -EAGAIN ;
  }


  
//如果父進(jìn)程中有些文件是打開的,則將對應(yīng)文件的打開次數(shù)加1 ,因?yàn)樽舆M(jìn)程會共享父進(jìn)程打開的這些文件
  for(i = 0 ; i < NR_OPEN ; i++)  
    
if(f = p->filp[i])
     f
->f_count++ ;
  
if(current->pwd)
     current
->pwd->i_count++ ;
  
if(current->root)
    current
->root->i_count++ ;
  
if(current->executable)
    current
->executable->i_count++ ;

  
//最后在GDT表中設(shè)置新任務(wù)TSS段和LDT段描述符
  set_tss_desc(gdt + (nr<<1+ FIRST_TSS_ENTRY , &(p->tss)) ;
  set_ldt_desc(gdt 
+ (nr<<1+ FIRST_LDT_ENTRY , &(p->ldt)) ;
  p
->state = TASK_RUNNING ;  
   
  
return last_pid ;
}


//為新進(jìn)程取得不重復(fù)的進(jìn)程號last_pid ,函數(shù)返回在任務(wù)數(shù)組中的任務(wù)號
 int find_empty_process(void)
{
  
int i ; 
  repeat:
    
if((++last_pid) < 0) last_pid = 1 ;
    
for(i = 0 ; i < NR_TASKS ; i++)
       
if(task[i] && task[i]->pid == last_pid)
           
goto repeat ;

    
for(i = 1 ; i < NR_TASKS ; i++)  
       
if(!task[i])
          
return i ;

    
return -EAGAIN ; 
}










  

posted on 2010-11-08 19:48 kahn 閱讀(1042) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久精品亚洲一区二区| 奶水喷射视频一区| 亚洲一区二区三区四区在线观看 | 亚洲在线观看视频| 欧美日一区二区在线观看| 亚洲欧美激情视频| 久久精品欧美日韩精品| 亚洲国产精品嫩草影院| 国产精品v欧美精品v日韩| 亚洲在线日韩| 欧美日韩一区高清| 亚洲精品你懂的| 久久久久**毛片大全| 久久久久国产精品一区| 麻豆精品精华液| 亚洲第一毛片| 亚洲一级黄色av| 久久另类ts人妖一区二区| 欧美激情无毛| 国产女主播一区二区| 亚洲国产婷婷香蕉久久久久久| 中文欧美日韩| 久久午夜电影| 一区二区三区久久网| 久久国产日韩| 欧美视频日韩视频在线观看| 国产精品久久久久久亚洲调教| 亚洲第一搞黄网站| 亚洲二区三区四区| 巨胸喷奶水www久久久免费动漫| 国产精品区二区三区日本| 亚洲国产成人久久| 亚洲国产一区视频| 亚洲欧美精品在线| 欧美理论电影在线观看| 国产精品久久久久久久7电影| 久久国产福利国产秒拍| 午夜久久99| 午夜精品在线观看| 亚洲无线视频| 亚洲欧美日产图| 亚洲欧洲一级| 亚洲精品国产精品国自产观看| 欧美大片免费| 香蕉乱码成人久久天堂爱免费| 欧美精品久久久久久久久老牛影院| 国产一区二区激情| 久久国产主播| 午夜精品国产更新| 国产欧美日韩在线视频| 亚洲欧美激情视频| 亚洲视频欧美在线| 欧美日韩精品伦理作品在线免费观看| 亚洲第一精品电影| 久久亚洲精品一区二区| 午夜精品久久久久影视 | 亚洲精品免费观看| 欧美va日韩va| 久久五月婷婷丁香社区| 精品成人一区二区三区| 久久亚洲春色中文字幕久久久| 亚洲欧美成人一区二区三区| 国产精品热久久久久夜色精品三区| av不卡免费看| 亚洲精品一区二区网址| 欧美日韩国产在线看| 欧美日韩一区二区三区四区在线观看| 欧美自拍偷拍午夜视频| 亚洲精品影院| 亚洲国产美女| 欧美日韩一区精品| 午夜精品一区二区三区在线视| 亚洲欧美一区二区三区极速播放 | 国内精品视频一区| 亚洲国产成人精品视频| 女同性一区二区三区人了人一| 久久精品人人做人人爽| 在线成人激情黄色| 亚洲国产成人一区| 欧美日韩精品一区二区三区四区| 亚洲天堂偷拍| 欧美一级理论性理论a| 欧美成人午夜影院| 亚洲第一中文字幕| 国产欧美日韩一区| 欧美激情国产高清| 国产日韩欧美电影在线观看| 亚洲激情成人网| 国产精品国产自产拍高清av| 久久久久久9999| 国产日本欧美在线观看| 久久精品中文字幕免费mv| 免费成人性网站| 国产综合久久久久久| 久久免费精品视频| 欧美人妖另类| 精品999久久久| 性色一区二区| 在线播放精品| 欧美二区在线| 免费亚洲电影在线| 欧美精品18+| 久久久久久久久伊人| 免费永久网站黄欧美| 午夜性色一区二区三区免费视频| 麻豆91精品91久久久的内涵| 亚洲综合视频在线| 美女999久久久精品视频| 亚洲欧美在线免费观看| 欧美成人国产va精品日本一级| 亚洲欧美日韩国产一区| 免费看成人av| 久久免费精品日本久久中文字幕| 欧美日韩在线电影| 欧美黄色免费| 伊人久久久大香线蕉综合直播| 亚洲午夜精品久久久久久浪潮 | 亚洲精品影院在线观看| 激情综合电影网| 新67194成人永久网站| 亚洲一区二区伦理| 一本一本a久久| 午夜国产精品视频免费体验区| 夜夜嗨av一区二区三区| 亚洲在线观看免费视频| 国产精品日韩在线观看| 麻豆乱码国产一区二区三区| 亚洲国产精品久久久久久女王| 欧美激情在线有限公司| 欧美久久精品午夜青青大伊人| 亚洲国产精品久久久久秋霞蜜臀| 亚洲欧美在线x视频| av成人激情| 久久久久这里只有精品| 久久精品一二三| 欧美日韩一区自拍| 亚洲伦理自拍| 亚洲午夜一区二区| 欧美午夜久久| 中日韩美女免费视频网站在线观看| 一区二区三区欧美| 欧美天天在线| 亚洲一区图片| 欧美中文字幕在线| 国内精品久久久久影院色| 欧美一区二区在线免费播放| 久久激情婷婷| 一区二区三区在线视频观看| 麻豆乱码国产一区二区三区| 免费看黄裸体一级大秀欧美| 亚洲黄色小视频| 欧美日韩大片一区二区三区| 一区二区电影免费在线观看| 欧美亚洲综合另类| 精品动漫一区| 欧美韩日一区| 亚洲午夜未删减在线观看| 久久爱另类一区二区小说| 影音先锋日韩有码| 欧美日韩国产不卡在线看| 亚洲欧美成人| 欧美激情中文字幕乱码免费| 亚洲一区二区三区国产| 国产一区二区三区高清在线观看 | 欧美成人亚洲成人| 亚洲乱码国产乱码精品精98午夜| 亚洲欧美日韩国产中文在线| 韩日精品视频| 欧美日韩国产不卡在线看| 午夜久久影院| 亚洲精品视频一区| 久久久久久**毛片大全| 亚洲美女黄色| 国产一区日韩一区| 欧美区一区二| 久久久久一本一区二区青青蜜月| 一区二区免费在线播放| 美日韩精品免费| 欧美夜福利tv在线| 亚洲日本一区二区| 国产日韩亚洲| 欧美视频精品一区| 免费看的黄色欧美网站| 亚洲欧美三级在线| 亚洲另类黄色| 欧美成人精品1314www| 久久国产日韩欧美| 亚洲一区成人| 99av国产精品欲麻豆| 激情欧美一区二区三区| 亚洲电影成人| 国产一区二三区| 欧美成人精品高清在线播放| 先锋影音国产精品| 亚洲精品欧美激情| 欧美成人一区二区| 久久久爽爽爽美女图片| 亚洲在线免费视频| 一区二区三区精品视频| 亚洲伦伦在线|