Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2279969
  • 博文数量: 668
  • 博客积分: 10016
  • 博客等级: 上将
  • 技术积分: 8588
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-29 19:22
文章分类

全部博文(668)

文章存档

2011年(1)

2010年(2)

2009年(273)

2008年(392)

分类:

2008-10-13 14:36:10

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. 已在以下的日記介紹過:

步驟 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 裡的相關資訊來完成後續的工作,此部份日後再做整理分享。

來源: 

--jollen

阅读(793) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~