計算機系統
大作業
題 ????目??程序人生-Hello’s P2P ?
專 ??????業 ?????物聯網工程????????
學 ??號 ????2022112820 ????????
班 ??級?????2237301 ???????????
學 ??????生 ????孟宇航 ??????
指 導 教 師?????吳 ??銳??????????
計算機科學與技術學院
2024年5月
摘要是論文內容的高度概括,應具有獨立性和自含性,即不閱讀論文的全文,就能獲得必要的信息。摘要應包括本論文的目的、主要內容、方法、成果及其理論與實際意義。摘要中不宜使用公式、結構式、圖表和非公知公用的符號與術語,不標注引用文獻編號,同時避免將摘要寫成目錄式的內容介紹。
關鍵詞:關鍵詞1;關鍵詞2;……;????????????????????????????
(摘要0分,缺失-1分,根據內容精彩稱都酌情加分0-1分)
目 ?錄
第1章 概述
1.1 Hello簡介
1.2 環境與工具
1.3 中間結果
1.4 本章小結
第2章 預處理
2.1 預處理的概念與作用
2.2在Ubuntu下預處理的命令
2.3 Hello的預處理結果解析
2.4 本章小結
第3章 編譯
3.1 編譯的概念與作用
3.2 在Ubuntu下編譯的命令
3.3 Hello的編譯結果解析
3.4 本章小結
第4章 匯編
4.1 匯編的概念與作用
4.2 在Ubuntu下匯編的命令
4.3 可重定位目標elf格式
4.4 Hello.o的結果解析
4.5 本章小結
第5章 鏈接
5.1 鏈接的概念與作用
5.2 在Ubuntu下鏈接的命令
5.3 可執行目標文件hello的格式
5.4 hello的虛擬地址空間
5.5 鏈接的重定位過程分析
5.6 hello的執行流程
5.7 Hello的動態鏈接分析
5.8 本章小結
第6章 hello進程管理
6.1 進程的概念與作用
6.2 簡述殼Shell-bash的作用與處理流程
6.3 Hello的fork進程創建過程
6.4 Hello的execve過程
6.5 Hello的進程執行
6.6 hello的異常與信號處理
6.7本章小結
第7章 hello的存儲管理
7.1 hello的存儲器地址空間
7.2 Intel邏輯地址到線性地址的變換-段式管理
7.3 Hello的線性地址到物理地址的變換-頁式管理
7.4 TLB與四級頁表支持下的VA到PA的變換
7.5 三級Cache支持下的物理內存訪問
7.6 hello進程fork時的內存映射
7.7 hello進程execve時的內存映射
7.8 缺頁故障與缺頁中斷處理
7.9動態存儲分配管理
7.10本章小結
第8章 hello的IO管理
8.1 Linux的IO設備管理方法
8.2 簡述Unix IO接口及其函數
8.3 printf的實現分析
8.4 getchar的實現分析
8.5本章小結
結論
附件
參考文獻
第1章 概述
1.1 Hello簡介
① P2P(From Program to Process)過程:
????????hello的生命周期是從一個高級C語言程序開始的,分為四個階段:首先經過預處理器cpp進行預處理,生成文本文件hello.i,然后經過編譯器ccl生成hello.s匯編程序,接著經過匯編器as生成hello.o文件,最后經過鏈接器ld將其與引用到的庫函數鏈接,生成可執行文件hello。再通過系統創建一個新進程并且把程序內容加載,實現有程序到進程的轉化。
② O2O(From Zero-0 to Zero-0)過程:
????????當程序員在shell中運行可執行目標文件hello時,shell識別出這是一個外部命令,先調用 fork函數創建了一個新的子進程(Process),然后調用execve函數在新的子進程中加載并運行hello。運行hello還需要CPU為hello分配內存、時間片。在hello運行的過程中,CPU要訪問相關數據需要MMU的虛擬地址到物理地址的轉化,其中 TLB和四級頁表為提高地址翻譯的速度做出了巨大貢獻,得到物理地址后三級 Cache又幫助CPU快速得到需要的字節。系統的進程管理幫助hello切換上下文、shell的信號處理程序使得hello在運行過程中可以處理各種信號,當程序員主動地按下Ctrl+Z或者hello運行到“return 0”;時hello所在進程將被殺死,shell會回收它的僵死進程。
1.2 環境與工具
列出你為編寫本論文,折騰Hello的整個過程中,使用的軟硬件環境,以及開發與調試工具。
硬件環境:X64 CPU;2GHz;2G RAM;256GHD Disk以上;
軟件環境:Windows10 64位; Vmware 11; Ubuntu 16.04 LTS 64位;
開發工具:CodeBlocks;vi/vim/gpedit+gcc;gdb;edb;readelf;objdump等。
1.3 中間結果
列出你為編寫本論文,生成的中間結果文件的名字,文件的作用等。
得到的中間文件:
hello.i :hello.c預處理器(cpp)預處理得到修改了的源程序
hello.s :hello.i編譯器(cc1)翻譯成匯編程序
hello.o :hello.s匯編器(as)成為可重定位目標程序(二進制)
hello :連接器(ld)調用printf.o得到可執行目標程序(二進制)
hello.elf :hello.o的elf格式文件
helloo.elf :hello的elf格式文件
1.4 本章小結
本章通過簡單介紹hello.c程序一生中的P2P過程和020過程,展示了一個源程序是如何經過預處理、編譯、匯編、鏈接等階段,生成各種各樣的中間文件,最終成為一個可執行目標文件的。
(第1章0.5分)
第2章 預處理
2.1?預處理的概念與作用
以字符#開頭的命令,修改原始的C程序,語言提供的編譯預處理功能主要有三種:宏定義、文件包含和條件編譯。預處理功能便于程序的修改、閱讀、移植和調試,也便于實現模塊化程序設計
2.2在Ubuntu下預處理的命令
gcc –E hello.c –o hello.i
2.3 Hello的預處理結果解析
hello.i文件中將#include進行了展開,包含了對文件的引用
hello.i中對數據類型用typedef進行了替換
hello.i對內部函數進行了封裝
hello.i文件最后部分展示了代碼
2.4 本章小結
本章介紹了預處理的概念和作用,以及預處理的指令,隨后分析了預處理的過程與結果。通過本章的學習,了解到C 語言預處理一般由預處理器(cpp)進行.
(第2章0.5分)
第3章 編譯
3.1 編譯的概念與作用
編譯就是文件hello.i通過編譯器(ccl)生成hello.s的過程,在編譯過程中,會進行詞法分析,語法分析,語義分析、中間代碼生成、代碼優化、目標代碼生成來生成匯編語言程序,使代碼變成機器易于理解的形式。??????
3.2 在Ubuntu下編譯的命令
gcc -S hello.i -o hello.s
3.3 Hello的編譯結果解析
主體部分如上圖:
3.3.1對局部變量
進入main后,會向棧申請一段空間用于儲存局部變量(如圖中21——23),21行將棧指針(rsp)減少32,22、23分別將edi、rsi中數據存于這段空間中。
3.3.2 對循環
如圖中24、25行,當24行cmp的結果為0時,25行進行跳轉,跳轉至.L2。
3.3.3 對函數引用
如圖中28行,使用call引用puts函數,并在返回時利用ret返回。
3.3.4 對賦值
如圖中19行,用move將源操作數(rsp)的值付給被操作數(rbp)。
3.3.5 對加減運算
如圖中21、36行,使用sub指令使兩數相減(rsp-32),add指令使兩數相加。
3.4 本章小結
本章主要介紹了編譯的概念以及過程。編譯程序所做的工作,就是通過詞法分析和語法分析,在確認所有的指令都符合語法規則之后,將其翻譯成等價的中間代碼表示或匯編代碼表示。同時通過示例函數表現了C語言如何轉換成為匯編代碼。介紹了匯編代碼如何實現數據、賦值、算術操作、關系操作、控制轉移、函數調用、數組操作。
(第3章2分)
第4章 匯編
4.1 匯編的概念與作用
匯編就是文件hello.s通過匯編器(as)生成hello.o的過程,在匯編過程中,匯編器會將文件轉換為二進制文件——可重定位目標文件。
4.2 在Ubuntu下匯編的命令
gcc -C hello.s -o hello.o
4.3 可重定位目標elf格式
開頭是elf頭,包含文件類型、節頭表偏移等信息。
????
之后是節頭表,包含了節數以及各節名稱、類型、地址、偏移量、大小、全體大小、旗標、鏈接、信息、對齊等信息。
重定位節,包含.text節中需要重定位的信息。包含printf,atoi,getchar等。
符號表存放了引用的符號與函數信息。下圖為部分符號表。
4.4 Hello.o的結果解析
(以下格式自行編排,編輯時刪除)
反匯編代碼:objdump -d -r hello.o ?
Main函數部分反匯編代碼如圖。反匯編代碼與原.s文件相比,增加了相對應的機器語言的代碼。
同時,在:
- 函數調用處有所不同:
- 進制方面有所不同
- 分支轉移有所不同
在反匯編代碼中,分支轉移與函數調用時都加上了跳轉的真實地址以便于下一步操作。
4.5 本章小結
本章介紹了匯編的概念和作用,接著通過實操,對hello.s文件進行匯編,生成ELF可重定位目標文件hello.o,并查看了hello.o的ELF頭、節頭表、可重定位信息和符號表等,最后反匯編得到的文件與第三章的.s文件作對比,是我們更清晰的了解匯編的作用。
(第4章1分)
第5章 鏈接
5.1 鏈接的概念與作用
鏈接是將各種代碼和數據片段收集并組合成為一個單一文件的過程,這個文件可被加載到內存并執行。在現代系統中,鏈接是由鏈接器進行的。鏈接不僅有助于模塊之間的管理,也更有利于模塊的增減與修改。
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的格式
????
如上圖,與之前相比,所鏈接文件的各節分別組合成26個段,并且在ELF頭中增添了指令起始位置。
加載hello,查看虛擬空間各段信息。
由上可以看出該程序地址從0x401000開始,并可通過ELF頭中的段偏移得知各段起始位置。
可執行文件對可重定位目標文件的重定位涉及符號解析、地址分配和地址調整。在鏈接過程中,各個可重定向文件的相同elf section會被聚合在一起形成可執行文件的對應段。鏈接器將所有目標文件的符號表合并,解析每個符號的定義和引用。每個目標文件包含重定位條目,指示哪些地址需要調整。鏈接器讀取這些條目,確定需要更新的地址。所有代碼和數據都能正確加載到內存中,并確保可執行文件能夠正確執行。
5.6 hello的執行流程
<_init>:4004c0
<.plt>: 4004e0
<puts@plt>:4004f0
<puts@GLIBC_2.2.5> 4004f6
<printf@plt>: 400500:
<printf@GLIBC_2.2.5> 400506:
<getchar@plt>:400510
<getchar@GLIBC_2.2.5>400516
<atoi@plt>:400520
<atoi@GLIBC_2.2.5>400526
<exit@plt>:400530
<exit@GLIBC_2.2.5>400536
<sleep@plt>:400540
<sleep@GLIBC_2.2.5>400546:
<_start>: 400550
<__libc_start_main@GLIBC_2.2.5>40057a:
<_dl_relocate_static_pie>:400580
5.7 Hello的動態鏈接分析
調用前后,變化如圖所示:
本章利用edb解析了鏈接的實現過程,包括動態鏈接、elf頭等。
(第5章1分)
6.1 進程的概念與作用
進程的概念:進程是一個正在運行的程序的實例,包括程序的指令、數據、堆棧以及與操作系統相關的狀態信息。進程是操作系統進行資源分配和保護的基本單位。
作用:
1.資源分配與管理:進程是操作系統進行資源分配的基本單位,包括CPU時間、內存空間、I/O設備等。操作系統通過調度算法來決定哪個進程獲得CPU使用權。
2.并發執行:進程使得多個程序可以同時運行(并發或并行),提高了系統的利用率和響應速度。現代操作系統使用多任務處理來實現進程的并發執行。
6.2 簡述殼Shell-bash的作用與處理流程
1.作用:Shell 作為命令解釋器,接受用戶輸入的命令,并將其翻譯為操作系統能夠執行的動作。同時,Shell 提供了一個交互式的用戶接口,可以啟動和管理進程,支持后臺運行、進程間通信、管道等功能,用戶可以通過命令行直接與操作系統進行交互。這種接口對系統管理和開發工作非常重要。
2.處理流程:顯示提示符——>讀取命令——>解析命令(語法、詞匯解析)——>執行命令——>等待進程結束——>(處理輸出和錯誤)——>信號處理
6.3 Hello的fork進程創建過程
1.調用?fork:
當一個進程調用?fork?時,操作系統會創建一個新進程,該新進程是調用進程的副本。這個新進程稱為子進程,調用?fork?的進程稱為父進程。
2.復制進程上下文:
操作系統為子進程分配一個新的進程控制塊(PCB),并復制父進程的上下文到新的 PCB 中。這包括:
進程標識符(PID):子進程獲得一個新的、唯一的 PID。
進程狀態:包括寄存器內容、程序計數器(PC)、堆棧指針等。
內存映像:包括代碼段、數據段、堆和棧。子進程的內存空間是父進程內存空間的副本,但在現代操作系統中通常使用寫時復制(Copy-On-Write, COW)技術來提高效率。
文件描述符表:父進程打開的所有文件描述符會被子進程共享,但文件指針是獨立的。
3.返回兩次:
fork?系統調用會返回兩次:一次在父進程中,返回子進程的 PID;一次在子進程中,返回 0。
通過檢查?fork?的返回值,進程可以確定自己是父進程還是子進程,并執行不同的代碼路徑。
6.4 Hello的execve過程
調用?execve:
當一個進程調用?execve?時,它指定要執行的程序的路徑、命令行參數和環境變量。
加載新程序:
操作系統讀取并解析指定程序的可執行文件。通常,這個文件是一個二進制可執行文件,包含程序的代碼、數據和其他必要的信息。
操作系統會從文件系統中讀取該可執行文件的內容,并將其加載到當前進程的地址空間。
替換地址空間:
當前進程的地址空間被完全替換為新程序的地址空間。這包括:
代碼段:新的可執行文件中的代碼段取代舊程序的代碼段。
數據段:新的可執行文件中的數據段取代舊程序的數據段。
堆和棧:新的堆和棧段被重新初始化,與新程序的需求相符。
所有舊的內存映射、堆棧、堆和其他地址空間內容都被丟棄。
初始化新程序:
新程序的初始化代碼被執行。通常,這包括設置命令行參數 (argv) 和環境變量 (envp)。
程序的入口點(通常是?main?函數)開始執行。
返回值:
如果?execve?成功,新的程序開始執行,原始的程序代碼不再執行,所以?execve?調用不會返回。
如果?execve?失敗,例如由于找不到指定的可執行文件或權限問題,它將返回 -1,并設置?errno?以指示錯誤。
6.5 Hello的進程執行
編譯:然后,程序被編譯成機器代碼,這是計算機可以直接執行的指令。
加載到內存:接下來,操作系統使用execve()或fork()系統調用將編譯后的程序加載到內存中。如果使用fork(),會創建一個新的進程;如果使用execve(),則會替換當前進程的映像。
進程調度:操作系統根據進程的狀態(如運行中、等待I/O操作、休眠等)和調度策略,決定哪個進程應該獲得CPU時間片。
執行:獲得CPU時間片的進程開始執行。這通常意味著從程序的main函數開始執行。
輸出:程序執行到輸出語句(如printf()),操作系統將字符發送到相應的設備(如終端或顯示器)。
退出:程序執行完畢后,操作系統會回收進程使用的資源(如內存、文件描述符等),并將控制權返回給操作系統。
6.6 hello的異常與信號處理
SIGINT:如圖,用ctrl+c將SIGINT信號發送向前臺的每個程序,中斷其運行。
SIGTSTP:如圖,用ctrl+z發送IGTSTP信號,將程序掛起,可再用fg信號繼續該程序。
SIGKILL:使用kill -9 PID 殺死hello程序如圖。
6.7本章小結
本章介紹了進程的概念,同時探討了fork與execve進程的生成過程。最后探討了hello在進程執行中遇到的異常與信號處理。
(第6章1分)
第7章 hello的存儲管理
7.1 hello的存儲器地址空間
邏輯地址:CPU生成的地址,可能包含段選擇子和段內偏移量。
線性地址:段機制轉換后的地址,即段基地址與段內偏移量之和。
虛擬地址:分頁機制處理后的地址空間,程序員視角下的內存地址。CPU啟動保護模式之后,程序運行在虛擬地址空間中,虛擬地址空間是所有可能地址的集合,對于一個64位的機器而言,則集合中共有2^64種可能。
物理地址:實際內存單元的地址,硬件內存芯片的地址。
7.2 Intel邏輯地址到線性地址的變換-段式管理
在 Intel 的段式內存管理中,邏輯地址到線性地址的轉換過程如下:
1.從邏輯地址中提取段選擇子和段內偏移量。
2.使用段選擇子查找段描述符表(GDT 或 LDT),獲取段描述符。
3.從段描述符中提取段基地址。
4.將段基地址與段內偏移量相加,得到線性地址。
7.3 Hello的線性地址到物理地址的變換-頁式管理
在頁式內存管理中,線性地址到物理地址的轉換過程如下:
1.從線性地址中提取目錄索引、頁表索引和頁內偏移量。
2.使用目錄索引在頁目錄中查找對應的頁表地址。
3.使用頁表索引在頁表中查找對應的頁框地址。
4.將頁框地址與頁內偏移量相加,得到物理地址。
7.4 TLB與四級頁表支持下的VA到PA的變換
1.TLB查找:檢查TLB中是否有對應的頁表項。
如果命中,直接得到物理地址。
如果未命中,進行四級頁表查找。
2.四級頁表查找:逐級從一級頁表查找到四級頁表,最終得到物理頁框地址。
3.計算物理地址:將物理頁框地址與頁內偏移量相加,得到最終的物理地址。
7.5 三級Cache支持下的物理內存訪問
三級緩存系統通過分層次結構,加速了數據的訪問:
L1緩存:最快速,但容量最小,適合經常訪問的數據。
L2緩存:速度適中,容納更多數據,作為L1緩存的后備。
L3緩存:速度較慢,但容量最大,作為L2緩存的后備。
在每個緩存級別,訪問過程都遵循類似的步驟:查找緩存,如果命中則返回數據,如果未命中則繼續查找下一級緩存或最終訪問主存。通過這種分層次的緩存結構,系統可以顯著減少平均內存訪問時間,提高整體性能。
7.6 hello進程fork時的內存映射
fork?系統調用創建子進程時,采用寫時復制機制,避免了不必要的內存復制,提高了性能。父進程和子進程共享相同的物理內存頁,直到某一方需要寫入這些頁,這時才會進行實際的頁復制操作。這樣提高了系統資源的利用效率,并減少了內存開銷。
7.7 hello進程execve時的內存映射
execve?系統調用用于加載并執行一個新程序,它會清空當前進程的地址空間并用新程序的地址空間替代。這包括加載新程序的代碼段、數據段、BSS段,以及初始化新的堆和棧,從而使得新程序可以從?main?函數開始執行。
7.8 缺頁故障與缺頁中斷處理
過程:
1. 進程嘗試訪問某虛擬地址。
2. 發現該地址不在物理內存中,引發缺頁故障。
3. 硬件觸發缺頁中斷,操作系統中斷處理程序開始執行。
4. 檢查頁面表,確定缺頁地址。
5. 判斷訪問是否合法:
???- 非法訪問:向進程發送信號(如`SIGSEGV`)。
???- 合法訪問:繼續處理。
6. 頁換入:
???- 找到空閑頁框或進行頁面置換。
???- 從磁盤讀取頁面到物理內存。
7. 更新頁面表和TLB。
8. 返回進程繼續執行,引起缺頁故障的指令重新執行。
7.9動態存儲分配管理
分配內存:
- malloc(size_t size):分配?size?字節的內存,并返回指向已分配內存塊的指針。如果分配失敗,返回?NULL。
- calloc(size_t nmemb, size_t size):分配初始化為零的內存,分配?nmemb?個元素,每個元素大小為?size?字節。
3.realloc(void *ptr, size_t size):調整先前已分配內存塊的大小,可能會移動數據到新的內存位置。
釋放內存:
1.free(void *ptr):釋放之前通過?malloc、calloc?或?realloc?分配的內存塊。
動態內存管理的基本策略
分區空閑鏈表(Segregated Free Lists):
將不同大小的空閑塊分別存儲在不同的鏈表中,以加速分配和釋放過程。這種方法將內存分塊管理,避免了遍歷長鏈表,提升了效率。
分裂與合并(Splitting and Coalescing):
當分配一個大的空閑塊時,分裂它以滿足請求,并保留剩余部分供將來使用。
當釋放內存塊時,嘗試合并相鄰的空閑塊,減少碎片化。
動態內存管理的實現細節
7.10本章小結
本章介紹了hello的存儲地址空間,intel的段式管理、hello的頁式管理,以及在TLB和四級頁表的支持下完成VA到PA的變換過程,三級Cache支持下的物理內存訪問。解釋了hello進程的fork與execve時的內存映射,缺頁故障及其處理,以及進程的動態存儲分配的管理。
(第7章 2分)
第8章 hello的IO管理
8.1 Linux的IO設備管理方法
(以下格式自行編排,編輯時刪除)
1.?設備的模型化:文件
在Unix和類似的操作系統中,設備被抽象和模型化為文件。這種設計理念使得設備的操作與普通文件的操作一致,簡化了用戶和程序對設備的使用。
1.設備文件
設備文件是特殊的文件,位于?/dev?目錄下,每個設備在這個目錄中都有一個對應的文件。設備文件分為兩類:
字符設備文件:用于按字符流處理數據的設備,如鍵盤和串口。
塊設備文件:用于按數據塊處理數據的設備,如硬盤和SSD。
2.統一接口
通過設備文件,用戶可以使用標準的文件操作系統調用(如?open、read、write、close?等)對設備進行操作。這種統一的接口設計使得設備操作與普通文件操作一致,簡化了編程模型。
2.?設備管理:Unix I/O接口
Linux提供了一系列標準的Unix I/O接口,用于對文件和設備進行操作。以下是一些關鍵的I/O系統調用及其作用:
基本I/O系統調用
open:打開文件或設備。通過指定路徑和標志,返回一個文件描述符。
read:從文件或設備中讀取數據。通過文件描述符讀取指定數量的字節到緩沖區。
write:向文件或設備寫入數據。通過文件描述符從緩沖區寫入指定數量的字節。
close:關閉文件或設備。釋放文件描述符和相關資源。
8.2 簡述Unix IO接口及其函數
8.2.1Unix IO接口
Unix I/O接口為一種重要的系統編程基礎,提供了一組用于文件和設備操作的系統調用,使程序可以進行文件讀寫、設備控制和數據傳輸。
8.2.2函數
1.?open
功能:打開文件或設備,返回一個文件描述符。
返回值:成功時返回文件描述符,失敗時返回 -1 并設置?errno。
2.?read
功能:從文件或設備中讀取數據。
返回值:成功時返回讀取的字節數,失敗時返回 -1 并設置?errno。
3.?write
功能:向文件或設備寫入數據。
返回值:成功時返回寫入的字節數,失敗時返回 -1 并設置?errno。
4.?close
功能:關閉文件或設備。
返回值:成功時返回 0,失敗時返回 -1 并設置?errno。
5.?lseek
功能:在文件中移動文件偏移量(文件指針)。
返回值:成功時返回新的文件偏移量,失敗時返回 -1 并設置?errno。
6.?stat?和?fstat
功能:獲取文件或設備的狀態信息。
返回值:成功時返回 0,失敗時返回 -1 并設置?errno。
7.?ioctl
功能:設備控制操作。
返回值:成功時返回 0,失敗時返回 -1 并設置?errno。
8.3 printf的實現分析
Printf函數:
Printf函數的代碼中,va_list arg = (va_list)((char*)(&fmt) + 4)表示獲取第一個參數(((char*)(&fmt指向第一個參數) + 4),這句代碼目的是讓argv指向第一個字符串;
第二句的作用是格式化,并返回要打印的字符串的長度;
第三句的作用是調用write函數將buf的前i個字符輸出到終端,調用了unix I/O。
Vsprintf函數:
從vsprintf生成顯示信息,到write系統函數,到陷阱-系統調用 int 0x80或syscall等.
字符顯示驅動子程序:從ASCII到字模庫到顯示vram(存儲每一個點的RGB顏色信息)。
顯示芯片按照刷新頻率逐行讀取vram,并通過信號線向液晶顯示器傳輸每一個點(RGB分量)。
8.4 getchar的實現分析
Getchar函數:
異步異常-鍵盤中斷的處理:鍵盤中斷處理子程序。接受按鍵掃描碼轉成ascii碼,保存到系統的鍵盤緩沖區。
getchar等調用read系統函數,通過系統調用讀取按鍵ascii碼,直到接受到回車鍵才返回。(當緩沖區非空時,不會調用read函數,而是簡單的返回緩沖區最前面的元素。)
8.5本章小結
本章介紹了Linux的I/O設備的基本概念和管理方法,以及Unix I/O接口及其函數。最后分析了printf函數和getchar函數的工作過程。
(第8章1分)
結論
1. 編寫源代碼
編寫:程序員使用文本編輯器編寫C語言源代碼,保存為一個.c文件。
工具:文本編輯器。
輸出:C語言源文件。
2. 預處理
過程:預處理器將源代碼中的預處理指令處理掉。
工具:預處理器(通常與編譯器集成)。
輸出:預處理后的源代碼(通常仍是文本形式,但展開了所有的宏和頭文件)。
3. 編譯
過程:編譯器將預處理后的源代碼翻譯成匯編代碼。
工具:編譯器。
輸出:匯編代碼文件。
4. 匯編
過程:匯編器將匯編代碼轉換成機器代碼,生成目標文件。
工具:匯編器。
輸出:目標文件,包含機器指令和數據,但尚未鏈接。
5. 鏈接
過程:鏈接器將一個或多個目標文件和庫文件鏈接在一起,生成可執行文件。
工具:鏈接器。
輸出:可執行文件。
6. 加載
過程:操作系統加載器將可執行文件從磁盤加載到內存中,準備執行。
工具:操作系統加載器。
輸出:在內存中的可執行映像,準備執行。
7. 執行
過程:處理器開始執行加載到內存中的程序指令。
工具:處理器(CPU)。
輸出:運行中的程序。程序在執行過程中可能會進行多種操作,如內存分配、I/O操作、系統調用等。
8. 終止
過程:程序執行完畢,或者被中斷。操作系統回收程序使用的資源。
工具:操作系統。
輸出:程序的最終輸出結果(如顯示在終端上的信息、生成的文件等),以及操作系統資源的回收。
感悟:
計算機系統是現代技術的奇跡,其復雜的層次結構從硬件到軟件無縫協作,展現了人類智慧的結晶。從處理器的計算、內存的管理,到操作系統的調度,都體現了對計算高效性和可靠性的追求。通過學習計算機系統,我們理解了hello在計算機中從誕生至終止的歷程,也對計算機本身從硬件到軟件有了一個更深刻的理解。理解和掌握計算機系統,不僅是技術進步的關鍵,更是探索和創新的動力源泉。
(結論0分,缺失 -1分,根據內容酌情加分)
附件
列出所有的中間產物的文件名,并予以說明起作用。
1.hello.c:源程序
????????2.hello.i:預處理后的文本文件
????????3.hello.s:編譯后的匯編文件
????????4.hello.o:匯編后的可重定位目標文件
????????5.hello:鏈接后的可執行目標文件
(附件0分,缺失 -1分)
參考文獻
為完成本次大作業你翻閱的書籍與網站等
[1] ?林來興.?空間控制技術[M].?北京:中國宇航出版社,1992:25-42.
[2] ?辛希孟.?信息技術與信息服務國際研討會論文集:A集[C].?北京:中國科學出版社,1999.
[3] ?趙耀東. 新時代的工業工程師[M/OL]. 臺北:天下文化出版社,1998?[1998-09-26]. http://www.ie.nthu.edu.tw/info/ie.newie.htm(Big5).
[4] ?諶穎. 空間交會控制理論與方法研究[D]. 哈爾濱:哈爾濱工業大學,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.
(參考文獻0分,缺失 -1分)