日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

程序人生:hello程序的P2P

發布時間:2023/12/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 程序人生:hello程序的P2P 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

計算機科學與技術學院

2021年5月

摘 ?要

本論文中,我們通過跟蹤hello程序的生命周期來開始對系統的學習——從它被程序員創建開始,到在系統上運行,輸出簡單的消息,然后終止。我們將沿著這個程序的生命周期,簡要地介紹一些逐步出現的關鍵概念、專業術語和組成部分。

摘要是論文內容的高度概括,應具有獨立性和自含性,即不閱讀論文的全文,就能獲得必要的信息。摘要應包括本論文的目的、主要內容、方法、成果及其理論與實際意義。摘要中不宜使用公式、結構式、圖表和非公知公用的符號與術語,不標注引用文獻編號,同時避免將摘要寫成目錄式的內容介紹。

關鍵詞:hello world;計算機;生命周期。?????????????????????????

(摘要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本章小結

結論

附件

參考文獻


第1章 概述

1.1 Hello簡介

P2P,即from program to process,意思是hello程序從源程序hello.c開始,由預處理器預處理后得到修改后的源程序hello.i,再由編譯器編譯后得到匯編程序hello.s,再由匯編器進行匯編后得到可重定位目標程序hello.o,再由鏈接器把hello.o和包括printf.o等庫函數合并得到可執行的目標程序hello。這時我們再shell中輸入./hello,這時shell開啟一個進程運行這個程序。

020,即zero to zero,意思是在shell中輸入./hello后,shell加載并運行hello,它執行一系列指令來加載可執行的hello文件,這些指令將hello目標中的代碼和數據從磁盤復制到主存。操作系統內核會執行系統調用以進行上下文切換,在完成hello程序后要回收進程,此后hello運行期間的相關數據就被刪除了。

根據Hello的自白,利用計算機系統的術語,簡述Hello的P2P,020的整個過程。

1.2 環境與工具

軟件環境:X64 CPU;2.30GHz;16.0G RAM;512G Disk

硬件環境:Windows 10 64位;Vmware Workstation 16Pro;Ubuntu 21.10

開發與調試工具:VScode 64位;edb。

列出你為編寫本論文,折騰Hello的整個過程中,使用的軟硬件環境,以及開發與調試工具。

1.3 中間結果

使用了Hello.i研究預處理,使用了hello.s研究編譯,使用了hello.o研究匯編,使用了hello研究鏈接,其它全部過程在shell-terminal-bash中產生。

列出你為編寫本論文,生成的中間結果文件的名字,文件的作用等。

1.4 本章小結

在本章中對hello進行了簡介,即解釋了P2P和020的含義,列舉了本論文中使用的軟硬件環境以及開發與調試工具,列出了為編寫本論文生成的中間結果文件的名字和文件的作用。

(第1章0.5分)


第2章 預處理

2.1?預處理的概念與作用

預處理階段:預處理器根據以字符#開頭的命令,修改原始的C程序。比如hello.c中#include<stdio.h>命令告訴預處理讀取系統頭文件stdio.h的內容,并把它直接插入程序文本中,得到hello.i的文件。

2.2在Ubuntu下預處理的命令

命令:linux>cpp hello.c hello.i

應截圖,展示預處理過程!

2.3 Hello的預處理結果解析

打開hello.i,發現預處理器讀取了標準輸入輸出庫#include <stdio.h>、UNIX系統服務庫#include <unistd.h> 、C語言標準庫#include <stdlib.h>三個頭文件,并把它們遞歸展開得到所有相關文件,全部插入到hello.i中。

在hello.i的最后,是源程序hello.c的內容。

2.4 本章小結

本章中介紹了預處理的概念與作用,給出了預處理的命令并進行了操作,并對hello的與處理結果hello.i進行了分析。

(第2章0.5分)


第3章 編譯

3.1 編譯的概念與作用

編譯階段:編譯器將文本文件hello.i翻譯成文本文件hello.s,它包含一個匯編語言程序,該程序包含函數main的定義,定義中以一種文本格式描述低級機器語言指令。

注意:這兒的編譯是指從 .i 到 .s 即預處理后的文件到生成匯編語言程序

3.2 在Ubuntu下編譯的命令

命令:linux>gcc -S hello.i

應截圖,展示編譯過程!

3.3 Hello的編譯結果解析

如圖是.s文件的開頭:.file “hello.c”指匯編來源的源文件是hello.c。.text指代碼段標識符代碼從以下開始,這里的第一個后面沒有代碼。.section .rodata指定義了一個只讀數據段。.align 8指數據以8為邊界進行對齊。.LCn指局部常量,在這里分別定義了"用法: Hello 學號 姓名 秒數!\n"和"Hello %s %s\n"兩個字符串。這里的第二個.text指從后面開始就是代碼段了。.globl main指定義了一個全局符號main,其他文件都可以調用它。.type main, @function指把全局符號main的類型定義為function。

3.3.1 數據

3.3.1.1 變量

在main中,argc是第一個傳入的整型參數,在這里又被存到距棧頂20字節的內存處。

*argv[]是第二個傳入的整型參數,在這里被存到距棧頂32字節的內存處。

變量i是一個整型的臨時變量,這里可以看到它存儲在距棧頂4字節處。

在循環體中可以看到,數組變量argv[]被存在內存中棧,由*argv[]作為索引,這里在使用中argv[1]加載到%rsi,argv[2]加載到%rdx,argv[3]加載到%rax。

3.3.1.2常量

在開頭部分可以看到,"用法: Hello 學號 姓名 秒數!\n"和"Hello %s %s\n"兩個字符串常量被編譯器放在只讀區域。

如圖的$n類常數以立即數的形式出現。

3.3.2操作

3.3.2.1賦值op

用mov指令實現。

3.3.2.2算術運算op

如圖,使用add指令實現i=i+1。

3.3.2.3關系op

如圖實現了判斷i<8,由于i是從零開始每次迭代加一,所以只需判斷i是否等于7即可得到循環是否應該繼續。

3.3.2.4數組op

如圖實現了對argv[1]和argv[2]的訪問,以argv[1]為例:由之前已知argv數組的指針*argv[]存在-32(%rbp)中,這里先訪問-32(%rbp)得到argv[0]的位置存在%rax中,%rax+8得到argv[1]的位置,再訪問argv[1]存在%rax中。

3.3.2.5控制轉移

  • if
  • 如圖實現了if(argc!=4),對比-20(%rbp)中存儲的argc是否等于4,如果不等于就順序執行je下面一條的操作,如果等于就向下跳轉到L2代碼段。

  • for
  • 如圖實現了for(i=0;i<8;i++)中的循環判斷語句,由于i是從零開始每次迭代加一,所以只需判斷i是否等于7即可得到循環是否應該繼續,如果等于就順序執行jle下面一條的操作,如果不等于就向上跳轉回到L4代碼段。

    3.3.2.6函數操作

  • main函數
  • 如圖,main函數的第一個參數argc存在%rdi中,隨后存入棧-20(%rbp)中,第二個參數*argv[]存在%rsi中,隨后存入棧-32(%rbp)中。main作為主函數由系統調用。

    如圖,返回值0存在%rax中。

  • puts函數
  • 如圖實現傳遞puts所需的參數并調用puts函數。argv[1]和argv[2]存在棧中,常量LC0作為第一個參數存在%rdi中。

  • exit函數
  • 如圖實現傳遞exit所需的參數并調用exit函數,第一個參數1存在%rdi中。

  • printf函數
  • 如圖實現傳遞printf所需的參數并調用printf函數,argv[1]和argv[2]存在棧中,LC1作為第一個參數存在%rdi中。

  • atoi函數
  • 如圖實現傳遞atoi所需的參數并調用atoi函數,argv[3]作為第一個參數存在%rdi中。

  • sleep函數
  • 如圖實現傳遞sleep所需的參數并調用sleep函數,atoi函數返回的存在%eax中的值賦到%rdi中,作為第一個參數。

  • getchar函數
  • 如圖,getchar函數沒有參數,直接調用。

    此部分是重點,說明編譯器是怎么處理C語言的各個數據類型以及各類操作的。應分3.3.1~ 3.3.x等按照類型和操作進行分析,只要hello.s中出現的屬于大作業PPT中P4給出的參考C數據與操作,都應解析。

    3.4 本章小結

    本章中介紹了編譯的概念與作用,給出了編譯的命令并進行了操作,并對hello的處理結果hello.s中的數據和操作進行了分析。

    (第3章2分)


    第4章 匯編

    4.1 匯編的概念與作用

    匯編階段:匯編器將hello.s翻譯成機器語言指令,把這些指令打包成一種叫做可重定向目標程序的格式,并將結果保存在目標文件hello.o中。hello.o文件是一個二進制文件,它包含函數main的指令編碼。

    注意:這兒的匯編是指從 .s 到 .o 即編譯后的文件到生成機器語言二進制程序的過程。

    4.2 在Ubuntu下匯編的命令

    命令:linux>gcc -c hello.s

    (以下格式自行編排,編輯時刪除)

    應截圖,展示匯編過程!

    4.3 可重定位目標elf格式

    輸入linux>readelf -a hello.o,獲取了如下一系列圖所示的hello.o的信息。

    如上圖,是ELF頭,它以一個16字節序列開始,這個序列描述了生成該文件的系統的字的大小和字節順序,剩下的部分包含幫助鏈接器語法分析和解釋目標文件的信息。

    如上圖,是節頭部表,它描述了ELF文件中各個節的信息。

    如上圖,是存儲代碼中可重定位條目的.rel.text節。

    如上圖,是en_frame可重定位條目的.rel.en_frame節。

    其中ELF重定位條目的格式如下圖:

    最后如下圖是一個符號表.symtab條目,其中存放在程序中定義和引用的函數和全局變量的信息。

    ????分析hello.o的ELF格式,用readelf等列出其各節的基本信息,特別是重定位項目分析。

    4.4 Hello.o的結果解析

    在shell中輸入給定指令,生成如下圖信息:

    把反匯編結果與hello.o進行對比,可以看到如下差異:

  • 經匯編后操作數從10進制變成16進制。
  • 經匯編后進行函數調用時會直接列出函數對應的重定位條目。
  • 經匯編后進行控制轉移即實現跳轉指令時會直接列出跳轉代碼段的相對位置。
  • 經匯編后在訪問全局變量時,由于需要重定位,所以生成匯編代碼時直接把訪問的參數清0,并生成重定位條目。
  • objdump -d -r hello.o ?分析hello.o的反匯編,并請與第3章的 hello.s進行對照分析。

    說明機器語言的構成,與匯編語言的映射關系。特別是機器語言中的操作數與匯編語言不一致,特別是分支轉移函數調用等。

    4.5 本章小結

    本章中介紹了匯編的概念與作用,給出了按照匯編命令進行操作后的結果的返匯編信息與.s文件的對比圖,介紹了ELF文件的信息,并對匯編處理后得到的.o文件中相對.s文件進行對比。

    (第4章1分)


    5鏈接

    5.1 鏈接的概念與作用

    鏈接階段:例如在本論文中討論的hello程序中,調用了printf函數,它是每個C編譯器都提供的標準C庫中的一個函數。printf函數存在于一個名為printf.o的單獨的預編譯好了的目標文件中,而這個文件必須以某種方式合并到hello.o的程序中。鏈接器就負責處理這種合并。結果就得到一個hello文件,它是一個可執行目標文件,可以被加載到內存中,由系統執行。

    注意:這兒的鏈接是指從 hello.o 到hello生成過程。

    5.2 在Ubuntu下鏈接的命令

    命令:linux>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

    (以下格式自行編排,編輯時刪除)

    使用ld的鏈接命令,應截圖,展示匯編過程! 注意不只連接hello.o文件

    5.3 可執行目標文件hello的格式

    輸入linux>readelf -a hello,獲取了如下一系列圖所示的hello的信息。

    如上圖所示,hello中的ELF頭hello.o中的一樣。

    如上圖所示,是hello中的段頭部表,ELF可執行文件被設計得很容易加載到內存,可執行文件的連續的片被映射到連續的內存段,程序頭部表描述了這種映射關系。

    總結ELF可執行目標文件的特點是:ELF頭描述文件的總體格式。它還包括程序的入口點,也就是當程序運行時要執行的第一條指令的地址。.text、.rodata和.data節與可重定位目標文件中的節是相似的,除了這些節已經被重定位到它們最終運行是內存地址以外。.init節定義了一個小函數,叫做_init,程序的初始化代碼會調用它。因為可執行文件是完全鏈接的,或已被重定位的,所以它不再需要.rel節。

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

    5.4 hello的虛擬地址空間

    如上圖,使用edb加載hello,查看data dump,可以看到hello的數據從地址0x400000開始,最開始的部分是ELF頭。

    如上圖,從0x4002e0開始對應5.3中的節頭部表。

    查看SymbolViewer,可以看到hello中的函數符號對應5.3中的符號表。

    使用edb加載hello,查看本進程的虛擬地址空間各段信息,并與5.3對照分析說明。

    5.5 鏈接的重定位過程分析

    輸入命令objdump -d -r hello,得到hello的反匯編信息,如下圖所示。

    如下圖,相比于hello.o,hello的文件中增加了用于程序初始化代碼的.init節,實現延遲綁定機制的.plt節(這里提到的延遲綁定機制是一種更高級的連接機制)和包含庫函數的.plt.sec節。

    .init節

    .plt節

    .plt.sec節

    如下圖,hello中指令的地址已經從相對偏移地址變成了虛擬地址。

    以上這些變化都說明了在重定位中合并了所有的節,保證所有符號在虛擬內存中有相應的地址,當然,這么說并不嚴謹,因為可以看到處理器使用了延遲綁定機制。并且對所有符號進行了重定位。

    objdump -d -r hello 分析hello與hello.o的不同,說明鏈接的過程。

    結合hello.o的重定位項目,分析hello中對其怎么重定位的。

    5.6 hello的執行流程

    如下表所示,hello執行是先運行了兩段存儲在地址很大的棧底代碼來加載hello的程序,然后分別運行了存儲在低地址棧底的表中的各個程序。

    程序名

    程序地址

    用于加載hello的程序

    0x7f3fcc2950d0

    用于加載hello的程序

    0x7f3fcc2a5b70

    hello!_start

    0x4010f0

    hello!main

    hello!puts@plt

    0x401125

    0x401030

    hello!printf@plt

    0x401040

    hello!atoi@plt

    0x401060

    hello!sleep@plt

    0x401080

    hello!getc@plt

    0x401050

    使用edb執行hello,說明從加載hello到_start,到call main,以及程序終止的所有過程。請列出其調用與跳轉的各個子程序名或程序地址。

    5.7 Hello的動態鏈接分析

    程序在調用一個由共享庫定義的函數,編譯器沒有辦法預測這個函數的運行時地址,因為它的共享模塊在運行時可以加載到任意位置。GNU編譯系統使用了一種稱為延遲綁定的技術,將過程地址的綁定推遲到第一次調用該過程。延遲綁定通過GOT和PLT兩個數據結構實現,PLT條目負責跳轉到動態鏈接器調用函數,GOT條目中包含了動態鏈接器在解析函數地址時會使用的信息。如下圖,在節頭部表中找到了GOT,就是圖中的.got.plt。

    如下圖,是dl_init前的GOT中的信息,可以看到GOT中還未加載解析函數地址的信息。

    如下圖,是dl_init后的GOT中的信息,可以看到此時GOT中已經包含了相關的信息。

    分析hello程序的動態鏈接項目,通過edb調試,分析在dl_init前后,這些項目的內容變化。要截圖標識說明。

    5.8 本章小結

    本章中介紹了鏈接的概念與作用,給出了按照鏈接命令進行操作后的結果,分析了可執行目標文件hello的格式,使用edb加載了hello并觀察了其虛擬地址空間,對hello進行反匯編并分析了鏈接的重定位過程,使用edb運行了hello以觀察hello的執行流程,最后觀察dl_init前后GOT表中信息的變化。

    (第5章1分)


    6hello進程管理

    6.1 進程的概念與作用

    進程的定義是一個執行中程序的實例。進程的主要作用是提供給應用程序關鍵抽象:①一個獨立的邏輯控制流,它提供了一個假象,好像我們的程序獨占地使用處理器。②一個私有的地址空間,它提供一個假象,好像我們的程序獨占地使用內存系統。

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

    shell就是一個交互型應用級程序,它提供了一個應用界面,讓用戶可以通過這個界面訪問操作系統內核的服務。

    處理流程是執行一系列的讀/求值步驟,然后終止。讀步驟讀取來自用戶的一個命令行。求值步驟解析命令行,并代表用戶運行程序。

    6.3 Hello的fork進程創建過程

    父進程通過調用fork函數創建一個新的運行的子進程。新創建的子進程幾乎但不完全與父進程相同。子進程得到與父進程用戶級虛擬地址空間相同的一份副本,包括代碼和數據段、堆、共享庫以及用戶棧。子進程還獲得與父進程任何打開文件描述符相同的副本,這就意味著當父進程調用fork時,子進程可以讀寫父進程中打開的任何文件。

    6.4 Hello的execve過程

    execve函數在當前進程的上下文中加載并運行一個新程序。execve函數加載并運行可執行目標文件,且帶參數列表argv和環境變量列表envp。只有當出現錯誤時,例如找不到filename,execve才會返回到調用程序。

    6.5 Hello的進程執行

    內核為每個進程維持一個上下文。上下文就是內核重新啟動一個被搶占的進程所需的狀態。它由一些對象的值組成,這些對象包括通用目的寄存器、浮點寄存器、程序計數器、用戶棧、狀態寄存器、內核棧和各種內核數據結構。一個進程執行它的控制流的一部分的每一時間段叫做時間片。當設置了模式位時,進程就運行在內核模式中,此時進程可以執行指令集中的任何指令,并且可以訪問系統中的任何內存位置。

    當hello開始運行時,處于用戶模式,等到執行到sleep指令后,內核進行上下文切換進入內核模式。當sleep函數休眠時間到了,內核又進行上下文切換進入用戶模式,執行下面的指令。

    結合進程上下文信息、進程時間片,闡述進程調度的過程,用戶態與核心態轉換等等。

    6.6 hello的異常與信號處理

    1.如下圖,程序運行中不輸入,程序運行結束后進程被回收,按回車鍵返回。

    2.如下圖,程序運行時按回車,在shell中輸入換行,程序執行結束后立即返回,并且回車輸入的\n信息又作用到shell上。

    3.如下圖,程序運行時輸入Ctrl+Z,發送了SIGINT信號,掛起hello進程,進程從前臺轉入后臺并暫停。

    輸入ps -l,顯示當前進程狀態,可以看到hello處于停止狀態。

    輸入jobs,查看當前終端放入后臺的工作,可以看到hello已轉入后臺并停止。

    輸入pstree,可以找到當前在終端中打開的hello和pstree。

    輸入fg,把后臺命令恢復在前臺執行,可以看到hello繼續執行直至結束。

    如下圖,輸入Ctrl+Z暫停后,ps查看hello的PID,使用kill命令殺死hello進程,再使用fg恢復執行,發現hello進程已經被殺死了,無法恢復。

    hello執行過程中會出現哪幾類異常,會產生哪些信號,又怎么處理的。

    程序運行過程中可以按鍵盤,如不停亂按,包括回車,Ctrl-Z,Ctrl-C等,Ctrl-z后可以運行ps ?jobs ?pstree ?fg ?kill 等命令,請分別給出各命令及運行結截屏,說明異常與信號的處理。

    6.7本章小結

    本章中,介紹了進程的概念與作用,簡述了殼shell-bash的作用與處理流程,解釋了hello的fork和execve的過程,描述了hello的進程執行,根據不同輸入分析了異常與信號處理。

    (第6章1分)


    7hello的存儲管理

    7.1 hello的存儲器地址空間

    hello的邏輯地址指的是hello.o文件中的段的偏移地址。線性地址指的是hello文件中從邏輯地址到物理地址變換的中間層。虛擬地址就是hello程序訪問寄存器所使用的邏輯地址。物理地址就是hello程序在存儲器里以字節為單位存儲信息,為正確地存放或取得信息,每一個字節單元給以一個唯一的存儲器地址。

    結合hello說明邏輯地址、線性地址、虛擬地址、物理地址的概念。

    7.2 Intel邏輯地址到線性地址的變換-段式管理

    hello程序的邏輯地址由段選擇符和偏移量兩個量組成,而hello程序的線性地址由每個段的首地址與邏輯地址中的偏移量兩個量組成。段式管理就是通過段選擇符訪問段描述符表找到對應的段描述符,然后從段描述符中獲得段首地址,再與邏輯地址中的偏移量相加,就得到了線性地址。

    7.3 Hello的線性地址到物理地址的變換-頁式管理

    MMU利用頁表來實現這種映射。CPU中的一個控制寄存器,頁表寄存器指向當前頁表。n位的虛擬地址包含兩個部分:一個p位的虛擬頁面偏移和一個(n-p)位的虛擬頁號。MMU利用VPN來選擇適當的PTE。將頁表條目中物理頁號和虛擬地址中的VPO串聯起來,就得到相應的地址。

    7.4 TLB與四級頁表支持下的VA到PA的變換

    使用k級頁表層次結構的地址翻譯。虛擬地址被劃分成為k個VPN和1個VPO。每個VPN i都是一個到第i個頁表的索引,其中1<=j<=k-1,都指向第j+1級的某個頁表的基址。第k級頁表中的每個PTE包含某個物理頁面的PPN,或者一個磁盤塊的地址。為了構造物理地址,在能夠確定PPN之前,MMU必須訪問k個PTE。對于只有一級的頁表結構,PPO和VPO是相同的。

    7.5 三級Cache支持下的物理內存訪問

    當一個Linux進程在運行時,雖然Core i7體系結構允許頁表換進換出,但是與已分配了的頁相關聯的頁表都是駐留在內存中的。CR3控制寄存器指向第一級頁表L1的起始位置。CR3的值是每個進程上下文切換時,CR3的值都會被恢復。

    7.6 hello進程fork時的內存映射

    當hello進程調用 fork 函數時,內核會為新進程創建各種數據結構并為其分配唯一的 PID。 為了hello進程創建虛擬內存,內核會創建當前進程的區域結構和頁表的未觸及副本,將兩個進程中的頁面標記為只讀。當 fork 在新的進程中返回時,新進程的虛擬內存現在與調用 fork 時存在的虛擬內存完全相同。當兩個進程中的任何一個稍后寫入時,寫時復制機制會創建新頁面,從而為每個進程維護一個私有地址空間的抽象。

    7.7 hello進程execve時的內存映射

    execve 函數在當前進程中加載并運行可執行目標文件 hello 中包含的文件。

    7.8 缺頁故障與缺頁中斷處理

    在虛擬內存的習慣說法中,DRAM緩存不命中成為缺頁。缺頁異常調用內核中的缺頁異常處理程序,該程序會選擇一個犧牲頁,如果它已經被修改了,那么內核就會將它復制回磁盤。當異常處理程序返回時,它會重新啟動導致缺頁的指令。

    7.9動態存儲分配管理

    分配器又兩種基本風格。顯式分配器,要求應用顯式地釋放任何已分配的塊。hello標準庫提供一種叫做malloc程序包的顯示分配器。hello程序通過調用malloc函數來分配一個塊,并通過調用free函數來釋放一個塊。隱式分配器,要求分配器檢測一個已分配塊何時不再被程序所使用,那么就釋放這個塊。

    Printf會調用malloc,請簡述動態內存管理的基本方法與策略。

    7.10本章小結

    本章中,介紹了hello的存儲器地址空間,段式管理和頁式管理,解釋了TLB與四級頁表支持下的VA到PA的變換,和三級Cache支持下的物理內存訪問,描述了hello進程fork和execve時的內存映射,最后介紹了缺頁故障與缺頁中斷處理,和動態存儲分配管理。

    (第7章 2分)


    結論

    計算機系統是由硬件和軟件系統組成的,它們共同協作以運行應用程序。計算機內部的信息被表示為一組組的位,它們依據上下文有不同的解釋方式。程序被其他程序翻譯成不同的形式,開始時是ASCII文本,然后被編譯器和鏈接器翻譯成二進制可執行文件。操作系統內核是應用程序和硬件之間的媒介。它提供三個基本的抽象:①文件是對I/O設備的抽象;②虛擬內存是對主存和磁盤的抽象;③進程是處理器、主存和I/O設備的抽象。

    用計算機系統的語言,逐條總結hello所經歷的過程。

    你對計算機系統的設計與實現的深切感悟,你的創新理念,如新的設計與實現方法。

    (結論0分,缺失 -1分,根據內容酌情加分)


    附件

    使用了Hello.i研究預處理,使用了hello.s研究編譯,使用了hello.o研究匯編,使用了hello研究鏈接,其它全部過程在shell-terminal-bash中產生。

    列出所有的中間產物的文件名,并予以說明起作用。

    (附件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.

    [7] 深入理解計算機系統

    [8] CSDN網站博客:https://blog.csdn.net/stardtx/article/details/7452210

    (參考文獻0分,缺失 -1分)

    總結

    以上是生活随笔為你收集整理的程序人生:hello程序的P2P的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。