免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 593 | 回复: 0
打印 上一主题 下一主题

ELF 之 Program Loading 教學文件, #4: Program Loader 整體流 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-10 11:09 |只看该作者 |倒序浏览
ELF 之 Program Loading 教學文件, #4: Program Loader 整體流程
                     
                     
jollen
發表於 March 13, 2007  2:26 PM
                     
                     
                     
                        
                                                      
                              
Program loader 的整體流程如下:
1. 使用者在 shell 模式下執行外部程式(stored program)。
2. shell 以 fork+exec system call 的方式執行外部程式。
3. 透過 0x80H 軟體中斷(x86)叫用 kernel 的 exec(sys_execvp)system call service。
       
                Kernel Space Program Loader
4. Exec system call 呼叫 program loader(ELF loader),將 process image(ELF
image)載入。
5. Program loader 找到 PT_INTERP segment。
6. Program loader 將 PT_LOAD  segment mapping 為新的 text/data segment,text
segment 由 vaddr. 0x0804_8000 開始,data segment 緊接其後。
7. Program loader 呼叫 interpreter loader 將 program interpreter(ld.so)載入,並
mapping 到 process memory;interpreter 的 text segment 由 vaddr. 0x4000_0000
開始,interpreter 的 data segment 緊接其後。
8. Program loader 將 BSS segment 準備好。
9. Program loader 將 process 的 register %eip(user-mode)修改為 program
interpreter 的進入點;並將 %sp 設定為 user mode 的 stack。
               
       
10. 所以任何 shared library 的外部程式,一開始都是由 program interpreter 開始執行!
       
                User Space Program Loader / Linker
11. Program interpreter 會找到 process 所需的 shared library(名稱及其路徑)。
12. Program interpreter 使用 mmap system call 將 shared library mapping 到
process memory,以完成整個 process image 的建立。
13. 更新 shared library 的符號表。
14. Program interpreter 'jump' 到 process 的進入點(紀錄在 ELF header 裡的 entry point)。
               
       
15. 真正開始執行程式!
步驟 1.~6. 已在以下的日記介紹過:
  • 2007.03.08:
           
            Process Creation, #6:Exec System Call 的觀念
  • 2007.03.05:
           
            ELF 之 Program Loading 教學文件, #1: Segment 的觀念
  • 2007.03.08:
           
            ELF 之 Program Loading 教學文件, #2: Program Header Table
  • 2007.03.09:
           
            ELF 之 Program Loading 教學文件, #3: Segment Type 與 Kernel Space Loader

步驟 7.~15. 將會在後續的日記再做整理。以整體的 program loader 流程來說,可分為 kernel-space 與 user-space
二大階段:
  • 步驟 4.~9. 由 kernel 的 ELF loader 所負責。
  • 步驟 11.~14 由 user-space 的 program interpreter(dynamic loader/linker,也就是
            /lib/ld-linux.so.2)所負責。

Program interpreter 需要 dynamic segment 裡的相關資訊來完成後續的工作,此部份日後再做整理分享。
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/14644/showart_1896093.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP