nginx php Ubuntu 微软 云计算 Python google centos 程序员 shell 编程 linux wordpress Firefox mysql 开源 java Windows Android apache

Linux程序加载执行过程

 一個進程在內存中主要占用了以下幾個部分,分別是代碼段、數據段、BSS,棧,堆,等參數。其中,代碼、數據、BSS的內容是可執行文件中對應的內容,加載程序並不是把它們的內容從可執行程序中填充到內存中,而是將它們的信息(基地址、長度等)更新到進程控制塊(task_struct)中,當CPU第 一次實際尋址執行的時候,就會引起缺頁中斷,操作系統再將實際的內容從可執行文件中復制內容到物理內存中。
    堆的內容是程序執行中動態分配的,所以加載程序 只是將它的起始地址更新到進程控制塊中,執行過程中遇到動態分配內存的操作的時候再在物理內存分配實際的頁。參數區在新進程加載的時候要存入環境變量和命令行參數列表。棧在程序加載時候存入的內容就是環境參數列表和命令行參數列表的指針和命令行參數的個數。

1)在Shell界面輸入./可執行文件名
    經shell分析,該參數非shell內建命令,則認為是加載可執行文件。於是調用fork函數開始創建新進程,產生0x80中斷,映射到函數sys_fork()中,調用find_empty_process()函數,為新進程申請一個可用的進程號。

2)為可執行程序的管理結構找到存儲空間

   為了實現對進程的保護,系統為每個進程的管理專門設計了一個結構,即task_struct。內核通過調用get_free_page函數獲得用於保存task_struct和內核棧的頁面只能在內核的線性地址空間。

延伸阅读

评论