哈工大计算机系统2022春 大作业 程序人生
計算機系統
計算機系統
大作業
題 ????目 ?程序人生-Hello’s P2P?
專?????? 業 ????????計算機科學與技術??????????????
學 ?? 號 ? ? ? ? ? ? ? ? ? ? ??
班 ?? 級 ? ? ? ? ? ? ? ? ? ? ??
學?????? 生 ?????????????
指 導 教 師 ????????????????劉宏偉???
計算機科學與技術學院
2021年5月
摘? 要
本文對hello程序的整個生命周期進行了的分析,包括 hello.c源程序的編寫,預處理生成hello.i文件,翻譯生成匯編語言文件hello.s,以及可重定位目標文件hello.o,最后將hello.o和系統目標文件鏈接起來,創建了一個可執行目標文件hello。調用fork函數創建進程,execve加載hello進入內存,控制程序邏輯流的運行,中斷,上下文切換和異常的處理,最后結束進程并由父進程進行回收
目? 錄
第1章 概述................................................................................................................ - 4 -
1.1 Hello簡介......................................................................................................... - 4 -
1.2 環境與工具........................................................................................................ - 4 -
1.3 中間結果............................................................................................................ - 4 -
1.4 本章小結............................................................................................................ - 4 -
第2章 預處理............................................................................................................ - 5 -
2.1 預處理的概念與作用........................................................................................ - 5 -
2.2在Ubuntu下預處理的命令............................................................................. - 5 -
2.3 Hello的預處理結果解析................................................................................. - 5 -
2.4 本章小結............................................................................................................ - 5 -
第3章 編譯................................................................................................................ - 6 -
3.1 編譯的概念與作用............................................................................................ - 6 -
3.2 在Ubuntu下編譯的命令................................................................................ - 6 -
3.3 Hello的編譯結果解析..................................................................................... - 6 -
3.4 本章小結............................................................................................................ - 6 -
第4章 匯編................................................................................................................ - 7 -
4.1 匯編的概念與作用............................................................................................ - 7 -
4.2 在Ubuntu下匯編的命令................................................................................ - 7 -
4.3 可重定位目標elf格式.................................................................................... - 7 -
4.4 Hello.o的結果解析.......................................................................................... - 7 -
4.5 本章小結............................................................................................................ - 7 -
第5章 鏈接................................................................................................................ - 8 -
5.1 鏈接的概念與作用............................................................................................ - 8 -
5.2 在Ubuntu下鏈接的命令................................................................................ - 8 -
5.3 可執行目標文件hello的格式........................................................................ - 8 -
5.4 hello的虛擬地址空間..................................................................................... - 8 -
5.5 鏈接的重定位過程分析.................................................................................... - 8 -
5.6 hello的執行流程............................................................................................. - 8 -
5.7 Hello的動態鏈接分析..................................................................................... - 8 -
5.8 本章小結............................................................................................................ - 9 -
第6章 hello進程管理....................................................................................... - 10 -
6.1 進程的概念與作用.......................................................................................... - 10 -
6.2 簡述殼Shell-bash的作用與處理流程........................................................ - 10 -
6.3 Hello的fork進程創建過程......................................................................... - 10 -
6.4 Hello的execve過程..................................................................................... - 10 -
6.5 Hello的進程執行........................................................................................... - 10 -
6.6 hello的異常與信號處理............................................................................... - 10 -
6.7本章小結.......................................................................................................... - 10 -
第7章 hello的存儲管理................................................................................... - 11 -
7.1 hello的存儲器地址空間................................................................................ - 11 -
7.2 Intel邏輯地址到線性地址的變換-段式管理............................................... - 11 -
7.3 Hello的線性地址到物理地址的變換-頁式管理.......................................... - 11 -
7.4 TLB與四級頁表支持下的VA到PA的變換................................................ - 11 -
7.5 三級Cache支持下的物理內存訪問............................................................. - 11 -
7.6 hello進程fork時的內存映射..................................................................... - 11 -
7.7 hello進程execve時的內存映射................................................................. - 11 -
7.8 缺頁故障與缺頁中斷處理.............................................................................. - 11 -
7.9動態存儲分配管理........................................................................................... - 11 -
7.10本章小結........................................................................................................ - 12 -
第8章 hello的IO管理.................................................................................... - 13 -
8.1 Linux的IO設備管理方法............................................................................. - 13 -
8.2 簡述Unix IO接口及其函數.......................................................................... - 13 -
8.3 printf的實現分析........................................................................................... - 13 -
8.4 getchar的實現分析....................................................................................... - 13 -
8.5本章小結.......................................................................................................... - 13 -
結論............................................................................................................................ - 14 -
附件............................................................................................................................ - 15 -
參考文獻.................................................................................................................... - 16 -
第1章 概述
1.1 Hello簡介
?1. 編寫hello.c程序,得到源程序
?2. hello.c通過gcc編譯器處理得到可執行文件hello,實際過程為
?? ?2.1 ?hello.c經過預處理修改源程序代碼生成hello.i文本文件,這是一個新的c程序
?? ?2.2? hello.i再經過編譯生成匯編程序hello.s
?? ?2.3? hello.s通過匯編指令集變成二進制可重定位目標文件hello.o但此時該文件還不可以執行
?? ?2.4? 最后經過鏈接,將hello.o文件與一些提前編譯好的文件合并生成hello可執行文件
?3. hello文件存入磁盤,等待調用
?4.通過命令解釋程序shell為hello創建新的進程,在通過調用execve對虛擬內存進行映射,通過mmap為hello開辟一片空間。
?5.最后中央處理器CPU從虛擬內存中截取代碼和數據,調度器為進程規劃時間片,在發生異常時觸發異常處理子程序
1.2環境與工具
??
1.硬件環境:Intel(R) Core(TM) i7-10875H CPU 2.30 GHz;16GRAM;1024Disk
2.軟件環境:Windows11 64位; Ubuntu 20.04 LTS 64位
3.工具:codeblocks;gdb;
1.3 中間結果
? 1.hello.c 程序的源文件,用于編寫代碼
??2.hello.s 編譯后的文件
??3.hello.o 匯編后的文件,用于查看反匯編后的代碼
??4.hello.i 預處理后的文件,可以對比查看預處理的內容
??5.hello.elf ?hello.o的elf格式文件
??6.hello.txt ?hello反匯編的文件
??7.hello 最終生成的可執行文件
8.hello1.elf ?hello的elf格式文件
1.4 本章小結
本章主要介紹了hello程序的編譯執行大概過程,說明了軟件運行的設備環境和硬件設施。
(第1章0.5分)
第2章 預處理
2.1 預處理的概念與作用
1.概念:根據以#開頭的代碼,修改源程序
2.作用:讀取指定文件的內容并插入源程序,得到一個新的c程序。
2.2在Ubuntu下預處理的命令
命令:gcc -E -o hello.i hello.c
2.3 Hello的預處理結果解析
hello.i文件部分內容如圖所示:
目測文件內容依舊是可閱讀的c語言程序代碼,但是對一些函數等內容進行了替換。可以得出預處理的內容是對源程序進行的展開。
2.4 本章小結
本章了解了對hello文件的預處理的具體過程和結果,通過對比hello.i和hello文件可以看出預處理的本質工作是進行c語言代碼的補充和替換。
(第2章0.5分)
第3章 編譯
3.1 編譯的概念與作用
概念:將文本文件hello.i轉化為文件hello.s
作用:進行詞法分析和語法分析,判斷是否存在語法詞法錯誤
3.2 在Ubuntu下編譯的命令
命令:gcc -S hello.i -o hello.s
3.3 Hello的編譯結果解析
hello.s文件部分內容如下:
.file “hello.c”????? 聲明源文件
.text?????? ???????????代碼段,存放函數的二進制指令
.section ?.rofata????? 只讀數據段,存放“”中的字符串?????
.string “hello %s %s\n” 聲明一段字符
.globl? main?????????? 聲明全局變量?? ???????????
.type? main,@function ?聲明符號類型(函數還是數據)
.align 8?????????????? ?聲明存放地址對齊的方式
hello程序中聲明了兩個字符串,都保存在只讀數據段中
hello程序中也聲明了一個局部變量i,暫時保存在堆棧 -4(%rbp)的位置
hello程序的參數argc也保存在堆棧中
hello程序中還存在著一個數組argv[]作為函數的參數,存放在 -32(%rbp)的位置
匯編代碼中立即數直接在代碼中表示
賦值操作:mov a? b? 代碼表示將a中的數據復制到b中,從而實現賦值操作, mov代碼一般會帶后綴表示操作的數據大小
運算操作:add ?a? b? 代碼表示將a加給b,可以實現加法運算,hello程序中主要的運算操作為循環過程中的i++,實現方式如圖
循環與跳轉:通過cmpl代碼對后條件碼進行判斷,je和jle則利用條件碼進行跳轉,從而實現循環
函數傳參:先設定一個寄存器,將參數傳給這個設定的寄存器后
函數調用:通過call來跳轉到調用的函數開頭的地址。
3.4 本章小結
本章主要從c語言的數據,賦值語句,算術操作,邏輯/位操作,跳轉操作,函數操作這幾點入手,分析了編譯器是如何把hello.i文件從高級的c語言變成了低階的匯編語言
第4章 匯編
4.1 匯編的概念與作用
??? 概念:通過指令集將匯編程序hello.s轉化為機器指令并按一定規則打包得到可重定位目標文件hello.o
作用:將匯編語言翻譯成機器語言,使其在鏈接時能被找到,鏈接后能夠被機器識別并執行。
4.2 在Ubuntu下匯編的命令
命令:gcc -c -o hello.o hello.s
4.3 可重定位目標elf格式
hello.elf文件的部分內容如下:
分析內容:
4.4 Hello.o的結果解析
通過objdump -d -r hello.o命令可以得到hello.o文件的反匯編代碼
內容如下:
與前面hello.s文件進行對比:
Hello.o的反匯編代碼中,je后的代碼不再是原來的段名,改成了確定的地址,這是因為段本身只是匯編語言中用于幫助編寫的記憶符號,匯編成機器語言后不能繼續使用
2.函數調用代碼不同:
Call指令后不再接函數的名字,而是一條重定位條目指引的信息
立即數都變成了十六進制,較于十進制更容易處理
4.5 本章小結
本章主要介紹了匯編過程,我們通過查看hello.elf文件內容了解了可重定位目標文件的格式,反匯編得到了hello.o文件的匯編代碼并與hello.i進行了對比,了解了匯編語言轉化為機器語言的過程。
第5章 鏈接
5.1 鏈接的概念與作用
1.概念:鏈接是將各種代碼和數據片段收集并組合成為一個單一文件的過程,這個文件可以被加載到內存并執行
2.作用:允許我們把程序分解為更小,更好管理的模塊,可以獨立的修改和編譯這些模塊,不必重新編譯整個程序。
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 可執行目標文件hello的格式
通過readelf -a hello>hello1.elf命令可以生成hello1.elf文件,文件部分內容如下圖:
1.hello是一個可執行目標文件,有27個節
2. 節頭對 hello中所有的節信息進行了聲明,包括大小和偏移量
3.重定位節:
4.符號表:
5.4 hello的虛擬地址空間
分析程序頭LOAD可加載的程序段的地址為0x400000
使用edb加載程序,查看程序信息:
在0x400000~0x401000段中,程序被載入,虛擬地址0x400000開始,到0x400fff結束,可以通過edb找到各個節的信息,虛擬地址開始于0x4010f0,大小為0x145
5.5 鏈接的重定位過程分析
命令:objdump -d -r hello > hello.txt
生成的文件部分內容如下:
hello的重定位過程:
?? 1.重定位節和符號定義鏈接器將所有類型相同的節合并在一起后,這個節就作為可執行目標文件的節。然后鏈接器把運行時的內存地址賦給新的聚合節,賦給輸入模塊定義的每個節,以及賦給輸入模塊定義的每個符號,當這一步完成時,程序中每條指令和全局變量都有唯一運行時的地址。
?? 2.重定位節中的符號引用這一步中,連接器修改代碼節和數據節中對每個符號的引用,使他們指向正確的運行時地址。
?? 3.重定位條目當編譯器遇到對最終位置未知的目標引用時,它會生成一個重定位條目。代碼的重定位條目放在.rel.txt中。
5.6 hello的執行流程
通過edb打開hello文件,運用step into指令調試,遇到函數會發生跳轉
程序地址
??????? 00007f3cda2f9df0
??????? 00007f264db03df0
??????? 00007f035f63f7d0
??????? 0000400550
??????? 000007fd34770bb10
??????? 000007f03a4843b27
??????? 00000400610
??????? 00000400582
??????? 00000400530
?
5.7 Hello的動態鏈接分析
5.8 本章小結
本章研究了鏈接的過程。通過edb查看hello的虛擬地址空間,對比hello與hello.o的反匯編代碼
第6章 hello進程管理
6.1 進程的概念與作用
1.概念:進程(Process)是計算機中的程序關于某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。
2.作用:進程作為一個執行中程序的實例,系統中每個程序都運行在某個進程的上下文中。
6.2 簡述殼Shell-bash的作用與處理流程
1.shell程序的作用:Linux系統中,Shell是一個命令解釋程序,它為用戶提供操作命令和文件的界面,用戶可以直接通過在shell程序上輸入的指令調用相應的程序
2.流程:
a.在shell命令行中輸入命令:$./hello,解釋器構造argv和envp;
b. 調用fork()函數創建子進程,
c. 調用execve()函數在當前進程(新創建的子進程)的上下文中加載并運行hello
程序。將hello中的.text節、.data節、.bss節等內容加載到當前進程的虛擬地址空
間
d. 調用hello程序的main()函數,hello程序開始在一個進程的上下文中運行。
6.3 Hello的fork進程創建過程
在終端中輸入./hello 學號 姓名 1命令后,shell會處理該命令,判斷出不是內置命令,則會調用fork函數創建一個新的子進程,子進程幾乎但不完全與父進程相同。通過fork函數,子進程得到與父進程用戶級虛擬地址空間相同的但是虛擬地址獨立、PID也不相同的一份副本。
6.4 Hello的execve過程
創建了一個子進程時,子進程調用exceve函數在當前子進程的上下文加載并運行一個新的程序,會經過以下步驟:
1.刪除之前進程在用戶部分中已存在的結構。
2.創建新的代碼、數據、堆和棧段。
3.映射共享區域。先動態鏈接共享對象,然后再映射到用戶虛擬地址空間中的共享區域。
4.設置程序計數器(PC)。Exceve會設置當前進程的上下文中的程序計數器,使之指向代碼區域的入口點。
6.5 Hello的進程執行
1.進程上下文切換:如果系統調用因為等待某個事件發生而阻塞,那么內核可以讓當前進程休眠,切換到另一個進程
2.進程時間片:進程的運行本質上是CPU不斷從程序計數器 PC 指示的地址處取出指令并執行,值的序列叫做邏輯控制流。在一個程序被調運行開始到被另一個進程打斷,中間的時間就是運行的時間片
3.用戶態和核心態: 進程只有故障、中斷或陷入系統調用時才會得到內核訪問權限,其他情況下始終處于用戶權限之中,這樣可以保證系統的安全性。
4.進程調度:即加載保存的寄存器,切換虛擬地址空間
6.6 hello的異常與信號處理
1.正常運行:
2.CTRL+Z: 輸入ctrl-z默認結果是掛起前臺的作業,hello進程并沒有回收,而是運行在后臺下,用ps命令可以看到,hello進程并沒有被回收。
3.CTRL+C:
內核發送一個SIGINT信號到前臺進程組的每個進程,默認情況是終止前臺作業,用ps查看前臺進程組發現沒有hello進程,如圖所示。
6.7本章小結
本章了解了hello進程的執行過程。內核為程序調度,異常處理程序處理各種異常。不同信號有不同的處理機制,不同的shell命令,hello也有不同的響應結果。
第7章 hello的存儲管理
7.1 hello的存儲器地址空間
1.邏輯地址:程序經過編譯后出現在匯編代碼中的地址。
2.線性地址:邏輯地址向物理地址轉化過程中的一步,邏輯地址經過段機制后轉化為線性地址
3.虛擬地址:就是線性地址。
4.物理地址:CPU通過地址總線的尋址,找到真實的物理內存對應地址。
7.2 Intel邏輯地址到線性地址的變換-段式管理
1.原理:在段式存儲管理 中,將程序的地址空間劃分為若干個段(segment),為每個段分配一個連續的分區,進程中的各個段可以不連續地存放在內存的不同分區中。程序加載時,操作系統為 所有段分配其所需內存,這些段不必連續。程序通過分段可以劃分為多個模塊。
2.邏輯地址的組成:一個邏輯地址由段標識符和段內偏移量組成。段標識符是一個16位長的字段。其中前13位是一個索引號。后面3位包含一些硬件細節。
3.查看方式:
給定一個完整的邏輯地址 段標識符a:段內偏移量b
看段選擇符的T1=0還是1,了解當前要轉換是全局段描述符表中的段還是局部段描述符表中的段。
根據段選擇符的前13位查找到對應的段描述符,確定Base基地址。
將Base+offset,就是線性地址
7.3 Hello的線性地址到物理地址的變換-頁式管理
1.基本原理:將 程序的邏輯地址空間劃分為固定大小的頁,而物理內存劃分為同樣大小的頁框。程序加載時,可將任意一頁放人內存中任意一個頁框,這些頁框不必連續,從而實現了離散分配。
2. 傳輸單元:系統將虛擬頁作為進行數據傳輸的單元。Linux下每個虛擬頁大小為4KB。物理內存也被分割為物理頁, MMU(內存管理單元)負責地址翻譯,MMU使用頁表將虛擬頁到物理頁的映射,即虛擬地址到物理地址的映射。
3. n位的虛擬地址包含兩個部分:一個p位的虛擬頁面偏移(VPO),一個n-p位的虛擬頁號(VPN),MMU利用VPN選擇適當的PTE,根據PTE,我們知道虛擬頁的信息,如果虛擬頁是已緩存的,那直接將頁表條目的物理頁號和虛擬地址的VPO串聯起來就得到一個相應的物理地址。VPO和PPO是相同的。如果虛擬頁是未緩存的,會觸發一個缺頁故障。調用一個缺頁處理子程序將磁盤的虛擬頁重新加載到內存中,然后再執行這個導致缺頁的指令。
7.4 TLB與四級頁表支持下的VA到PA的變換
1.TLB:當處理 器要在主內存尋址時,不是直接在內存的物理地址里查找的,而是通過一組虛擬地址轉換到主內存的物理地址,TLB就是負責將虛擬內存地址翻譯成實際的物理內 存地址,而CPU尋址時會優先在TLB中進行尋址。
2:VA->PA:處理器生成一個虛擬地址,并將其傳送給MMU。MMU用VPN向TLB請求對應的PTE,命中得到PA。否則MMU查詢頁表,CR3確定第一級頁表的起始地址,VPN1確定在第一級頁表中的偏移量,查詢出PTE,最終在第四級頁表中找到PPN,與VPO組合成物理地址PA,添加到PLT。
7.5 三級Cache支持下的物理內存訪問
獲得物理地址之后,先取出組索引對應位,在L1中尋找對應組。如果存在,則比較標志位,相等后檢查有效位是否為1.如果都滿足則命中取出值傳給CPU,否則按順序對L2cache、L3cache、內存進行相同操作,直到出現命中。然后再一級一級向上傳,如果有空閑塊則將目標塊放置到空閑塊中,否則將緩存中的某個塊驅逐,將目標塊放到被驅逐塊的位置。
7.6 hello進程fork時的內存映射
當fork 函數被 shell 進程調用時,內核創建子進程并分配給它一個唯一的 PID,同時創建了當前進程的mm_struct、區域結構和頁表的原樣副本。它將這兩個進程的每個頁面都標記為只讀,并將兩個進程中的每個區域結構都標記為私有的寫時復制。當fork在新進程中返回時,新進程現在的虛擬內存剛好和調用fork時存在的虛擬內存相同。當這兩個進程中的任一個后來進行寫操作時,寫時復制機制就會創建新頁面。
7.7 hello進程execve時的內存映射
execve 函數調用加載器代碼,在當前進程中加載并運行hello 需要以下幾個步驟:
1. 刪除已存在的用戶區域,刪除當前進程虛擬地址的用戶部分中的已存在的區域結構。
2. 映射私有區域,為新程序的代碼、數據、 bss和棧區域創建新的區域結構,所有這些新的區域都是私有的、寫時復制的。
3.共享對象由動態鏈接映射到本進程共享區域
4.設置程序計數器使之指向代碼區域的入口點
7.8 缺頁故障與缺頁中斷處理
缺頁故障:當指令引用一個虛擬地址,在 MMU中查找頁表時發現與該地址相對應的物理地址不在內存中,因此必須從磁盤中取出的時候就會發生故障。
缺頁中斷處理:先檢查虛擬地址是否合法,再檢查進程是否有讀、寫或執行該區域頁面的權限。如果兩者皆無誤,選擇一個犧牲頁面,如果這個犧牲頁面被修改過,那么就將它交換出去,換入新的頁面并更新頁表。再將控制轉移給hello進程,再次執行觸發缺頁故障的指令
7.9動態存儲分配管理
程序運行時使用動態內存分配器獲得虛擬內存。動態內存分配器維護著一個進程的虛擬內存區域,稱為堆。
對于每個進程,內核維護著一個變量 brk,它指向堆的頂部。分配器將堆視為一組不同大小的塊的結合來維護。每個塊就是一個連續的擬內存片,要么是已分配的,要么是空閑的。已分配的塊顯式地保留為供應用程序使用。空閑塊可用來分配。一個已分配的塊保持已分配狀態,直到它被釋放,這種釋放要么是應用程序顯式執行的,要么是內存分配器自身隱式執行的。分配器有兩種基本風格,兩種風格都要求應用顯式地分配塊,不同在于由哪個實體來負責釋放。
顯式分配器:要求應用顯式地釋放任何已分配的塊。
隱式分配器:要求分配器檢測一個已分配塊何時不再使用,那么就釋放這個塊,垃圾收集:自動釋放未使用的已經分配的塊的過程。
隱式空閑鏈表:空閑塊通過頭部中的大小字段隱含地連接著。分配器可以通過遍歷堆中所有的塊,從而間接地遍歷整個空閑塊的集合。
顯式空閑鏈表:每個空閑塊中,都包含一個前驅和后繼指針。使用雙向鏈表使首次適配的時間減少到空閑塊數量的線性時間。
7.10本章小結
本章介紹了存儲器地址空間、段式管理、頁式管理,VA 到 PA 的變換、物理內存訪問, h內存映射、缺頁故障與缺頁中斷處理、包括隱式空閑鏈表和顯式空閑鏈表的動態存儲分配管理。
第8章 hello的IO管理
8.1 Linux的IO設備管理方法
(以下格式自行編排,編輯時刪除)
設備的模型化:文件
設備管理:unix io接口
8.2 簡述Unix IO接口及其函數
(以下格式自行編排,編輯時刪除)
8.3 printf的實現分析
(以下格式自行編排,編輯時刪除)
[轉]printf 函數實現的深入剖析 - Pianistx - 博客園
從vsprintf生成顯示信息,到write系統函數,到陷阱-系統調用 int 0x80或syscall等.
字符顯示驅動子程序:從ASCII到字模庫到顯示vram(存儲每一個點的RGB顏色信息)。
顯示芯片按照刷新頻率逐行讀取vram,并通過信號線向液晶顯示器傳輸每一個點(RGB分量)。
8.4 getchar的實現分析
(以下格式自行編排,編輯時刪除)
異步異常-鍵盤中斷的處理:鍵盤中斷處理子程序。接受按鍵掃描碼轉成ascii碼,保存到系統的鍵盤緩沖區。
getchar等調用read系統函數,通過系統調用讀取按鍵ascii碼,直到接受到回車鍵才返回。
8.5本章小結
(以下格式自行編排,編輯時刪除)
(第8章1分)
結論
抽象對計算機系統是很重要的概念,底層信息用二進制來抽象表示,進程是對處
理器、主存和I/O設備的抽象,虛擬內存是對主存和磁盤設備的抽象,文件是對I/O
設備的抽象,等等。
附件
1.hello.c 程序的源文件,用于編寫代碼
2.hello.s 編譯后的文件
3.hello.o 匯編后的文件,用于查看反匯編后的代碼
4.hello.i 預處理后的文件,可以對比查看預處理的內容
5.hello.elf? hello.o的elf格式文件
6.hello.txt? hello反匯編的文件
7.hello 最終生成的可執行文件
8.hello1.elf? hello的elf格式文件
參考文獻
為完成本次大作業你翻閱的書籍與網站等
[1]? 深入理解計算機系統原書第3版-文字版.pdf
[2]? 哈爾濱工業大學計算機系統大作業2022春_Drama_coder的博客-CSDN博客
[3]? https://blog.csdn.net/yueyansheng2/article/details/78860040
總結
以上是生活随笔為你收集整理的哈工大计算机系统2022春 大作业 程序人生的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python语法基础14 pickle与
- 下一篇: c++报错:表达式必须含有常量值