計算機系統(tǒng)導論 課件 第八章程序的加載和執(zhí)行_第1頁
計算機系統(tǒng)導論 課件 第八章程序的加載和執(zhí)行_第2頁
計算機系統(tǒng)導論 課件 第八章程序的加載和執(zhí)行_第3頁
計算機系統(tǒng)導論 課件 第八章程序的加載和執(zhí)行_第4頁
計算機系統(tǒng)導論 課件 第八章程序的加載和執(zhí)行_第5頁
已閱讀5頁,還剩47頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第八章程序的加載和執(zhí)行

可執(zhí)行文件的加載

進程的上下文切換

程序的執(zhí)行與CPU基本組成

程序的執(zhí)行機制主要教學目標理解程序和進程概念的不同了解Linux中如何表示進程的存儲器映射了解程序的加載過程了解進程的上下文信息及其上下文切換了解程序和指令的執(zhí)行過程了解內(nèi)部異常和外部中斷的基本概念了解CPU的主要功能和基本組成程序的執(zhí)行機制分以下兩個部分介紹第一講:進程和可執(zhí)行文件的加載程序和進程的概念進程的存儲器映射程序的加載過程進程的邏輯控制流進程的上下文切換第三講:程序的執(zhí)行與CPU基本組成程序及指令的執(zhí)行過程內(nèi)部異常和外部中斷的基本概念CPU的基本功能和基本組成“程序”和“進程”進程是OS對CPU執(zhí)行的程序的運行過程的一種抽象。進程有自己的生命周期,它由于任務的啟動而創(chuàng)建,隨著任務的完成(或終止)而消亡,它所占用的資源也隨著進程的終止而釋放。一個可執(zhí)行目標文件(即程序)可被加載執(zhí)行多次,也即,一個程序可能對應多個不同的進程。例如,用word程序編輯一個文檔時,相應的用戶進程就是winword.exe,如果多次啟動同一個word程序,就得到多個winword.exe進程,處理不同的數(shù)據(jù)。程序(program)指按某種方式組合形成的代碼和數(shù)據(jù)集合,代碼即是機器指令序列,因而程序是一種靜態(tài)概念。進程(process)指程序的一次運行過程。更確切說,進程是具有獨立功能的一個程序關(guān)于某個數(shù)據(jù)集合的一次運行活動,因而進程具有動態(tài)含義。同一個程序處理不同的數(shù)據(jù)就是不同的進程進程的概念操作系統(tǒng)(管理任務)以外的都屬于“用戶”的任務。計算機處理的所有“用戶”的任務由進程完成。為強調(diào)進程完成的是用戶的任務,通常將進程稱為用戶進程。計算機系統(tǒng)中的任務通常就是指進程。例如,Linux內(nèi)核中通常把進程稱為任務,每個進程主要通過一個稱為進程描述符(processdescriptor)的結(jié)構(gòu)來描述,其結(jié)構(gòu)類型定義為task_struct,包含了一個進程的所有信息。所有進程通過一個雙向循環(huán)鏈表實現(xiàn)的任務列表(tasklist)來描述,任務列表中每個元素是一個進程描述符。IA-32中的任務狀態(tài)段(TSS)、任務門(taskgate)等概念中所稱的任務,實際上也是指進程。

引入“進程”的好處“進程”的引入為應用程序提供了以下兩方面的抽象:一個獨立的邏輯控制流每個進程擁有一個獨立的邏輯控制流,使得程序員以為自己的程序在執(zhí)行過程中獨占使用處理器一個私有的虛擬地址空間每個進程擁有一個私有的虛擬地址空間,使得程序員以為自己的程序在執(zhí)行過程中獨占使用存儲器進程”的引入簡化了程序員的編程以及語言處理系統(tǒng)的處理,即簡化了編程、編譯、鏈接、共享和加載等整個過程。IA-32/x86-64+Linux平臺下,每個進程具有獨立的私有地址空間(虛擬地址空間)每個進程的虛擬地址空間劃分(即存儲映像)布局相同進程的地址空間用戶級上下文系統(tǒng)級上下文TSSLinux將虛存空間組織成“區(qū)域”的集合pgd:全局頁目錄地址vm_prot:訪問權(quán)限vm_flags:映射對象的類型vm_nextvm_nexttask_structmm_structpgdmmmmapvm_area_structvm_endvm_protvm_startvm_endvm_protvm_startvm_endvm_protvm_nextvm_startProcess

virtual

memoryTextDataShared

libraries0vm_flagsvm_flagsvm_flagstask_struct是某個進程(即任務)所有相關(guān)信息的描述結(jié)構(gòu)(稱進程描述符),其中mm是其虛擬空間的描述結(jié)構(gòu)進程的存儲器映射存儲器映射(memorymapping)是指將進程虛擬地址空間中的一個區(qū)域與硬盤上的一個對象建立關(guān)聯(lián)(生成頁表項),并初始化一個vm_area_struct結(jié)構(gòu)信息可用mmap()函數(shù)實現(xiàn)存儲器映射void*mmap(void*start,size_tlength,intprot,intflags,intfd,off_toffset);如何獲得mmap函數(shù)的實參?讀取可執(zhí)行文件中的程序頭表而獲得實參!進程的存儲器映射可用mmap()函數(shù)實現(xiàn)存儲器映射void*mmap(void*start,size_tlength,intprot,intflags,intfd,off_toffset);功能:將指定文件fd中偏移量offset開始的長度為length個字節(jié)的一塊信息映射到虛擬空間中起始地址為start、長度為length個字節(jié)的一塊區(qū)域,得到vm_area_struct結(jié)構(gòu)的信息,并生成相應頁表項,建立文件地址和區(qū)域之間的映射關(guān)系。prot指定該區(qū)域內(nèi)頁面的訪問權(quán)限位,對應vm_area_struct結(jié)構(gòu)中的vm_prot字段PROT_EXE:頁面內(nèi)容由指令組成PROT_READ:區(qū)域內(nèi)頁面可讀PROT_WRITE:區(qū)域內(nèi)頁面可寫PROT_NONE:區(qū)域內(nèi)頁面不能被訪問flags指定所映射的對象的類型,對應vm_area_struct結(jié)構(gòu)中的vm_flags字段MAP_PRIVATE:私有的寫時拷貝對象,對應可執(zhí)行文件中只讀代碼區(qū)域(.init、.text.rodata)和已初始化數(shù)據(jù)區(qū)域(.data)MAP_SHARED:共享對象,對應共享庫文件中的信息MAP_ANON:請求0的頁,對應內(nèi)核創(chuàng)建的匿名文件,相應頁框用0覆蓋并駐留內(nèi)存MAP_PRIVATE|MAP_ANON:未初始化數(shù)據(jù)(.bss)、堆和用戶棧等對應區(qū)域虛頁第一次被裝入內(nèi)存后,不管是用普通文件還是匿名文件對其進行初始化,以后都是在主存頁框和硬盤中交換文件(swapfile)間進行調(diào)進調(diào)出。交換文件由內(nèi)核管理和維護,稱為交換分區(qū)(swaparea)或交換空間(swapspace)。Linux中虛擬地址空間中的區(qū)域MAP_PRIVATE|MAP_ANONMAP_SHAREDMAP_PRIVATEMAP_PRIVATE|MAP_ANONMAP_PRIVATE|MAP_ANON匿名文件:內(nèi)核創(chuàng)建、無實際磁盤文件,無需從磁盤讀入、對應請求0的頁面普通文件:可執(zhí)行文件和共享庫文件共享庫文件中的共享對象多個進程調(diào)用共享庫文件中的代碼,但共享庫代碼在內(nèi)存和硬盤都只需要一個副本進程1運行過程中,內(nèi)核為共享對象分配若干頁框進程2運行過程中,內(nèi)核只要將進程2對應區(qū)域內(nèi)頁表項中的頁框號直接填上即可一個進程對共享區(qū)域進行的寫操作結(jié)果,對于所有共享同一個共享對象的進程都是可見的,而且結(jié)果也會反映在硬盤上對應的共享對象中所分配的頁框在主存不一定連續(xù),為簡化示意圖,這里圖中所示頁框是連續(xù)的硬盤私有的寫時拷貝對象同一個可執(zhí)行文件對應不同進程時,只讀代碼區(qū)一樣,可讀可寫數(shù)據(jù)區(qū)開始也一樣,但屬于私有對象為節(jié)省主存,多采用寫時拷貝技術(shù)進程1運行過程中,內(nèi)核為對象分配若干頁框,并標記為只讀進程2運行過程中,內(nèi)核只要將進程2對應區(qū)域內(nèi)頁表項中的頁框號直接填上,并標記為只讀若兩個進程都只是讀或執(zhí)行,則在內(nèi)存只有一個副本,節(jié)省主存;若進程2進行寫操作,則發(fā)生訪問違例,此時,內(nèi)核判斷異常原因是進程試圖寫私有的寫時拷貝頁,就會分配一個新頁框,把內(nèi)容拷貝到新頁框,并修改進程2的頁表項所分配的頁框在主存不一定連續(xù),為簡化示意圖,這里圖中所示頁框是連續(xù)的硬盤程序的加載和運行UNIX/Linux系統(tǒng)中,可通過調(diào)用execve()函數(shù)來啟動加載器。execve()函數(shù)的功能是在當前進程上下文中加載并運行一個新程序。execve()函數(shù)的用法如下:

intexecve(char*filename,char*argv[],*envp[]);

filename是加載并運行的可執(zhí)行文件名(如./hello),可帶參數(shù)列表argv和環(huán)境變量列表envp。若錯誤(如找不到指定文件filename),則返回-1,并將控制權(quán)交給調(diào)用程序;若函數(shù)執(zhí)行成功,則不返回,最終將控制權(quán)傳遞到可執(zhí)行目標中的主函數(shù)main。主函數(shù)main()的原型形式如下:

intmain(intargc,char**argv,char**envp);

或者:

intmain(intargc,char*argv[],char*envp[]);

argc指定參數(shù)個數(shù),參數(shù)列表中第一個總是命令名(可執(zhí)行文件名)

例如:命令行為“l(fā)d-otestmain.otest.o”時,argc=5回顧:程序的加載和運行Unix>ld

-otestmain.otest.o若在shell命令行提示符下輸入以下命令行l(wèi)d是可執(zhí)行文件名(即命令名),隨后是命令的若干參數(shù),argv是一個以null結(jié)尾的指針數(shù)組,argc=5在shell命令行提示符后鍵入命令并按“enter”鍵后,便構(gòu)造argv和envp,然后調(diào)用execve()函數(shù)來啟動加載器,最終轉(zhuǎn)main()函數(shù)執(zhí)行intexecve(char*filename,char*argv[],*envp[]);intmain(intargc,char*argv[],char*envp[]);回顧:程序的加載和運行問題:hello程序的加載和運行過程是怎樣的?Step1:在shell命令行提示符后輸入命令:$./hello[enter]Step2:shell命令行解釋器構(gòu)造argv和envpargvargv[0]nullargv[]“./hello"Step3:調(diào)用fork()函數(shù),創(chuàng)建一個子進程,與父進程shell完全相同(只讀/共享),包括只讀代碼段、可讀寫數(shù)據(jù)段、堆以及用戶棧等。Step4:調(diào)用execve()函數(shù),在當前進程(新創(chuàng)建的子進程)的上下文中加載并運行hello程序。將hello中的.text節(jié)、.data節(jié)、.bss節(jié)等內(nèi)容加載到當前進程的虛擬地址空間(僅修改當前進程上下文中關(guān)于存儲映像的一些數(shù)據(jù)結(jié)構(gòu),不從磁盤拷貝代碼和數(shù)據(jù)等內(nèi)容)Step5:調(diào)用hello程序的main()函數(shù),hello程序開始在一個進程的上下文中運行。intmain(intargc,char*argv[],char*envp[]);回顧:可執(zhí)行文件的加載通過調(diào)用execve系統(tǒng)調(diào)用函數(shù)來調(diào)用加載器加載器(loader)根據(jù)可執(zhí)行文件的程序(段)頭表中的信息,將可執(zhí)行文件的代碼和數(shù)據(jù)從磁盤“拷貝”到存儲器中(實際上不會真正拷貝,僅建立一種映像,這涉及到許多復雜的過程和一些重要概念,將在后續(xù)課上學習)加載后,將PC(EIP)設(shè)定指向Entrypoint

(即符號_start處),最終執(zhí)行main函數(shù),以啟動程序執(zhí)行。程序被啟動如$./P調(diào)用fork()以構(gòu)造的argv和envp為參數(shù)調(diào)用execve()execve()調(diào)用加載器進行可執(zhí)行文件加載,并最終轉(zhuǎn)去執(zhí)行main__libc_init_first_initatexitmain_exit_start:ELF文件信息舉例$readelf-hmain

ELFHeader:Magic:7f454c46010101000000000000000000Class:ELF32Data:2'scomplement,littleendianVersion:1(current)OS/ABI:UNIX-SystemVABIVersion:0Type:EXEC(Executablefile)Machine:Intel80386Version:0x1Entrypointaddress:x8048580Startofprogramheaders:52(bytesintofile)Startofsectionheaders:3232(bytesintofile)Flags:0x0Sizeofthisheader:52(bytes)Sizeofprogramheaders:32(bytes)Numberofprogramheaders:8Sizeofsectionheaders:40(bytes)Numberofsectionheaders:29Sectionheaderstringtableindex:26

可執(zhí)行目標文件的ELF頭程序的加載fork、execve等OS內(nèi)核代碼當IA-32/Linux系統(tǒng)開始執(zhí)行main()函數(shù)時,在虛擬地址空間的用戶棧中的結(jié)構(gòu)如左圖所示

intmain(intargc,char*argv[],char*envp[]);shell命令行解釋器A25邏輯控制流t0t1t2t3t4t5t6WordWordIEt7t8對于確定的數(shù)據(jù)集,某進程指令執(zhí)行地址序列是確定的。稱為進程的邏輯控制流。

對于單處理器系統(tǒng),進程會輪流使用處理器,即處理器的物理控制流由多個邏輯控制流組成。

p1的邏輯控制流為A11~A13、A11~A14、A15~A16。在A12處被打斷一次!邏輯控制流不會因被其他進程打斷而改變,還能回到原被打斷的“斷點”處繼續(xù)執(zhí)行。進程p2的邏輯控制流為A21~A22、A23~A25。在A24處被打斷一次!P3未被打斷不同進程的邏輯控制流在時間上交錯或重疊的情況稱為并發(fā)(concurrency)P1和P2、P2和P3是并發(fā)執(zhí)行;P1和P3不是并發(fā)執(zhí)行!

“進程”

與“上下文切換”$./hellohello,world$“$”是shell命令行提示符,說明正在運行shell進程。在一個進程的生命周期中,可能會有其他不同進程在處理器上交替運行!感覺到的運行時間比真實執(zhí)行時間要長!OS通過處理器調(diào)度讓處理器輪流執(zhí)行多個進程。實現(xiàn)不同進程中指令交替執(zhí)行的機制稱為進程的上下文切換(contextswitching)處理器調(diào)度等事件會引起用戶進程正常執(zhí)行被打斷,因而形成異??刂屏?。進程的上下文切換機制很好地解決了這類異??刂屏?,實現(xiàn)了從一個進程安全切換到另一個進程執(zhí)行的過程。

用戶態(tài)

內(nèi)核態(tài)

用戶態(tài)

內(nèi)核態(tài)

用戶態(tài)“進程”

的“上下文”進程的物理實體(代碼和數(shù)據(jù)等)和支持進程運行的環(huán)境合稱為進程的上下文。由進程的程序塊、數(shù)據(jù)塊、運行時的堆和用戶棧(兩者通稱為用戶堆棧)等組成的用戶空間信息被稱為用戶級上下文;由進程標識信息、進程現(xiàn)場信息、進程控制信息和系統(tǒng)內(nèi)核棧等組成的內(nèi)核空間信息被稱為系統(tǒng)級上下文;處理器中各寄存器的內(nèi)容被稱為寄存器上下文(也稱硬件上下文),即進程的現(xiàn)場信息。在進行進程上下文切換時,操作系統(tǒng)把換下進程的寄存器上下文保存到系統(tǒng)級上下文中的現(xiàn)場信息位置。用戶級上下文地址空間和系統(tǒng)級上下文地址空間一起構(gòu)成了一個進程的整個存儲器映像

進程的存儲器映像程序的執(zhí)行機制分以下三個部分介紹第一講:進程和可執(zhí)行文件的加載程序和進程的概念進程的存儲器映射程序的加載過程進程的邏輯控制流進程的上下文切換第二講:程序的執(zhí)行與CPU基本組成程序及指令的執(zhí)行過程內(nèi)部異常和外部中斷的基本概念CPU的基本功能和基本組成程序及指令的執(zhí)行過程程序和指令的關(guān)系程序由一條一條指令組成,指令按順序存放在連續(xù)存儲單元程序的執(zhí)行:周而復始地執(zhí)行一條一條指令正常情況下,指令按其存放順序執(zhí)行遇到需改變程序執(zhí)行流程時,用相應的轉(zhuǎn)移指令(包括無條件轉(zhuǎn)移指令、條件轉(zhuǎn)移指令、調(diào)用指令和返回指令等)來改變程序執(zhí)行流程程序的執(zhí)行流的控制將要執(zhí)行的指令所在存儲單元的地址由程序計數(shù)器PC給出,通過改變PC的值來控制執(zhí)行順序指令周期:CPU取出并執(zhí)行一條指令的時間程序及指令的執(zhí)行過程對于6.4.2中例子#include"stdio.h"#include"string.h"

voidoutputs(char*str)

{charbuffer[16];strcpy(buffer,str);printf("%s\n",buffer);}……intmain(intargc,char*argv[]){outputs(argv[1]);return0;}Strcpy的棧幀main:

……

calloutputsmoveax,………retoutputs:

……

callstrcpy……callprintf……retstrcpy:程序執(zhí)行流:……calloutputs……callstrcpy……callprintf…...retmov%eax,…

……程序及指令的執(zhí)行過程反匯編得到的outputs匯編代碼080483e4:push%ebp080483e5:mov%esp,%ebp080483e7:sub$0x18,%esp080483ea:mov0x8(%ebp),%eax080483ed:mov%eax,0x4(%esp)080483f1:lea0xfffffff0(%ebp),%eax080483f4:mov%eax,(%esp)080483f7:call0x8048330<__gmon_start__@plt+16>080483fc:lea0xfffffff0(%ebp),%eax080483ff:mov%eax,0x4(%esp)08048403:movl$0x8048500,(%esp)0804840a:call0x80483100804840f:leave08048410:ret將strcpy的兩個實參入棧將printf的兩個實參入棧程序及指令的執(zhí)行過程在內(nèi)存存放的指令實際上是機器代碼(0/1序列)08048394<add>:8048394:55push%ebp8048395:89e5mov%esp,%ebp8048397:8b450cmov0xc(%ebp),%eax804839a:034508add0x8(%ebp),%eax804839d:5d pop%ebp804839e:c3 ret對于add函數(shù)指令按順序存放在0x08048394開始的存儲空間。各指令長度可能不同,如push、pop和ret指令各占一個字節(jié),第2行mov指令占兩個字節(jié),第3行mov指令和第4行add指令各占3字節(jié)。各指令對應的0/1序列含義有不同的規(guī)定,如“push%ebp”指令為01010101B,其中01010為push指令操作碼,101為EBP的編號,“pop%ebp”為01011101B,其中01011為pop指令的操作碼。如何判定每條指令有多長?如何判定操作類型、寄存器編號、立即數(shù)等?如何區(qū)分第2行和第3行mov指令的不同?如何確定操作數(shù)是在寄存器中還是在存儲器中?一條指令執(zhí)行結(jié)束后如何正確讀取到下一條指令?123456程序執(zhí)行需要解決的問題:程序及指令的執(zhí)行過程CPU運行程序的過程就是執(zhí)行一條一條指令的過程CPU執(zhí)行指令的過程中,包含CPU操作、訪問內(nèi)存或I/O端口的操作兩類訪存或I/O:涉及存儲系統(tǒng)、總線和I/O接口等內(nèi)容(后續(xù)課程內(nèi)容)CPU內(nèi)部操作:涉及CPU內(nèi)部數(shù)據(jù)通路(后續(xù)課程內(nèi)容)機器指令的執(zhí)行過程CPU執(zhí)行指令的過程取指令PC+“1”指令譯碼進行主存地址運算取操作數(shù)進行算術(shù)/邏輯運算存結(jié)果以上每步都需檢測“異?!比粲挟惓#瑒t自動切換到異常處理程序檢測是否有“中斷”請求,有則轉(zhuǎn)中斷處理指令執(zhí)行過程問題:“取指令”一定在最開始做嗎?PC+“1”一定在譯碼前做嗎?“譯碼”須在指令執(zhí)行前做嗎?你能說出幾種“異?!笔录??“異?!焙汀爸袛唷钡牟顒e是什么?異常是在CPU內(nèi)部發(fā)生的,中斷是由外部事件引起的取指階段執(zhí)行階段“1”:指一條指令的長度,定長指令字每次都一樣;變長指令字每次可能不同定長指令字通常在譯碼前做,變長指令字在譯碼后做!機器指令的執(zhí)行過程取指令:從PC所指單元取出指令送指令寄存器(IR),并增量PC。如add函數(shù),開始PC(IA-32的EIP)中存放的是0x0848394,CPU根據(jù)PC取指令送IR,每次總是取最長指令字節(jié)數(shù),假定最長指令是4個字節(jié),即IR為32位,此時,也即5589E58BH被取到IR中。指令譯碼:不同指令其功能不同,因而需要不同的操作控制信號。CPU根據(jù)不同操作碼譯出不同控制信號。對于上述取到IR中的5589E58BH譯碼時,可根據(jù)高5位01010譯碼得到push指令的控制信號。源操作數(shù)地址計算并取操作數(shù):根據(jù)尋址方式確定源操作數(shù)地址計算方式,若是存儲器數(shù)據(jù),則需一次或多次訪存;若為間接尋址或兩操作數(shù)都在存儲器的雙目運算,則需多次訪存;若是寄存器數(shù)據(jù),則直接從寄存器取數(shù)。執(zhí)行數(shù)據(jù)操作:在ALU或加法器等運算部件中對取出的源操作數(shù)進行運算。目的操作數(shù)地址計算并存結(jié)果:根據(jù)尋址方式確定目的操作數(shù)地址計算方式,若是存儲器數(shù)據(jù),則需要一次或多次訪存(間接尋址時);若是寄存器數(shù)據(jù),則在進行數(shù)據(jù)操作時直接存結(jié)果到寄存器。指令地址計算并將其送PC。順序執(zhí)行時,PC加上當前指令長度;遇到轉(zhuǎn)移類指令時,則需要根據(jù)條件碼、操作碼和尋址方式等確定下條指令地址。

機器指令的執(zhí)行過程每條指令的功能總是由以下四種基本操作來實現(xiàn):讀取某一主存單元的內(nèi)容,并將其裝入某個寄存器(取指,取數(shù))把一個數(shù)據(jù)從某個寄存器存入給定的主存單元中(存結(jié)果)把一個數(shù)據(jù)從某寄存器送到另一寄存器或者ALU(取數(shù),存結(jié)果)進行算術(shù)或邏輯運算(PC+”1”,計算地址,運算)指令執(zhí)行過程中查詢各種異常情況,并在發(fā)現(xiàn)異常時轉(zhuǎn)異常處理指令執(zhí)行結(jié)束時查詢中斷請求,并在發(fā)現(xiàn)中斷請求時響應中斷操作功能可形式化描述描述語言稱為寄存器傳送語言RTL(RegisterTransferLanguage)回顧:馮.諾依曼結(jié)構(gòu)模型機控制器CPUPC輸入設(shè)備輸出設(shè)備MARMDRALU標志寄存器

IR地址數(shù)據(jù)控制GPRs0123存儲器01234567

你媽會做的菜和廚師會做的菜不一樣,同一個菜譜的做法也可能不同如同不同架構(gòu)支持的指令集不同,同一種指令的實現(xiàn)方式和功能也可能不同控制器

ALU標志寄存器

地址數(shù)據(jù)控制GPRs017ffffffff80483d680483d580483d405589e5EIPbfff0000MDRIRMARbeeefffc回顧:IA-32的體系結(jié)構(gòu)是怎樣的呢?8個GPR(0~7),一個EFLAGs,PC為EIP可尋址空間4GB(編號為0~0xFFFFFFFF)指令格式變長,操作碼變長由若干字段(OP、Mod、SIB等)組成

程序由指令序列組成080483d4

<add>:80483d4: 55 push%ebp80483d5: 89e5 mov%esp,%ebp80483d7: 83ec10sub$0x10,%esp

80483da: 8b450cmov0xc(%ebp),%eax80483dd: 8b5508mov0x8(%ebp),%edx80483e0: 8d0402lea(%edx,%eax,1),%eax80483e3: 8945fcmov%eax,-0x4(%ebp)80483e6: 8b45fcmov-0x4(%ebp),%eax80483e9: c9leave80483ea: c3ret代碼執(zhí)行從80483d4開始!“objdump-dtest”顯示的add函數(shù)結(jié)果起始EIP=?EIP←0x80483d4若i=2147483647,j=2,則程序執(zhí)行結(jié)果是什么?每一步如何執(zhí)行?想想媽媽怎么做菜的?根據(jù)EIP取指令指令譯碼取操作數(shù)指令執(zhí)行回寫結(jié)果修改EIP的值取并執(zhí)行指令OP假定0x80484d4等是內(nèi)存地址,實際上它們是虛存地址,需要虛-實地址轉(zhuǎn)換指令執(zhí)行過程控制器

ALU標志寄存器

地址數(shù)據(jù)控制GPRs017bfff002080483d680483d580483d40

080483d4

<add>:80483d4:55 push%ebp80483d5:89e5 mov%esp,%ebp5589e5

EBPESPEIPbfff0020bfff0000bfff000080483d480483d45589e583Rd5589e58355MDR5589e58380483d4S1:取指令I(lǐng)R5589e583RdS2:指令譯碼S3:指令執(zhí)行MARbffefffc55功能:R[esp]←R[esp]-4,M[R[esp]]←R[ebp]45指令執(zhí)行過程控制器

ALU標志寄存器

地址數(shù)據(jù)控制GPRs017bfff002080483d680483d580483d40

080483d4

<add>:80483d4:55 push%ebp80483d5:89e5 mov%esp,%ebp5589e5

EBPESPEIPbfff0020bfff000080483d455MDR80483d4S1:取指令I(lǐng)RS2:指令譯碼S3:指令執(zhí)行bffefffcMARbffefffc功能:R[esp]←R[esp]-4,M[R[esp]]←R[ebp]45指令執(zhí)行過程控制器

ALU標志寄存器

地址數(shù)據(jù)控制GPRs017bfff002080483d680483d580483d40

080483d4

<add>:80483d4:55 push%ebp80483d5:89e5 mov%esp,%ebp5589e5

EBPESPEIPbfff0020bfff000080483d455MDRS1:取指令I(lǐng)RS2:指令譯碼S3:指令執(zhí)行bffefffcMARbffefffcbffefffc功能:R[esp]←R[esp]-4,M[R[esp]]←R[ebp]54指令執(zhí)行過程控制器

ALU標志寄存器

地址數(shù)據(jù)控制GPRs017bfff002080483d680483d580483d40

080483d4

<add>:80483d4:55 push%ebp80483d5:89e5 mov%esp,%ebp5589e5

EBPESPEIPbfff0020bfff000080483d4Wr55MDRS1:取指令I(lǐng)RWrS2:指令譯碼S3:指令執(zhí)行bffefffcMARbffefffcbffefffcbfff0020bfff0020bffefffc功能:R[esp]←R[esp]-4,M[R[esp]]←R[ebp]45指令執(zhí)行過程控制器

ALU標志寄存器

地址數(shù)據(jù)控制GPRs017bfff002080483d680483d580483d40

080483d4

<add>:80483d4:55 push%ebp80483d5:89e5 mov%esp,%ebp5589e5

EBPESPEIPbfff0020bfff0000Wr55MDRS1:取指令I(lǐng)RWrS2:指令譯碼S3:指令執(zhí)行bffefffcMARbffefffcbffefffcbfff0020bfff0020bffefffc2000ffbf80483d4功能:R[esp]←R[esp]-4,M[R[esp]]←R[ebp]45指令執(zhí)行過程控制器

ALU標志寄存器

地址數(shù)據(jù)控制GPRs017bfff002080483d680483d580483d40

080483d4

<add>:80483d4:55 push%ebp80483d5:89e5 mov%esp,%ebp5589e5

EBPESPEIPbfff0020bfff000080483d555MDRS1:取指令I(lǐng)RS2:指令譯碼S3:指令執(zhí)行、EIP增量bffefffcMARbffefffcbffefffcbfff0020bfff0020bffefffc2000ffbf開始執(zhí)行下一條指令45WrWr

程序由指令序列組成080483d4

<add>:

80483d4: 55 push%ebp80483d5: 89e5 mov%esp,%ebp80483d7: 83ec10sub$0x10,%esp

80483da: 8b450cmov0xc(%ebp),%eax80483dd: 8b5508mov0x8(%ebp),%edx

80483e0: 8d0402lea(%edx,%eax,1),%eax80483e3: 8945fcmov%eax,-0x4(%ebp)80483e6: 8b45fcmov-0x4(%ebp),%eax80483e9: c9leave80483ea: c3retEIP←0x80483d4若i=2147483647,j=2,則程序執(zhí)行結(jié)果是什么?每一步如何執(zhí)行?OPEDX和EAX中各是什么?R[edx]=i=0x7fffffffR[eax]=j=0x2回顧:IA-32的寄存器組織反映了體系結(jié)構(gòu)發(fā)展的軌跡,字長不斷擴充,指令保持兼容ST(0)~ST(7)是80位,MM0~MM7使用其低64位指令執(zhí)行過程控制器

ALU標志寄存器

地址數(shù)據(jù)控制GPRs017bfff002080483d680483d580483d40

80483da:8b450cmov0xc(%ebp),%eax80483dd:8b5508mov0x8(%ebp),%edx80483e0:8d0402lea(%edx,%eax,1),%eax5589e5

EBPESPEIPbfff000080483e0MDRS1:取指令I(lǐng)RWrS2:指令譯碼S3:指令執(zhí)行、EIP增量MAR7fffffffbeeefffc2000ffbf2

28d04028945功能:R[eax]←R[edx]+R[eax]*1回顧:ALU長啥樣呢?試想一下ALU中有哪些部件?(想想廚房做菜用什么工具?)補碼加/減器(可以干什么?)帶符號加、帶符號減無符號加、無符號減乘法器?(為什么可以沒有?)可用加/減+移位實現(xiàn),也可有獨立乘法器帶符號乘和無符號乘是各自獨立的部件除法器?(為什么可以沒有?)可用加/減+移位實現(xiàn),也可有獨立除法器帶符號除和無符號除是各自獨立的部件各種邏輯運算部件(可以干什么?)非、與、或、非、前置0個數(shù)、前置1個數(shù)…….大家能否畫出ALU框圖?回顧:ALU結(jié)構(gòu)原理

ALU符號是怎樣的?ALUABRFlagsALUctrnnn4猜猜這是什么?補碼加/減器與門nnnFlagsR或門右移非門ABAA∧BA>>1A∨B4ALUctr多路選擇器指令執(zhí)行過程控制器

ALU標志寄存器

地址數(shù)據(jù)控制GPRs017bfff002080483d680483d580483d40

80483da:8b450cmov0xc(%ebp),%eax80483dd:8b5508mov0x8(%ebp),%edx80483e0:8d0402lea(%edx,%eax,1),%eax5589e5

EBPESPEIPbfff000080483e0MDRS1:取指令I(lǐng)RWrS2:指令譯碼S3:指令執(zhí)行、EIP增量MAR7fffffffbeeefffc2000ffbf28d04028945功能:R[eax]←R[edx]+R[eax]*1(執(zhí)行前)

2指令執(zhí)行過程控制器

ALU標志寄存器

地址數(shù)據(jù)控制GPRs017bfff002080483d680483d580483d40

80483da:8b450cmov0xc(%ebp),%eax80483dd:8b5508mov0x8(%ebp),%edx80483e0:8d0402lea(%edx,%eax,1),%eax5589e5

EBPESPEIPbfff000080483e0MDRS1:取指令I(lǐng)RWrS2:指令譯碼S3:指令執(zhí)行、EIP增量MAR7fffffffbeeefffc2000ffbf2

800000018d04028945功能:R[eax]←R[edx]+R[eax]*1(執(zhí)行后)lea指令執(zhí)行的結(jié)果intadd(inti,intj){ returni+j;}intmain(){ int t1=2147483647;intt2=2; int sum=add(t1,t2); printf(”sum=%d”,

sum);}sum=-2147483647sum=0x80000001

sum的機器數(shù)和值分別是什么?

咦,怎么會兩個正數(shù)相加結(jié)果為負數(shù)呢?為什么?回顧:程序的機器級表示與執(zhí)行intsum(inta[],unsignedlen){inti,sum=0;for(i=0;i<=len–1;i++) sum+=a[i];returnsum;}sum:….L3:…movl-4(%ebp),%eaxmovl12(%ebp),%edxsubl$1,%edxcmpl%edx,%eaxjbe .L3…程序的正常執(zhí)行順序有哪兩種?(1)按順序取下一條指令執(zhí)行(2)通過CALL/RET/Jcc/JMP等指令跳轉(zhuǎn)到轉(zhuǎn)移目標地址處執(zhí)行CPU所執(zhí)行的指令的地址序列稱為CPU的控制流,通過上述兩種方式得到的控制流為正??刂屏鳌?8048380<main>:8048380:55 push%ebp8048381:89e5mov%esp,%ebp

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論