国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

程序人生(CSAPP大作業(yè))

這篇具有很好參考價值的文章主要介紹了程序人生(CSAPP大作業(yè))。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

摘? 要

本文介紹了 Hello 程序的生命周期。本文通過對Hello在Linux下的預(yù)處理、編譯、匯編、鏈接等進(jìn)程的分析,詳細(xì)講解了一個程序從誕生到執(zhí)行再到消亡的典型過程。雖然程序執(zhí)行的過程在程序員眼中只是屏幕上顯示的一根字符串,但在短短的幾毫秒內(nèi),程序經(jīng)歷了預(yù)處理、編譯、匯編、鏈接、進(jìn)程管理、IO管理、內(nèi)存分配和回收等一系列復(fù)雜的過程。同時,這本書的知識也在這篇文章中進(jìn)行了梳理,整本書的內(nèi)容與Hello的生活相協(xié)調(diào)?;仡櫮谟嬎銠C系統(tǒng)中學(xué)到的知識,加深您的印象,并提高您對程序過程和計算機內(nèi)部結(jié)構(gòu)的理解。

第1章 概述

1.1 Hello簡介

P2P:

?? ?P2P指的是程序由一個項目變成一個進(jìn)程的過程.

  1. Program:Hello程序的誕生是程序員通過鍵盤輸入得到hello.c

2.Process:C語言源程序hello.c在預(yù)處理器(cpp)處理下,得到hello.i,通過編譯器(ccl),得到匯編程序hello.s,再通過匯編器(as),得到可重定位的目標(biāo)程序hello.o,最后通過鏈接器(ld)得到可執(zhí)行的目標(biāo)程序hello。在shell中鍵入運行命令后,shell調(diào)用fork函數(shù)為其創(chuàng)建子進(jìn)程。

020:

020為程序“從無到有再到無”的過程。程序經(jīng)過系統(tǒng)OS,shell為hello進(jìn)程execve,映射虛擬內(nèi)存,進(jìn)入程序入口后程序開始載入物理內(nèi)存。進(jìn)入 main 函數(shù)執(zhí)行目標(biāo)代碼,CPU為執(zhí)行文件hello分配時間周期,執(zhí)行邏輯控制流,每條指令在流水線上取值、譯碼、執(zhí)行、訪存、寫回、更新PC。當(dāng)程序運行結(jié)束后, shell 父進(jìn)程負(fù)責(zé)回收 hello 進(jìn)程,內(nèi)核刪除相關(guān)數(shù)據(jù)結(jié)構(gòu)。Hello程序從無到有再到無的這一過程就是020。

1.2 環(huán)境與工具

硬件環(huán)境:X64 CPU;2GHz;2G RAM;256GHD Disk

軟件環(huán)境:Windows10 64位;VirtualBox/Vmware 15以上;Ubuntu 16.04;

開發(fā)工具:CodeBlocks 64位;vi/vim/gedit+gcc

1.3 中間結(jié)果

hello.c :hello程序的C語言代碼

hello.i :hello.c經(jīng)過預(yù)處理后產(chǎn)生的文本文件

hello.s :hello.i經(jīng)過編譯產(chǎn)生的匯編文件

hello.ld :鏈接后產(chǎn)生的編譯文件

hello.o :可重定位的目標(biāo)文件

hello :可執(zhí)行文件

helloo.objdump :hello.o反匯編文件

hello.objdump :hello的反匯編文件

1.4 本章小結(jié)

本部分對hello從誕生到執(zhí)行到消亡的P2P和020過程進(jìn)行了簡介,并介紹了整個過程中所使用的環(huán)境工具及生成的中間結(jié)果。

第2章 預(yù)處理

2.1 預(yù)處理的概念與作用

預(yù)處理的概念:預(yù)處理是C語言的一個重要功能,由預(yù)處理器完成,預(yù)處理器將源文件.c預(yù)處理為.i文件,主要處理#開始的預(yù)編譯指令

預(yù)處理的作用:合理利用預(yù)處理功能編寫程序,便于讀取、修改、調(diào)試,有利于模塊化設(shè)計。

2.2在Ubuntu下預(yù)處理的命令

預(yù)處理指令:gcc -E hello.c -o hello.i

程序人生(CSAPP大作業(yè))

程序人生(CSAPP大作業(yè))?

2.3 Hello的預(yù)處理結(jié)果解析

由圖可知,經(jīng)過預(yù)處理后,hello.c的23行代碼被擴展為3084行,其中main函數(shù)占第3071~3084行,main函數(shù)前為hello.c引用的stdio.h等頭文件的內(nèi)容。同時,注釋內(nèi)容被去除。

2.4 本章小結(jié)

本章主要介紹預(yù)處理的概念和功能,包括預(yù)處理的宏定義、文件包含、條件編譯等,并對hello.c預(yù)處理獲得的hello.i文件進(jìn)行比較和分析。

第3章 編譯

3.1 編譯的概念與作用

概念:編譯器(ccl)將預(yù)處理生成的文件hello.i編譯成匯編文件文件hello.s。?

作用:將高級語言編譯為相應(yīng)的機器語言,這里將C語言轉(zhuǎn)化為intel x86匯編指令。

3.2 在Ubuntu下編譯的命令

指令:gcc -S hello.i -o hello.s

程序人生(CSAPP大作業(yè))

3.3 Hello的編譯結(jié)果解析

程序人生(CSAPP大作業(yè))

3.3.1數(shù)據(jù)

1.字符串

1"\347\224\250\346\263\225: Hello \345\255\246\345\217\267 \345\247\223\345\220\215 \347\247\222\346\225\260\357\274\201"對應(yīng).c文件中"用法: Hello 學(xué)號 姓名 秒數(shù)!\n",其中中文已被編碼為UTF-8 格式 一個漢字占3個字節(jié)

2 “Hello %s %s\n” 對應(yīng)原c文件中"Hello %s %s\n"第二個printf中的格式化參數(shù),其中后兩個字符串已在.rodata中聲明

2.整數(shù)

1int i(局部變量)

程序人生(CSAPP大作業(yè))

根據(jù)movl $0, -4(%rbp) 可以看出編譯器將i存到了-4(%rbp) 中,且占4個字節(jié)。與addl $1, -4(%rbp)cmpl $7, -4(%rbp)實現(xiàn)循環(huán)結(jié)構(gòu)for(i=0;i<8;i++)。

2int argc

作為第一個參數(shù)被壓棧pushq %rbp,傳入main函數(shù)

3)立即數(shù)

程序中其他整型都是以立即數(shù)的形式出現(xiàn)

4)數(shù)組 char *argv[ ]

程序人生(CSAPP大作業(yè))

這是一個指針數(shù)組,由addq $, %rax可以看出,一個內(nèi)容占8個字節(jié),說明linux中一個地址的大小是8個字節(jié)。

3.3.2賦值

1 i=0

movl $0, -4(%rbp) ?通過movl指令將0賦給了i

3.3.3算術(shù)操作

1i++ ??addl $1, -4(%rbp)

3.3.4 關(guān)系判斷

1argc!=4

程序人生(CSAPP大作業(yè))

2i<8

程序人生(CSAPP大作業(yè))

3.3.5控制轉(zhuǎn)移

1if(argc!=4)

程序人生(CSAPP大作業(yè))

2for(i=0;i<8;i++)

程序人生(CSAPP大作業(yè))

3.3.6數(shù)組操作

argv[1],argv[2]

程序人生(CSAPP大作業(yè))

3.3.7函數(shù)調(diào)用

函數(shù)的調(diào)用需要有以下過程:傳遞控制、數(shù)據(jù)傳遞、分配空間

1main函數(shù)

main 函數(shù)由系統(tǒng)啟動的函數(shù)__libc_start_main調(diào)用,call 指令將 main 函數(shù)的地址分配給 %rip,后跟 main 函數(shù)。主函數(shù) argc *argv[](第一個地址)的兩個參數(shù)分別存儲在 %rdi %rsi 中。通常,該函數(shù)將返回 0 作為出口,并將 %eax 設(shè)置為 0。

2printf函數(shù)

程序人生(CSAPP大作業(yè))程序人生(CSAPP大作業(yè))

當(dāng)?shù)谝淮握{(diào)用 printf 時,字符串是固定的,只有一個參數(shù),因此調(diào)用put@PLT。第二個調(diào)用具有三個參數(shù),調(diào)用printf@PLT

3.4 本章小結(jié)

本章總結(jié)并分析編譯器如何處理C語言的各種數(shù)據(jù)類型和運算,如變量處理、賦值、算術(shù)運算、關(guān)系判斷和函數(shù)調(diào)用等。

第4章 匯編

4.1 匯編的概念與作用

概念:驅(qū)動程序運行匯編程序 as,將匯編語言 hello.s 轉(zhuǎn)換為機器語言 hello.o 的過程稱為匯編,它是一個包含程序指令代碼的二進(jìn)制文件。

作用:將高級語言翻譯成機器可以直接識別和執(zhí)行的二進(jìn)制機器代碼。此二進(jìn)制機器代碼是此機器上程序的機器語言的表示形式。

4.2 在Ubuntu下匯編的命令

程序人生(CSAPP大作業(yè))

4.3 可重定位目標(biāo)elf格式

程序人生(CSAPP大作業(yè))

ELF頭:包含信息為文件結(jié)構(gòu)的說明信息:16字節(jié)的標(biāo)識信息,文件類型,機器類型,節(jié)頭表偏移,節(jié)頭表的表項大小,表項個數(shù),生成該文件的系統(tǒng)字大小和字節(jié)順序

節(jié)頭部表:

程序人生(CSAPP大作業(yè))

節(jié)頭表描述了不同節(jié)的位置和大小,目標(biāo)文件中的1節(jié)對每個節(jié)都有一個固定大小的條目,相關(guān)信息包括節(jié)的名稱、類型、地址、偏移量、對齊方式、標(biāo)志標(biāo)記等。

由輸出可知,Hello程序共有14個節(jié)。

重定位節(jié):

程序人生(CSAPP大作業(yè))

重定位用于在匯編程序生成目標(biāo)模塊時為最終位置未知的目標(biāo)參照生成重定位條目。鏈接器在鏈接生成可執(zhí)行文件時相應(yīng)地修改此引用。

Rela.text和.rela.eh_frame中包含.text節(jié)中需要進(jìn)行重定位的信息,在鏈接時需要修改這些信息的位置。

該程序重定位有R_X86_64_PC32,R_X86_64_PLT32兩種基本類型,分別用于重定位使用32bitPC相對地址、絕對地址的引用

4.4 Hello.o的結(jié)果解析

程序人生(CSAPP大作業(yè))

程序人生(CSAPP大作業(yè))?

運行 objdump -d -r hello.o 獲取 hello.o 的反匯編代碼。由于反匯編代碼是由機器語言翻譯形成的,因此在跳轉(zhuǎn)時,地址通常表示為相對地址。同時,操作數(shù)通常以十六進(jìn)制表示。

4.5 本章小結(jié)

本章介紹Hello程序匯編過程,并展示ELF格式,最后分析匯編代碼和反匯編代碼,比較兩者之間的差異,了解兩種不同的程序表示形式和組裝和反匯編的原因,揭示從匯編語言到機器語言的過渡過程。

第5章 鏈接

5.1 鏈接的概念與作用

概念:鏈接是將各種代碼和數(shù)據(jù)收集并組合到單個文件中的過程,鏈接執(zhí)行符號解析和重新定位的過程。

它的作用:將可重定位的目標(biāo)文件和命令行參數(shù)作為輸入,以生成正常工作的可執(zhí)行文件。這樣就可以分離編譯和保存工作區(qū)。

5.2 在Ubuntu下鏈接的命令

命令:ld -o hello -dynamic-linker /lib64/ld-linux-x86-64.so.2 /usr/lib/x86_64-linux-gnu/crt1.o /usr/lib/x86_64-linux-gnu/crti.o hello.o/usr/lib/x86_64-linux-gnu/libc.so/usr/lib/x86_64-linux-gnu//crtn.o

程序人生(CSAPP大作業(yè))

5.3 可執(zhí)行目標(biāo)文件hello的格式

分析hello的ELF格式,用readelf等列出其各段的基本信息,包括各段的起始地址,大小等信息。

Hello的ELF頭:

程序人生(CSAPP大作業(yè))

與hello.o的ELF頭相比,有以下幾處不同:

1. 文件類型從可重定位更改為可執(zhí)行

2. 程序的入口點、程序開始點、節(jié)頭表偏移發(fā)生改變

3. 共有27個節(jié)頭表,增加了10個。

節(jié)頭部表

程序人生(CSAPP大作業(yè))

程序頭:

程序人生(CSAPP大作業(yè))?

段節(jié):

程序人生(CSAPP大作業(yè))

目錄

第1章 概述

1.1 Hello簡介

1.2 環(huán)境與工具

硬件環(huán)境:X64 CPU;2GHz;2G RAM;256GHD Disk

1.3 中間結(jié)果

1.4 本章小結(jié)

第2章 預(yù)處理

2.1 預(yù)處理的概念與作用

2.2在Ubuntu下預(yù)處理的命令

2.3 Hello的預(yù)處理結(jié)果解析

2.4 本章小結(jié)

第3章 編譯

3.1 編譯的概念與作用

3.2 在Ubuntu下編譯的命令

3.3 Hello的編譯結(jié)果解析

3.4 本章小結(jié)

第4章 匯編

4.1 匯編的概念與作用

4.2 在Ubuntu下匯編的命令

4.3 可重定位目標(biāo)elf格式

4.4 Hello.o的結(jié)果解析

?編輯

4.5 本章小結(jié)

第5章 鏈接

5.1 鏈接的概念與作用

概念:鏈接是將各種代碼和數(shù)據(jù)收集并組合到單個文件中的過程,鏈接執(zhí)行符號解析和重新定位的過程。

5.2 在Ubuntu下鏈接的命令

命令:ld -o hello -dynamic-linker /lib64/ld-linux-x86-64.so.2 /usr/lib/x86_64-linux-gnu/crt1.o /usr/lib/x86_64-linux-gnu/crti.o hello.o/usr/lib/x86_64-linux-gnu/libc.so/usr/lib/x86_64-linux-gnu//crtn.o

5.3 可執(zhí)行目標(biāo)文件hello的格式

5.5 鏈接的重定位過程分析

5.7 Hello的動態(tài)鏈接分析

5.8 本章小結(jié)

第6章 hello進(jìn)程管理

6.1 進(jìn)程的概念與作用

概念:進(jìn)程是操作系統(tǒng)對正在運行的程序的抽象。

6.2 簡述殼Shell-bash的作用與處理流程

shell 的作用:提供一個接口,用戶可以通過該接口訪問操作系統(tǒng)內(nèi)核的服務(wù)。

6.3 Hello的fork進(jìn)程創(chuàng)建過程

執(zhí)行 hello 后,bash 解析此命令,發(fā)現(xiàn) ./hello 不是 bash 內(nèi)置命令,因此它會嘗試在當(dāng)前目錄中查找并執(zhí)行 hello 文件。此時,bash 調(diào)用 fork 函數(shù)來創(chuàng)建一個子進(jìn)程,該子進(jìn)程類似于父進(jìn)程,并獲取父進(jìn)程的用戶級虛擬空間的相同且獨立副本的副本 - 包括數(shù)據(jù)段、代碼、共享庫、堆和用戶堆棧。二者間的PID不相同,fork函數(shù)會返回兩次,在父進(jìn)程中,返回子進(jìn)程的PID,在子進(jìn)程中,返回0。

6.4 Hello的execve過程

execve函數(shù)的原型為:

6.5 Hello的進(jìn)程執(zhí)行

時間片:指進(jìn)程執(zhí)行部分控制流的每個時間段,多任務(wù)處理也稱為時間分片。

6.6 hello的異常與信號處理

6.7本章小結(jié)

結(jié)論

Hello程序的一生:

附件

參考文獻(xiàn)


?文章來源地址http://www.zghlxwxcb.cn/news/detail-423055.html

重定位節(jié)

程序人生(CSAPP大作業(yè))?

5.4 hello的虛擬地址空間

程序人生(CSAPP大作業(yè))?

使用 edb 加載 hello 以獲取進(jìn)程的虛擬地址空間的每個段的信息。它對應(yīng)于反匯編代碼中的虛擬地址。

Hello 頭表在程序執(zhí)行期間用于告訴鏈接器在運行時應(yīng)加載的內(nèi)容,并提供動態(tài)鏈接信息,提供有關(guān)虛擬和物理地址空間中每個段的大小、位置、標(biāo)志、訪問權(quán)限和對齊方式的信息。

5.5 鏈接的重定位過程分析

程序人生(CSAPP大作業(yè))

運行objdump -d -r hello,得到上圖所示反匯編代碼

鏈接包括以下4個過程:

重定位的步驟:

1.合并相同的部分:鏈接器首先將同一類型的所有部分合并到相同類型的新部分,例如,所有文件的 .data 部分合并到一個新的 .data 部分,合并完成后,新部分是可執(zhí)行文件 hello 的 .data 部分。2.確定地址:然后,鏈接器將內(nèi)存地址分配給新的聚合部分以及輸入模塊定義的部分和符號。確定地址后,全局變量、指令等都具有唯一的運行時地址

  1. 判斷輸入文件是否為庫文件,如果不是則是目標(biāo)文件f,目標(biāo)文件放入集合E中。
  2. 鏈接器解析目標(biāo)文件中的符號,如果它們出現(xiàn),則將它們放在集合 U 中,如果它們看起來已定義但未使用,則將它們設(shè)置為集合 D 中
  3. 鏈接器讀入crt*庫1中的目標(biāo)文件
  4. 接入動態(tài)鏈接庫libc.so

?5.6 hello的執(zhí)行流程

程序人生(CSAPP大作業(yè))

使用edb執(zhí)行hello,如左圖所示,加載hello到_start,到call main,以及程序終止的過程如右圖所示

5.7 Hello的動態(tài)鏈接分析

程序人生(CSAPP大作業(yè))

? ? ? ? ? ? ? ? ? ? ? ? ? ??init前的Data Dump

程序人生(CSAPP大作業(yè))

? ? ? ? ? ? ? ? ? ? ? ? ? ?init后的Data Dump?

在 edb 中查找0x403ff0地址,并在_init之前和之后設(shè)置斷點,如圖所示。在dl_init前后,0x403ff0 處和0x404000 處的8bit數(shù)據(jù)分別由000000000000變?yōu)榱薱05fb1b3fe7e和90b1d2b3fe7e,GOT[1]指向重定位表,作用是確定調(diào)用函數(shù)的地址,GOT[2]指向動態(tài)鏈接器ld-linux.so運行時地址。

5.8 本章小結(jié)

本章檢查并介紹了 Linux 系統(tǒng)下鏈接的進(jìn)程。鏈接是將程序轉(zhuǎn)換為可執(zhí)行文件的最后一步。通過鏈接,代碼片段和數(shù)據(jù)片段被整合。本章通過查看 hello 在 edb 或終端上的虛擬地址空間,比較 hello.o 和 hello 的反匯編代碼等,來分析和總結(jié)重定位、執(zhí)行和動態(tài)鏈接過程。

第6章 hello進(jìn)程管理

6.1 進(jìn)程的概念與作用

概念:進(jìn)程是操作系統(tǒng)對正在運行的程序的抽象。

作用:流程為應(yīng)用程序提供關(guān)鍵抽象;一個獨立的邏輯控制流,就好像一個程序擁有處理器一樣;和一個專用地址空間,就好像程序壟斷了一個內(nèi)存系統(tǒng)

6.2 簡述殼Shell-bash的作用與處理流程

shell 的作用:提供一個接口,用戶可以通過該接口訪問操作系統(tǒng)內(nèi)核的服務(wù)。

處理流程:

1. 從終端讀入輸入的命令, 將輸入字符串切分獲得所有的參數(shù)。如果是內(nèi)置命令則立即執(zhí)行,否則調(diào)用相應(yīng)的程序為其分配子進(jìn)程并運行。

6.3 Hello的fork進(jìn)程創(chuàng)建過程

執(zhí)行 hello 后,bash 解析此命令,發(fā)現(xiàn) ./hello 不是 bash 內(nèi)置命令,因此它會嘗試在當(dāng)前目錄中查找并執(zhí)行 hello 文件。此時,bash 調(diào)用 fork 函數(shù)來創(chuàng)建一個子進(jìn)程,該子進(jìn)程類似于父進(jìn)程,并獲取父進(jìn)程的用戶級虛擬空間的相同且獨立副本的副本 - 包括數(shù)據(jù)段、代碼、共享庫、堆和用戶堆棧。二者間的PID不相同,fork函數(shù)會返回兩次,在父進(jìn)程中,返回子進(jìn)程的PID,在子進(jìn)程中,返回0。

6.4 Hello的execve過程

execve函數(shù)的原型為:

???????? int execve(const char *filename,const charargv[],const char envp[])

?execve() 用于執(zhí)行由參數(shù) fixtureme 字符串表示的文件路徑,第二個參數(shù)使用指針數(shù)組傳遞給執(zhí)行文件,并且需要以空指針結(jié)尾。最后一個參數(shù)是傳遞給可執(zhí)行文件的新環(huán)境變量數(shù)組,其中每個指針都指向一個環(huán)境變量字符串,每個字符串都是名稱的名稱-值對,例如 name=value。當(dāng) exeve 加載文件名時,它會調(diào)用啟動代碼(用于設(shè)置堆棧),并將控制權(quán)傳遞給新程序 main 的 main 函數(shù) main。當(dāng)找不到夾具等錯誤時,execve 將返回調(diào)用程序,這與返回兩次的 fork 調(diào)用不同,execve 調(diào)用一次,永不返回。

execve開始執(zhí)行hello:

刪除已存在的用戶區(qū)域。刪除當(dāng)前進(jìn)程虛擬地址的“用戶”部分中的現(xiàn)有區(qū)域結(jié)構(gòu)。也就是說,刪除在 shell 運行時之前已存在的區(qū)域結(jié)構(gòu)。

映射專用區(qū)域。為 hello 的代碼、數(shù)據(jù)、bss 和堆棧區(qū)域創(chuàng)建新的區(qū)域結(jié)構(gòu)。所有這些新區(qū)域都是專用的、寫入時復(fù)制的。代碼和數(shù)據(jù)區(qū)域映射到 hello 文件中的 .text 和 .data 區(qū)域。請求 bss 區(qū)域二進(jìn)制零,映射到一個匿名文件,其大小包含在 hello 中。堆棧和堆區(qū)域也針對初始長度為零的二進(jìn)制零請求。

映射共享區(qū)域。Hello程序鏈接到共享對象,例如標(biāo)準(zhǔn)C庫 1ibc.so,然后將這些對象動態(tài)鏈接到程序,然后映射到用戶虛擬地址空間中的共享區(qū)域。

設(shè)置程序計數(shù)器 (PC)。最后,execve 將當(dāng)前進(jìn)程上下文中的程序計數(shù)器設(shè)置為指向代碼區(qū)域的人口點

6.5 Hello的進(jìn)程執(zhí)行

時間片:指進(jìn)程執(zhí)行部分控制流的每個時間段,多任務(wù)處理也稱為時間分片。

用戶模式和內(nèi)核模式:處理器通過使用控制寄存器的模式位實現(xiàn)限制應(yīng)用程序可以執(zhí)行的指令數(shù)和可以訪問的地址空間范圍的功能。此寄存器描述進(jìn)程當(dāng)前享有的權(quán)限,當(dāng)設(shè)置了模式位時,進(jìn)程在內(nèi)核模式下運行,在內(nèi)核模式下運行的進(jìn)程可以執(zhí)行指令集的任何指令,并且可以訪問系統(tǒng)中的任何內(nèi)存位置。

當(dāng)模式位未設(shè)置時,進(jìn)程在用戶模式下運行,并且不允許用戶模式下的進(jìn)程執(zhí)行特權(quán)指令,例如停止處理器,更改模式位,并且不允許進(jìn)程直接引用地址空間中內(nèi)核區(qū)域中的代碼片段和數(shù)據(jù),此時用戶程序必須通過系統(tǒng)調(diào)用接口間接訪問內(nèi)核代碼和數(shù)據(jù)。

控制流:從上電時間到斷點位置計算的PC值序列,程序計數(shù)器稱為控制流。

邏輯控制流:使用調(diào)試器單步執(zhí)行程序時,您會看到一系列程序計數(shù)器 (PC) 值,這些值與程序的可執(zhí)行對象文件中包含的指令唯一對應(yīng),或者包含在運行時動態(tài)鏈接到程序的共享對象中。此 PC 值序列稱為邏輯控制流,或簡稱為邏輯流。也就是說,邏輯控制流是進(jìn)程中的一系列 PC 值。

上下文:上下文是內(nèi)核重新啟動搶占進(jìn)程所需的狀態(tài),它由對象的值組成,例如通用寄存器,浮點寄存器,程序計數(shù)器,用戶堆棧,狀態(tài)寄存器,內(nèi)核堆棧和各種內(nèi)核數(shù)據(jù)結(jié)構(gòu)。

?Hello的調(diào)度過程:

?程序人生(CSAPP大作業(yè))

sleep 調(diào)度:當(dāng)程序運行到 sleep 函數(shù)時,sleep 顯式請求 hello 進(jìn)程 sleep。等到睡眠時間 sleepsec(此處為 2 秒,而不是 2.5 秒)到達(dá)。從另一個進(jìn)程切換到 hello 以繼續(xù)執(zhí)行。

正常調(diào)度:當(dāng) hello 運行一段時間后,雖然 hello 此時不請求暫停,但系統(tǒng)會切換到其他進(jìn)程,在其他進(jìn)程的執(zhí)行結(jié)束后,hello 會再次調(diào)度并繼續(xù)使用最后一個 PC 地址開始執(zhí)行。調(diào)度的過程類似于休眠調(diào)度的過程。

6.6 hello的異常與信號處理

?正常運行:

程序人生(CSAPP大作業(yè))

程序完成被正常回收。

2)輸入ctrl+z

程序人生(CSAPP大作業(yè))

這時輸入命令PS查看進(jìn)程,

程序人生(CSAPP大作業(yè))

使用jobs指令查看,得到以下結(jié)果,故可知,此時,hello進(jìn)程沒有結(jié)束,而是被暫時掛起,PID為45856。

程序人生(CSAPP大作業(yè))?

3)輸入ctrl+c

程序人生(CSAPP大作業(yè))?

輸入jobs

程序人生(CSAPP大作業(yè))?

?

輸出為空,可以判斷進(jìn)程直接被終止,被回收.

4)輸入kill

程序人生(CSAPP大作業(yè))

輸入ps,

程序人生(CSAPP大作業(yè))?

當(dāng)輸入kill后進(jìn)程被殺死,此時再輸入ps指令后發(fā)現(xiàn)當(dāng)前無進(jìn)程執(zhí)行。

6.7本章小結(jié)

本章結(jié)合原理圖介紹了流程的概念和功能,簡要介紹了shell shell-bash的作用和處理,介紹了hello的分叉爆破創(chuàng)建過程和execve過程,并結(jié)合ps和job命令的輸出,介紹了hello的流程執(zhí)行以及異常和信號處理過程。

結(jié)論

Hello程序的一生:

  1. 預(yù)處理:gcc在hello .c中執(zhí)行預(yù)處理命令,合并庫,擴展宏
  2. 編譯,將 hello.i 編譯為程序集文件 hello.s
  3. 組裝,將 hello.s 轉(zhuǎn)換為可重定位的目標(biāo)文件 hello.o
  4. 鏈接,將hello.o與可重定位的目標(biāo)文件和動態(tài)鏈接庫鏈接,成為可執(zhí)行的目標(biāo)程序hello
  5. 運行:在 shell 中輸入 ./hello1170801219 楊金即可開始運行程序
  6. 創(chuàng)建子進(jìn)程:shell 進(jìn)程調(diào)用 fork 為其創(chuàng)建子進(jìn)程,并分配 pid。
  7. 運行程序:子進(jìn)程shell調(diào)用execve,execve調(diào)用啟動加載程序,添加虛擬內(nèi)存,進(jìn)入程序入口,程序開始加載物理內(nèi)存,然后進(jìn)入main函數(shù)。
  8. 執(zhí)行指令:CPU為其分配一個時間片,在一個時間片中,hello享受CPU資源,并依次執(zhí)行自己的控制邏輯流
  9. 訪問內(nèi)存:MMU 通過頁表將程序中使用的虛擬內(nèi)存地址映射到物理地址。
  10. 動態(tài)請求內(nèi)存:調(diào)用 malloc 以請求從堆到動態(tài)內(nèi)存分配器的內(nèi)存。
  11. 信號:在運行期間鍵入 ctr-ctr-z,分別調(diào)用 shell 的信號處理功能停止和掛起。
  12. 結(jié)束:shell 父進(jìn)程回收子進(jìn)程,內(nèi)核刪除為此進(jìn)程創(chuàng)建的所有數(shù)據(jù)結(jié)構(gòu)。

附件

hello.c: hello的C語言源程序

hello.i: ASCII碼的中間文件(預(yù)處理器產(chǎn)生),用于分析預(yù)處理過程。

hello.s:用于分析已編譯進(jìn)程的 ASCII 匯編語言文件。

hello.o:可重定位的目標(biāo)程序(匯編程序生成),用于分析裝配過程。

hello:用于分析鏈接過程的可執(zhí)行目標(biāo)文件(由鏈接器生成)。

hello_o.txt:hello.o 的 objdump 反匯編文件,用于解析可重定位的目標(biāo)文件 hello.o。

hello.txt: Hello 的 objdump 反匯編文件,用于解析可執(zhí)行目標(biāo) hello.

參考文獻(xiàn)

?[1]? 林來興. 空間控制技術(shù)[M]. 北京:中國宇航出版社,1992:25-42.

[2]? 辛希孟. 信息技術(shù)與信息服務(wù)國際研討會論文集:A集[C]. 北京:中國科學(xué)出版社,1999.

[3]? 趙耀東. 新時代的工業(yè)工程師[M/OL]. 臺北:天下文化出版社,1998 [1998-09-26]. http://www.ie.nthu.edu.tw/info/ie.newie.htm(Big5).

[4]? 諶穎. 空間交會控制理論與方法研究[D]. 哈爾濱:哈爾濱工業(yè)大學(xué),1992:8-13.

[5]? KANAMORI H. Shaking Without Quaking[J]. Science,1998,279(5359):2063-2064.

[6]? CHRISTINE M. Plant Physiology: Plant Biology in the Genome Era[J/OL]. Science,1998,281:331-332[1998-09-23]. http://www.sciencemag.org/cgi/ collection/anatmorp.

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

到了這里,關(guān)于程序人生(CSAPP大作業(yè))的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 雷軍:我的程序人生路

    今天有朋友發(fā)給我一篇我在20年前在BBS上寫的帖子。那還是1996年,我們通過電話線撥號連接到西點BBS上飆帖子玩的年代。那是一個互聯(lián)網(wǎng)混沌初開的年代,那是一個BBS和Email幾乎主宰了全部互聯(lián)網(wǎng)的年代,那是一個青春的理想和熱血沸騰的年代。 我是一個程序員,一個軟件工

    2024年02月04日
    瀏覽(95)
  • C羅老矣,我的程序人生還有多遠(yuǎn)

    C羅老矣,我的程序人生還有多遠(yuǎn)

    ☆ 隨著12月11號摩洛哥1-0葡萄牙比賽的結(jié)束,不僅說明葡萄牙對要結(jié)束本屆卡塔爾世界杯了,就連C羅此生的世界杯之旅也將畫上句號了。 ☆ 37歲的球星本該是人生最璀璨的階段,但在足球生涯中,這已經(jīng)是大齡了。不禁讓我想到,身為開發(fā)的我,也大概類似吧。 ? 目錄 ?1、

    2024年01月16日
    瀏覽(29)
  • 【程序人生】上海城市開發(fā)者社區(qū)小聚有感

    【程序人生】上海城市開發(fā)者社區(qū)小聚有感

    ??作者簡介: 小明java問道之路 , 2022年度博客之星全國TOP3 ,專注于后端、中間件、計算機底層、架構(gòu)設(shè)計演進(jìn)與穩(wěn)定性建設(shè)優(yōu)化,文章內(nèi)容兼具廣度、深度、大廠技術(shù)方案,對待技術(shù)喜歡推理加驗證,就職于知名金融公司后端高級工程師。 ? ? ? ?? ?? 熱衷分享,喜歡原

    2024年02月06日
    瀏覽(27)
  • 【程序人生】如何在工作中保持穩(wěn)定的情緒?

    【程序人生】如何在工作中保持穩(wěn)定的情緒?

    在工作中保持穩(wěn)定的情緒是現(xiàn)代生活中一個備受關(guān)注的話題。隨著職場壓力和工作挑戰(zhàn)的增加,我們常常發(fā)現(xiàn)自己情緒波動不定,甚至受到負(fù)面情緒的困擾。然而,保持穩(wěn)定的情緒對于我們的工作效率、人際關(guān)系和整體幸福感都至關(guān)重要。 無論你是一位職場新人還是一位資深

    2024年02月15日
    瀏覽(31)
  • 程序人生——Java數(shù)組和集合使用建議(2)

    程序人生——Java數(shù)組和集合使用建議(2)

    程序人生——Java數(shù)組和集合使用建議(2) 需求:要刪除一個ArrayList中的20-30范圍內(nèi)的元素;將原列表轉(zhuǎn)換為一個可變列表,然后使用subList獲取到原列表20到30范圍內(nèi)的一個視圖(View),然后清空該視圖內(nèi)的元素,即可在原列表中刪除20到30范圍內(nèi)的元素 建議72:生成子列表后

    2024年03月19日
    瀏覽(44)
  • 程序人生 | 編程的上帝視角應(yīng)該怎么去找

    程序人生 | 編程的上帝視角應(yīng)該怎么去找

    ? 前言 ?? 作者簡介 :小明java問道之路,專注于Linux內(nèi)核/匯編/HotSpot/C++/Java/源碼/架構(gòu)/算法 就職于大型金融公司后端高級工程師,擅長交易領(lǐng)域的高安全/可用/并發(fā)/性能的架構(gòu)設(shè)計??? ?? CSDN專家博主/Java優(yōu)質(zhì)創(chuàng)作者/CSDN內(nèi)容合伙人 、InfoQ簽約作者 、阿里云專家/簽約博主、

    2023年04月24日
    瀏覽(35)
  • 【程序人生】還記得當(dāng)初自己為什么選擇計算機?

    【程序人生】還記得當(dāng)初自己為什么選擇計算機?

    ? ? ? ? 還記得人生中第一次接觸計算機編程是在高中,第一門編程語言是Python(很可惜由于條件限制的原因,當(dāng)時沒能堅持學(xué)下去......現(xiàn)在想來有點后悔,沒能堅持,唉......)。但是,錯過的就錯過了,把握當(dāng)前才是正確的選擇。努力最好的時機永遠(yuǎn)是在過去,其次就在當(dāng)

    2024年02月04日
    瀏覽(39)
  • 《人生苦短,我學(xué)Python》——第一個python程序

    《人生苦短,我學(xué)Python》——第一個python程序

    Hello!朋友們大家好,從今天開始,我們將學(xué)習(xí) Python 的相關(guān)內(nèi)容。 首先,讓我們來思考一個問題,編程是什么? 編程是人類與電腦溝通的過程,可以告訴電腦做什么以及怎么做。人類用編程構(gòu)建數(shù)字世界,比如網(wǎng)站、App、辦公軟件等等。 世界上有很多種編程語言,比如C,

    2024年02月11日
    瀏覽(24)
  • 人工智能AI時代:全棧程序員的人生規(guī)劃

    人工智能AI時代:全棧程序員的人生規(guī)劃

    博主 默語帶您 Go to New World. ? 個人主頁—— 默語 的博客???? 《java 面試題大全》 ??惟余輩才疏學(xué)淺,臨摹之作或有不妥之處,還請讀者海涵指正。??? 《MYSQL從入門到精通》數(shù)據(jù)庫是開發(fā)者必會基礎(chǔ)之一~ ?? 吾期望此文有資助于爾,即使粗淺難及深廣,亦備添少許微薄

    2024年02月11日
    瀏覽(48)
  • 程序人生 | 與足球共舞的火柴人(致敬格拉利什,賦予足球更深的意義)

    程序人生 | 與足球共舞的火柴人(致敬格拉利什,賦予足球更深的意義)

    個人簡介 ?? 個人主頁: 前端雜貨鋪 ???♂? 學(xué)習(xí)方向: 主攻前端方向,也會涉及到服務(wù)端 ?? 個人狀態(tài): 在校大學(xué)生一枚,已拿多個前端 offer(秋招) ?? 未來打算: 為中國的工業(yè)軟件事業(yè)效力n年 ?? 推薦學(xué)習(xí):??前端面試寶典 ??Vue2 ??Vue3 ??Vue2Vue3項目實戰(zhàn) ??

    2024年02月02日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包