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

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
123下一頁(yè)
最近訪問(wèn)板塊 發(fā)新帖
查看: 24222 | 回復(fù): 25
打印 上一主題 下一主題

Linux sys_exec中可執(zhí)行文件映射的建立及讀取 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2008-05-06 15:38 |只看該作者 |倒序?yàn)g覽


   1. 創(chuàng)建一個(gè)vm_area_struct;
   2. 圈定一個(gè)虛用戶(hù)空間,將其起始結(jié)束地址(elf段中已設(shè)置好)保存到vm_start和vm_end中;
   3. 將磁盤(pán)file句柄保存在vm_file中;
   4. 將對(duì)應(yīng)段在磁盤(pán)file中的偏移值(elf段中已設(shè)置好)保存在vm_pgoff中;
   5. 將操作該磁盤(pán)file的磁盤(pán)操作函數(shù)保存在vm_ops中;
   6. 注意這里沒(méi)有為對(duì)應(yīng)的頁(yè)目錄表項(xiàng)創(chuàng)建頁(yè)表,更不存在設(shè)置頁(yè)表項(xiàng)了;

                          §                               §
                          §                        +------§->+--------------+
                          §                        |      §  |  Disk file   |
                          §                        |      §  |              |
                          §    +----------------+  |  +---§->|--------------|
                          §    | vm_area_struct |  |  |   §  | Seg Content  |
                          §    |----------------|  |  |   §  |--------------|
      +----------------+<-§-------- vm_start    |  |  |   §  |              |
      | 圈定了一個(gè)未映  |  §  +----- vm_end      |  |  |   §  |              |
      | 射到物理內(nèi)存的  |  §  | |    vm_file--------+  |   §  +--------------+
      | vm_area_struct |  §  | |    vm_pgoff ---------+   §
      +----------------+<-§--+ |    vm_ops --------+      §
                          §    |                |  |      §
                          §    +----------------+  |      §
                          §                        |      §
                          § +----------------------+      §
                          § |                             §
                          § +->+-----------------------+  §
                          §    |   file_private_map    |  §
                          §    |-----------------------|  §
                          §    | nopage:filemap_nopage |  §
                          §    |        .....          |  §
                          §    +-----------------------+  §
            user space    §           kernel              §     disk


[ 本帖最后由 frank_seng 于 2008-5-6 15:45 編輯 ]

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2008-05-06 15:44 |只看該作者

回復(fù) #1 frank_seng 的帖子

從上文中可知elf_map時(shí)并沒(méi)有將文件內(nèi)容讀入內(nèi)存,假設(shè)現(xiàn)在程序中有一條指令需要讀取上面vm_start---vm_end之間的某內(nèi)容,例如mov [0x08000011], %eax,那么將會(huì)執(zhí)行如下序列:

    * CPU依據(jù)CR3(current->pgd)找到0x08000011地址對(duì)應(yīng)的pgd[ i ],由于該pgd[ i ]內(nèi)容保持為初始化狀態(tài)即為0,導(dǎo)致CPU異常;
    * do_page_fault被調(diào)用,在該函數(shù)中,為pgd[ i]在內(nèi)存中分配一個(gè)頁(yè)表,并讓該表項(xiàng)指向它,如下圖所示:

      pgd
      +-----+
      |-----|    pt
      |  i  |--->+-----+
      |-----|    |-----|
      |     |    |  j  |
      +-----+    |-----|
                 |     |
                 +-----+

      注意:這里i為0x08000011高10位,j為其中間10位,此時(shí)pt表項(xiàng)全部為0(pte[j]也為0);
    * 為pte[j]分配一個(gè)真正的物理內(nèi)存頁(yè)面,依據(jù)vm_area_struct中的vm_file、vm_pgoff和vm_ops,調(diào)用filemap_nopage將磁盤(pán)file中vm_pgoff偏移處的內(nèi)容讀入到該物理頁(yè)面中,如下圖所示:

                          +-------------+   
                          |  Disk file  |   
                          |             |   
                          |-------------|   
                          | Seg Content----+  
                          |-------------|  |  
      pgd                 |             |  |  
      +-----+             |             |  |②
      |-----|    pt       +-------------+  |  
      |  i  |--->+-----+                   |  
      |-----|    |-----|   ①   page       |  
      |     |    |  j  |------->+-----+<---+  
      +-----+    |-----|        |     |
                 |     |        |     |
                 +-----+        |     |
                                +-----+      
      ①.分配物理內(nèi)存頁(yè)面;
      ②.從磁盤(pán)文件中將內(nèi)容讀取到物理內(nèi)存頁(yè)面中;

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2008-05-07 03:31 |只看該作者
關(guān)注

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2008-05-07 11:43 |只看該作者
同關(guān)注,怎么就沒(méi)了?
PS:LZ的圖畫(huà)的很好,用什么做的?

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2008-05-07 11:48 |只看該作者

回復(fù) #1 frank_seng 的帖子

說(shuō)的不錯(cuò)啊,關(guān)注!!

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2008-05-07 13:45 |只看該作者

回復(fù) #2 frank_seng 的帖子

父子頁(yè)面保護(hù)共享的處理 ------ COW技術(shù)

在do_fork->copy_mm中,如果vm_area_struct的屬性中包含了可寫(xiě)屬性,但非共享,則將父對(duì)應(yīng)的pte[j](假設(shè)pte[j]對(duì)應(yīng)了vm_area_strruct圈定的范圍中的某個(gè)頁(yè)面)設(shè)置為寫(xiě)保護(hù),隨后復(fù)制父pte[j]給子pte[j];此處采用了COW技術(shù)。

copy_mm之后的的情況如下圖,可見(jiàn)并沒(méi)有真正的復(fù)制一個(gè)page給子進(jìn)程:

    father
    +--------+
    |        |
    |--------|
    |pte(w=0)|--+
    |--------|  |
    |        |  |
    +--------+  +-->+------+
                    |      |
    son         +-->|      |
    +--------+  |   | page |
    |        |  |   |      |
    |--------|  |   |      |
    |pte(w=0)|--+   |      |
    |--------|      +------+
    |        |
    +--------+

現(xiàn)在假設(shè)父進(jìn)程向pte中寫(xiě)入,則會(huì)引發(fā)CPU異常,在異常處理機(jī)制中,處理如下:

    * 創(chuàng)建一個(gè)新的newpage;
    * 復(fù)制page內(nèi)容到newpage;
    * 讓父pte指向newpage,并且設(shè)置父pte的w=1(可寫(xiě));
    * 子pte保持不變;最終如下圖:

    father                  

    +--------+  +-->+------+
    |        |  |   |      |
    |--------|  |   | new  |
    |pte(w=1)|--+   | page |
    |--------|      |      |
    |        |      +------+
    +--------+

    son                     
    +--------+  +-->+------+
    |        |  |   |      |
    |--------|  |   | page |
    |pte(w=0)|--+   |      |
    |--------|      |      |
    |        |      +------+
    +--------+

如果現(xiàn)在子進(jìn)程又向pte中寫(xiě),同樣導(dǎo)致異常,但是由于此時(shí)該pte:count==1,則直接將該pte:w=1,然后寫(xiě)即可;
    son                     
    +--------+  +-->+------+
    |        |  |   |      |
    |--------|  |   | page |
    |pte(w=1)|--+   |      |
    |--------|      |      |
    |        |      +------+
    +--------+


[ 本帖最后由 frank_seng 于 2008-5-7 14:02 編輯 ]

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2008-05-07 14:05 |只看該作者
原帖由 frank_seng 于 2008-5-7 13:45 發(fā)表
父子頁(yè)面保護(hù)共享的處理 ------ COW技術(shù)

在do_fork->copy_mm中,如果vm_area_struct的屬性中包含了可寫(xiě)屬性,但非共享,則將父對(duì)應(yīng)的pte[j](假設(shè)pte[j]對(duì)應(yīng)了vm_area_strruct圈定的范圍中的某個(gè)頁(yè)面)設(shè)置為寫(xiě) ...

這個(gè)地方是什么意思?
COW怎么變成父子都不可寫(xiě)了呢?
我記得此時(shí)應(yīng)該是:父vm_area、pte都是可寫(xiě);子vm_area可寫(xiě),pte不可寫(xiě)。
然后子寫(xiě)的時(shí)候vm_area和pte不一致斷定為COW,重開(kāi)新頁(yè)。

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2008-05-07 14:12 |只看該作者
原帖由 zx_wing 于 2008-5-7 14:05 發(fā)表

這個(gè)地方是什么意思?
COW怎么變成父子都不可寫(xiě)了呢?
我記得此時(shí)應(yīng)該是:父vm_area、pte都是可寫(xiě);子vm_area可寫(xiě),pte不可寫(xiě)。
然后子寫(xiě)的時(shí)候vm_area和pte不一致斷定為COW,重開(kāi)新頁(yè)。


copy_mm->copy_page_range...
if (cow) {
   ptep_set_wrprotect(src_pte);
   pte = *src_pte;
}

可見(jiàn)父子pte都是均不可寫(xiě)!

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2008-05-07 14:48 |只看該作者
原帖由 frank_seng 于 2008-5-7 14:12 發(fā)表


copy_mm->copy_page_range...
if (cow) {
   ptep_set_wrprotect(src_pte);
   pte = *src_pte;
}

可見(jiàn)父子pte都是均不可寫(xiě)!

汗,我還真沒(méi)找到代碼在哪兒,不好意思,內(nèi)存方面實(shí)在不懂,太菜了。
我是2.6.25內(nèi)核,copy_mm如下

  1. static int copy_mm(unsigned long clone_flags, struct task_struct * tsk)
  2. {
  3.         struct mm_struct * mm, *oldmm;
  4.         int retval;

  5.         tsk->min_flt = tsk->maj_flt = 0;
  6.         tsk->nvcsw = tsk->nivcsw = 0;

  7.         tsk->mm = NULL;
  8.         tsk->active_mm = NULL;

  9.         /*
  10.          * Are we cloning a kernel thread?
  11.          *
  12.          * We need to steal a active VM for that..
  13.          */
  14.         oldmm = current->mm;
  15.         if (!oldmm)
  16.                 return 0;

  17.         if (clone_flags & CLONE_VM) {
  18.                 atomic_inc(&oldmm->mm_users);
  19.                 mm = oldmm;
  20.                 goto good_mm;
  21.         }

  22.         retval = -ENOMEM;
  23.         mm = dup_mm(tsk);
  24.         if (!mm)
  25.                 goto fail_nomem;

  26. good_mm:
  27.         /* Initializing for Swap token stuff */
  28.         mm->token_priority = 0;
  29.         mm->last_interval = 0;

  30.         tsk->mm = mm;
  31.         tsk->active_mm = mm;
  32.         return 0;

  33. fail_nomem:
  34.         return retval;
  35. }
復(fù)制代碼

麻煩LZ把代碼的路徑講一下,我好結(jié)合上下文看一下。
如果父子都不可寫(xiě),父寫(xiě)的時(shí)候分配一個(gè)新頁(yè)面給父,那老頁(yè)面是不是就給子了呢?如果子先寫(xiě),分配一個(gè)新頁(yè)面給子,老頁(yè)面是不是就給父了呢?

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2008-05-07 14:57 |只看該作者
原帖由 zx_wing 于 2008-5-7 14:48 發(fā)表

汗,我還真沒(méi)找到代碼在哪兒,不好意思,內(nèi)存方面實(shí)在不懂,太菜了。
我是2.6.25內(nèi)核,copy_mm如下

static int copy_mm(unsigned long clone_flags, struct task_struct * tsk)
{
        struct mm_struct *  ...


真的好對(duì)不起,由于歷史原因,我們的產(chǎn)品依然跑在Linux 2.4上,因此是對(duì)著2.4說(shuō)的,2.6除了網(wǎng)絡(luò)部分外,還從沒(méi)看過(guò),sorry啊!

關(guān)于COW,我寫(xiě)了一些總結(jié)性文檔,貼出來(lái)獻(xiàn)丑了:假設(shè)進(jìn)程A創(chuàng)建了子進(jìn)程B,之后進(jìn)程A和進(jìn)程B共享A的地址空間,同時(shí)該地址空間中的頁(yè)面全部被標(biāo)識(shí)為寫(xiě)保護(hù)。此時(shí)B若寫(xiě)address所在的頁(yè)面,由于寫(xiě)保護(hù)的原因會(huì)引起寫(xiě)異常,在異常處理中,內(nèi)核會(huì)將address所在的那個(gè)寫(xiě)保護(hù)頁(yè)面復(fù)制為一個(gè)新的頁(yè)面,讓B的address頁(yè)表項(xiàng)指向該新頁(yè)面,新頁(yè)面可寫(xiě),而A的address頁(yè)表項(xiàng)依然指向那個(gè)寫(xiě)保護(hù)的頁(yè)面。此后當(dāng)B再訪問(wèn)address是就會(huì)直接訪問(wèn)該新的頁(yè)面了,不再會(huì)訪問(wèn)到那個(gè)寫(xiě)保護(hù)的頁(yè)面。當(dāng)A試圖寫(xiě)address所在的頁(yè)面時(shí),由于寫(xiě)保護(hù)的原因此時(shí)也會(huì)引起異常,在異常處理中,內(nèi)核如果發(fā)現(xiàn)該頁(yè)面只有一個(gè)擁有進(jìn)程,此種情況下也就是A,則直接對(duì)該頁(yè)面取消寫(xiě)保護(hù),此后當(dāng)A再訪問(wèn)address是不會(huì)再有寫(xiě)保護(hù)錯(cuò)誤了。如果此時(shí)A又創(chuàng)建了子進(jìn)程C,則該address所在的頁(yè)面又被設(shè)置為寫(xiě)保護(hù),擁有進(jìn)程為A和C,同時(shí)其他的頁(yè)面例如PAGEX依然維持寫(xiě)保護(hù),只是擁有進(jìn)程為A、B和C。如果此時(shí)A訪問(wèn)PAGEX,則異常處理會(huì)創(chuàng)建一個(gè)新頁(yè)面并將PAGEX中的內(nèi)容復(fù)制到該頁(yè)面,同時(shí)將A相應(yīng)的pte指向該新頁(yè)面。如果此時(shí)C也訪問(wèn)PAGEX,也會(huì)復(fù)制新頁(yè)面并且讓C對(duì)應(yīng)的pte指向新頁(yè)面。如果B再訪問(wèn)PAGEX,則由于此時(shí)PAGEX只有一個(gè)擁有進(jìn)程B,故不再?gòu)?fù)制新頁(yè)面,而是直接取消該頁(yè)面的寫(xiě)保護(hù),由于B的pte本來(lái)就直接指向該頁(yè)面,所以無(wú)需再做其他工作了。這也就是COW的實(shí)現(xiàn)機(jī)制。

[ 本帖最后由 frank_seng 于 2008-5-7 14:59 編輯 ]
您需要登錄后才可以回帖 登錄 | 注冊(cè)

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP