Linux sys_exec中可执行文件映射的建立及读取(2)
从上文中可知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中可执行文件映射的建立及读取
相关文章