Linux sys_exec中可执行文件映射的建立及读取(2)

2020-06-01 00:00:00 专区 内存 内容 物理 页面

从上文中可知elf_map时并没有将文件内容读入内存,假设现在程序中有一条指令需要读取上面vm_start---vm_end之间的某内容,例如mov [0x08000011], %eax,那么将会执行如下序列:

    * CPU依据CR3(current->pgd)找到0x08000011地址对应的pgd[ i ],由于该pgd[ i ]内容保持为初始化状态即为0,导致CPU异常;
    * do_page_fault被调用,在该函数中,为pgd[ i]在内存中分配一个页表,并让该表项指向它,如下图所示:

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

      注意:这里i为0x08000011高10位,j为其中间10位,此时pt表项全部为0(pte[j]也为0);
    * 为pte[j]分配一个真正的物理内存页面,依据vm_area_struct中的vm_file、vm_pgoff和vm_ops,调用filemap_nopage将磁盘file中vm_pgoff偏移处的内容读入到该物理页面中,如下图所示:

                          +-------------+    
                          |  Disk file  |    
                          |             |    
                          |-------------|    
                          | Seg Content----+  
                          |-------------|  |  
      pgd                 |             |  |  
      +-----+             |             |  |②
      |-----|    pt       +-------------+  |  
      |  i  |--->+-----+                   |  
      |-----|    |-----|   ①   page       |  
      |     |    |  j  |------->+-----+<---+  
      +-----+    |-----|        |     |
                 |     |        |     |
                 +-----+        |     |
                                +-----+      
      ①.分配物理内存页面;
      ②.从磁盘文件中将内容读取到物理内存页面中;  


文章来源CU社区:Linux sys_exec中可执行文件映射的建立及读取

相关文章