linux执行class文件_深入理解linux内核——可执行文件执行过程(2)
接上篇。。
13。調用do_mmap()函數創建一個新線性區來對可執行文件正文段(即代碼)進行映射。這個線性區的起始線性地址依賴于可執行文件的格式,因為程序的可執行代碼通常是不可重定位的。因此,這個函數假定從某一特定邏輯地址的偏移量開始(因此就從某一特定的線性地址開始)裝入正文段。ELF程序被裝入的起始線性地址為0x08048000.
14。調用do_mmap()函數創建一個新線性區來對可執行文件的數據段進行映射。這個線性區的起始線性地址也依賴于可執行文件的格式,因為可執行代碼希望在特定的偏移量(即特定的線性地址)處找到它自己的變量。在ELF程序中,數據段正好被裝在正文段之后。
15。為可執行文件的其他專用段分配另外的線性區,通常是無。
16。調用一個裝入動態鏈接程序的函數。如果動態鏈接程序是ELF可執行的,這個函數叫做load_elf_interp()。一般情況下,這個函數執行第12?14的操作,不過要用動態鏈接程序代替被執行的文件。動態鏈接程序的正文段和數據段在線性區的起始線性地址是由動態鏈接程序本身指定的:但它們處于高地址區(通常高于0x40000000),這是為了避免與被執行文件的正文段和數據段所映射的線性區發生沖突。
17。把可執行格式的linux_binfmt對象的地址存在進程描述符的binfmt字段中。
18。確認進程的新權限。
19。創建特定的動態鏈接程序表并把它們存在在用戶態堆棧,這些表處于命令行參數據和指向環境串的指針數組之間。
20。設置進程的內存描述符的start_code、end_code、start_data、end_data、start_brk、brk及start_stack字段。
21。調用do_brk()函數創建一個新的匿名線性區來映射程序的bss段(當進程寫入一個變量時,就觸發請求調頁,進而分配一個頁框)。這個線性區的大小是在可執行程序被鏈接時就計算出來的。因為程序的可執行代碼通常是不可重新定位的,因此,必須指定這個線性區的起始地址。在ELF程序中,bss段正好裝在數據段之后。
22。調用start_thread()宏修改保存在內核態堆棧但屬于用戶態寄存器的eip和esp的值,以使它們分別指向動態鏈接程序的入口點和新的用戶態堆棧的棧頂。
23。如果進程正被跟蹤,就通知調試程序execve()系統調用已完成。
24。返回0值(成功)。
總結
以上是生活随笔為你收集整理的linux执行class文件_深入理解linux内核——可执行文件执行过程(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电容笔使用方法(如何理解电容)
- 下一篇: windows cmd 窗口 显示信息慢