首先我們先寫一個最最簡單的程序,helloworld?no,no,helloworld遠遠比我們自己看到的要複雜的多。
最最簡單的程序應該是這樣的
- /*kong.c 源碼*/
- int main(void)
- {
- }
接下來,靜態編譯,strace跟蹤查看程序的執行情況。
- leon@leon-virtual-machine:~/Desktop/hello$ gcc kong.c -o kong -static//靜態編譯
- leon@leon-virtual-machine:~/Desktop/hello$ strace ./kong //跟蹤執行
- execve("./kong", ["./kong"], [/* 40 vars */]) = 0 //系統調用:運行可執行文件
- uname({sys="Linux", node="leon-virtual-machine", ...}) = 0//系統調用:獲取當前UNIX系統的名稱,版本,主機信息等
- brk(0) = 0x8baf000 //系統調用:改變數據段空間的分配,修改堆的大小
- brk(0x8bafd40) = 0x8bafd40//
- set_thread_area({entry_number:-1 -> 6, base_addr:0x8baf840, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0//在當前進程的LTS中設置一個入口
- brk(0x8bd0d40) = 0x8bd0d40//
- brk(0x8bd1000) = 0x8bd1000//
- exit_group(-1081249620) = ? //退出在一個進程裏的所有線程
如上所示,空程序在執行過程中execve,uname,brk,set_thread_area,exit_group等系統調用
那麼在這些系統調用中,那些是系統本身執行的,那些是程序執行的??
程序源碼本身沒有任何系統調用,但是在靜態編譯中,一些庫被編譯進來,庫在程序執行過程中會不會發生系統調用???
庫在程序運行過程中,是由程序本身調用的,既然空程序中不存在調用庫的代碼,那麼可以理解爲庫在執行過程不會產生系統調用
所以也就是說這些系統調用不是由程序調用產生,都是由系統本身執行的。
通過分析這些系統調用,這些系統調用完成了應用程序運行環境的初始化,程序退出返回的功能。
再來看看另外一個應用程序helloworld的運行過程。
- *hello.c 源碼*/
- #include <stdio.h>
- int main(void)
- {
- printf("hello, FriendlyARM!\n");
- }
- /***********************************************/
- leon@leon-virtual-machine:~/Desktop/hello$ gcc hello.c -o hello -static //靜態編譯
- leon@leon-virtual-machine:~/Desktop/hello$ strace ./hello //跟蹤執行
- execve("./hello", ["./hello"], [/* 40 vars */]) = 0
- uname({sys="Linux", node="leon-virtual-machine", ...}) = 0
- brk(0) = 0x9336000
- brk(0x9336d40) = 0x9336d40
- set_thread_area({entry_number:-1 -> 6, base_addr:0x9336840, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
- brk(0x9357d40) = 0x9357d40
- brk(0x9358000) = 0x9358000
- fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0 //獲取文件屬性
- mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77c3000 //映射文件或設備到內存
- write(1, "hello, FriendlyARM!\n", 20hello, FriendlyARM![/color][color=#ff0000]) = 20 // 寫文件,這裏纔是helloworld程序本身的操作
- exit_group(20) = ?
除了fstat64,mmap2,write三個系統調用外,其他系統調用都和空程序的執行過程完全一樣。
很明顯,這三個系統調用就是程序本身的調用執行過程。