Ⅰ C++的 Windows程序內部運行原理
學習C++與.net不同的是,一定要搞清楚Windows程序內部運行原理,因為他所涉及大多數是操作系統的調用,而.net畢竟是在.netFrameWork上唱戲。
那Windows應用程序,操作系統,計算機硬體之間的相互關系究竟什麼了,下面的圖就給予很好的解釋。
向下箭頭①是 應用程序運行判斷處理的結果,輸出到輸出的設備。
向上箭頭②是輸入設備,輸入到操作系統中。
向下箭頭③代表API,我們要解釋以下API是什麼。API是應用程序介面,表示應用程序可以通知操作系統執行某個具體的動作,如操作系統能夠控制音效卡發出聲音,但它並不知應該何時發出何種聲音,需要應用程序告訴操作系統該發出什麼樣的聲音。這個關系好比有個機器人能夠完成行走的功能,但是,如果人們不告訴它往哪個方向上走,機器人是不會主動行走的。這里的機器人就是操作系統,人們就是應用程序。 對程序員來說,就可以理解為可以調用函數庫,C++程序員是對操作系統的同用。Java中調用的API是jdk中提供的函數庫,而。net程序員則是.netframework提供的函數庫。
向上的箭頭④表示操作系統能夠將輸入設備的變化上傳給應用程序。如用戶在某個程序活動時按敲了一下鍵盤,操作系統馬上能夠感知到這一事件,並且能夠知道用戶按下的哪一鍵,操作系統並不決定對這一事件如何作出反應,而是將這一事件轉交給應用程序,由應用程序決定如何對這一事件作出反應。好比有個司機開車看見前面遇到一輛車,我們的神經末梢(相當於操作系統)馬上感知到這一事件,並傳遞給了我們的大腦(相當於應用程序),我們的大腦最終決定如何對這一事件作出反應,如將踩剎車,停下來,或是英勇撞上去(則是一個sb做法)。對事件作出反應。
操作系統是怎樣將感知到的事件傳遞給應用程序的呢?這是通過消息機制(Message)來實現的'。操作系統將每個事件都包裝成一個稱為消息的結構體MSG來傳遞給應用程序,參看MSDN。
MSG結構定義如下:
typedef struct tagMSG { HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG;的過程就是消息響應。
其實,寫在這里,作為一個做過3年.net開發人員。我這里有感而發,C++是如此,.net事件響應的機制。何嘗不是一個消息機制。 消息機制,是程序界一大質的飛躍,而也是這種消息機制,把.net程序員的控制項封裝太死, 也造就一大批只能拖控制項的程序員。 我學了C++還是真的有一種豁然開朗的感覺。.net程序員,還是多看點C++吧!
Ⅱ 各位哥哥 請問電腦開機時內部程序是怎樣一步步執行的 比如先是什麼程序引導
第一步:當我們按下電源開關時,電源就開始向主板和其它設備供電,此時電壓還不太穩定,主板上的控制晶元組會向CPU發出並保持一個RESET(重置)信號,讓 CPU內部自動恢復到初始狀態,但CPU在此刻不會馬上執行指令。當晶元組檢測到電源已經開始穩定供電了(當然從不穩定到穩定的過程只是一瞬間的事情),它便撤去RESET信號(如果是手工按下計算機面板上的Reset按鈕來重啟機器,那麼松開該按鈕時晶元組就會撤去RESET信號),CPU馬上就從地址 FFFF0H處開始執行指令,從前面的介紹可知,這個地址實際上在系統BIOS的地址范圍內,無論是Award BIOS還是AMI BIOS,放在這里的只是一條跳轉指令,跳到系統BIOS中真正的啟動代碼處。
第二步:系統BIOS的啟動代碼首先要做的事情就是進行POST(Power-On Self Test,加電後自檢),POST的主要任務是檢測系統中一些關鍵設備是否存在和能否正常工作,例如內存和顯卡等設備。由於POST是最早進行的檢測過程,此時顯卡還沒有初始化,如果系統BIOS在進行POST的過程中發現了一些致命錯誤,例如沒有找到內存或者內存有問題(此時只會檢查640K常規內存),那麼系統BIOS就會直接控制喇叭發聲來報告錯誤,聲音的長短和次數代表了錯誤的類型。在正常情況下,POST過程進行得非常快,我們幾乎無法感覺到它的存在,POST結束之後就會調用其它代碼來進行更完整的硬體檢測。
第三步:接下來系統BIOS將查找顯卡的BIOS,前面說過,存放顯卡BIOS的ROM晶元的起始地址通常設在C0000H處,系統BIOS在這個地方找到顯卡 BIOS之後就調用它的初始化代碼,由顯卡BIOS來初始化顯卡,此時多數顯卡都會在屏幕上顯示出一些初始化信息,介紹生產廠商、圖形晶元類型等內容,不過這個畫面幾乎是一閃而過。系統BIOS接著會查找其它設備的BIOS程序,找到之後同樣要調用這些BIOS內部的初始化代碼來初始化相關的設備。
第四步: 查找完所有其它設備的BIOS之後,系統BIOS將顯示出它自己的啟動畫面,其中包括有系統BIOS的類型、序列號和版本號等內容。
第五步: 接著系統BIOS將檢測和顯示CPU的類型和工作頻率,然後開始測試所有的RAM,並同時在屏幕上顯示內存測試的進度,我們可以在CMOS設置中自行決定使用簡單耗時少或者詳細耗時多的測試方式。
第六步: 內存測試通過之後,系統BIOS將開始檢測系統中安裝的一些標准硬體設備,包括硬碟、CD-ROM、串口、並口、軟碟機等設備,另外絕大多數較新版本的系統BIOS在這一過程中還要自動檢測和設置內存的定時參數、硬碟參數和訪問模式等。
第七步: 標准設備檢測完畢後,系統BIOS內部的支持即插即用的代碼將開始檢測和配置系統中安裝的即插即用設備,每找到一個設備之後,系統BIOS都會在屏幕上顯示出設備的名稱和型號等信息,同時為該設備分配中斷、DMA通道和I/O埠等資源。
第八步: 到這一步為止,所有硬體都已經檢測配置完畢了,多數系統BIOS會重新清屏並在屏幕上方顯示出一個表格,其中概略地列出了系統中安裝的各種標准硬體設備,以及它們使用的資源和一些相關工作參數。
第九步: 接下來系統BIOS將更新ESCD(Extended System Configuration Data,擴展系統配置數據)。ESCD是系統BIOS用來與操作系統交換硬體配置信息的一種手段,這些數據被存放在CMOS(一小塊特殊的RAM,由主板上的電池來供電)之中。通常ESCD數據只在系統硬體配置發生改變後才會更新,所以不是每次啟動機器時我們都能夠看到"Update ESCD... Success"這樣的信息,不過,某些主板的系統BIOS在保存ESCD數據時使用了與Windows 9x不相同的數據格式,於是Windows 9x在它自己的啟動過程中會把ESCD數據修改成自己的格式,但在下一次啟動機器時,即使硬體配置沒有發生改變,系統BIOS也會把ESCD的數據格式改回來,如此循環,將會導致在每次啟動機器時,系統BIOS都要更新一遍ESCD,這就是為什麼有些機器在每次啟動時都會顯示出相關信息的原因。
第十步: ESCD更新完畢後,系統BIOS的啟動代碼將進行它的最後一項工作,即根據用戶指定的啟動順序從軟盤、硬碟或光碟機啟動。以從C盤啟動為例,系統BIOS 將讀取並執行硬碟上的主引導記錄,主引導記錄接著從分區表中找到第一個活動分區,然後讀取並執行這個活動分區的分區引導記錄,而分區引導記錄將負責讀取並執行IO.SYS,這是DOS和Windows 9x最基本的系統文件。Windows 9x的IO.SYS首先要初始化一些重要的系統數據,然後就顯示出我們熟悉的藍天白雲,在這幅畫面之下,Windows將繼續進行DOS部分和GUI(圖形用戶界面)部分的引導和初始化工作。
如果系統之中安裝有引導多種操作系統的工具軟體,通常主引導記錄將被替換成該軟體的引導代碼,這些代碼將允許用戶選擇一種操作系統,然後讀取並執行該操作系統的基本引導代碼(DOS和Windows的基本引導代碼就是分區引導記錄)。
Ⅲ 單片機程序編好後燒到板子里單片機內部是如何識別並執行這些指令呢
每個單片機都有一個共同的特點,就是啟動時候一定會挑到指定的位置去執行這個位置的代碼,你只要吧代碼寫到這個地方,那麼肯定一啟動就執行這個地方的代碼;高級點的,內置一個簡單的boot程序,可以去讀SD卡或者Flash晶元,那麼就可以做到不用ROM直接運行;
Ⅳ IE瀏覽器中如何安全地調用本地可執行程序
通常,瀏覽器中是禁止運行本地可執行程序的。但不允許瀏覽器運行,客觀上限制了瀏覽器的用途和作用。要解決此問題,必須安全擴展瀏覽器的功能。擴充瀏覽器的功能,一是採用控制項或插件技術,二是採用小程序技術。市場上的主流瀏覽器,如IR和Netscape均支持這兩種技術。控制項或插件多用VC、BC++、VB和Delph等語言開發。小程序一般是由,iava語言來編程的。眾所周知,java語言通過「砂箱」機制禁止訪問本地文件系統,更談不上調用本地程序運行,要通過瀏覽器調用本地可執行程序,需使用控制項或插件技術。一、安全調用本地程序的要求瀏覽器中調用本地程序起碼要解決兩個問題,一是安全性,二是位置透明性。 由於瀏覽器運行在客戶端,安全性非常重要,如果安全性不能解決,運行在瀏覽器中的惡意控制項輕則可能傳播病毒、破壞本地文件系統,重則造成計算機系統癱瘓和信息泄密。瀏覽器中均有默認的安全級別,IE瀏覽器默認的是中級安全級別。在此安全級別下要讓瀏覽器啟動運行本地可執行程序.一早要杷榨件標記為可安全執行的。二是要對控制項做數字簽名。把控制項標記為可安全執行的含義是要在控制項中實現必需的Iknown介面外,還要實現「對象安全」介面,這樣控制項才能與瀏覽器協調一致的工作。對控制項做數字簽名就是採用非對稱加密演算法將散列函數處理後的控制項散列值做加密,以保證控制項的完整性和不可否認性。如果對控制項不做安全標記,也不進行數字簽名,要想在本地運行可執行程序,就必須降低瀏覽器的安全性。瀏覽器的安全性降低後,對於內部網路似乎問題不是很大,但要在internet上,那就給病毒、黑客人侵打開了方便之門。除非有充足的理由,一般情況下,決不可隨便降低瀏覽器的安全性。 所謂位置透明性就是運行可執行程序與位置無關,無論其放在何處都能正常運行。位置透明性對寫過控制項的人並不陌生,Windows中無處不在,控制項無一例外都是位置透明的。其解決辦法是使用一個128位的clsid來唯一標識。clsid在HTML頁面中和系統的注冊表中隨處可見。在使用控制項時,無論是手工還是系統自動注冊都是在注冊表中建立clsid和控制項路徑的映射關系。通過這種映射關系自動解決了位置透明性。 我們也可通過注冊表解決運行程序的位置透明性問題。這里的映射關系可建立成應用程序名和可運行程序路徑之間的映射關系。用應用程序名來唯一地標識可執行程序,其相當於控制項的cMd,用安裝程序來安裝可執行程序,相當於控制項注冊。Windows中通過安裝程序安裝的可執行程序,其鍵值均在HKEY_LOCAlMACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\中,用流行的的InstallShield安裝軟體不難實現。調用本地可執行程序時在注冊表中查找其安裝路徑,結合應用程序名和注冊表鍵值中記錄的執行程序路徑,即可找到本地可執行程序,原理與控制項的動態載入運行完全一致。二、實現機理 用支持控制項的開發工具,如VC、VB等開發一個調用本地可執行程序的控制項,可命名為Cyxm—LocalCallCtrl,除了實現必需的Iknown介面外,還要實現IObjectSafety介面,即前面提到的「安全對象」介面。再實現一個調用本地可執行程序的函數,如localCall(),開發完成後對控制項做數字簽名就可使用了。1.IObjectSafety介面該介面的核心是以下的兩個函數:STDMETHODIMP CYxmLocalCallCtrl::XObjectSafety:: GetInterfaceSafetyOptions( REFIID riid, DWORD——RPC—FAR*pdwSupportedOptions, DWORD——RPC—FAR*pdwEnabledOptions ), STDMETHODIMP CYxmLocalCallCtrl::XObjectSafety::Set— InterfaceSafetyOptions( REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions ) 這兩個函數只是用對象嵌套的方式實現的一個樣例,如果用對象聚合的方式實現它,可能不是這個樣子,但介面參數和函數名是不會發生變化的。對這兩個函數的編碼並不復雜,如果你不需要做什麼,其函數體可以不用寫任何代碼,簡單地返回就可以了。之所以寫這兩個函數是瀏覽器的要求,其載入控制項時,要調用這兩個函數,也就是瀏覽器要求你承認你寫的控制項是安全地。這是前面所述標記為安全腳本的技術含義。其實IE瀏覽器支持的介面很多,如IDispatch、IHTML-Document2、IHTMLDocument、IHTMLCollection、I-HTMLFormElement、IHTMLInputTextElement等等。擴充其功能都是通過實現它們完成的。如有些文章中介紹的通過IE瀏覽器竊取網頁中的用戶名和密碼也是利用這種原理。2.數字簽名 對控制項做數字簽名首先要製作數字證書,數字證書可從數字認證中心申請得到。如果不想付費,而自己的網路又無數字認證中心,可用VC提供的工具來完成。具體做法是,用MakeCert.Exe製作數字證書,用CabArc.Exe製作壓縮包,用signcode.exe進行數字簽名。完成數字簽名後,將控制項部署到web中,即可使用。3.使用控制項 如果想通過瀏覽器調用word.exe字處理軟體,在頁面中插入如下的代碼和腳本程序,即可啟動。不要忘了容錯處理,即系統中未安裝可執行程序的情況下,也要保證瀏覽器流暢運行。
Ⅳ 51單片機執行程序的過程
單片機執行程序的過程,實際上就是執行我們所編製程序的過程。即逐條指令的過程。計算機每執行一條指令都可分為三個階段進行。即取指令-----分析指令-----執行指令。
取指令的任務是:根據程序計數器PC中的值從程序存儲器讀出現行指令,送到指令寄存器。
分析指令階段的任務是:將指令寄存器中的指令操作碼取出後進行解碼,分析其指令性質。如指令要求操作數,則尋找操作數地址。
計算機執行程序的過程實際上就是逐條指令地重復上述操作過程,直至遇到停機指令可循環等待指令。
一般計算機進行工作時,首先要通過外部設備把程序和數據通過輸入介面電路和數據匯流排送入到存儲器,然後逐條取出執行。但單片機中的程序一般事先我們都已通過寫入器固化在片內或片外程序存儲器中。因而一開機即可執行指令。
下面我們將舉個實例來說明指令的執行過程:
開機時,程序計算器PC變為0000H。然後單片機在時序電路作用下自動進入執行程序過程。執行過程實際上就是取出指令(取
出存儲器中事先存放的指令階段)和執行指令(分析和執行指令)的循環過程。
例如執行指令:MOV A,#0E0H,其機器碼為「74H E0H」,該指令的功能是把操作數E0H送入累加器,
0000H單元中已存放74H,0001H單元中已存放E0H。當單片機開始運行時,首先是進入取指階段,其次序是:
1 程序計數器的內容(這時是0000H)送到地址寄存器;
2 程序計數器的內容自動加1(變為0001H);
3 地址寄存器的內容(0000H)通過內部地址匯流排送到存儲器,以存儲器中地址解碼電跟,使地址為0000H的單元被選中;
4 CPU使讀控制線有效;
5 在讀命令控制下被選中存儲器單元的內容(此時應為74H)送到內部數據匯流排上,因為是取指階段,所以該內容通過數據匯流排被送到指令寄存器。
至此,取指階段完成,進入解碼分析和執行指令階段。
由於本次進入指令寄存器中的內容是74H(操作碼),以解碼器解碼後單片機就會知道該指令是要將一個數送到A累加器,而該數是在這個代碼的下一個存儲單元。所以,執行該指令還必須把數據(E0H)從存儲器中取出送到CPU,即還要在存儲器中取第二個位元組。其過程與取指階段很相似,只是此時PC已為0001H。指令解碼器結合時序部件,產生74H操作碼的微操作系列,使數字E0H從0001H單元取出。因為指令是要求把取得的數送到A累加器,所以取出的數字經內部數據匯流排進入A累加器,而不是進入指令寄存器。至此,一條指令的執行完畢。單片機中PC=0002H,PC在CPU每次向存儲器取指或取數時自動加1,單片機又進入下一取指階段。這一過程一直重復下去,直至收到暫停指令或循環等待指令暫停。CPU就是這樣一條一條地執行指令,完成所有規定的功能。
Ⅵ 剛學c語言不懂。 當一個程序編寫好後,運行它,計算機具體是如何處理的
首先你在編輯編譯器上寫代碼的過程叫做編輯,編寫的代碼叫源代碼,隨後你點擊編譯,這時候你的源代碼就相應的轉換為目標代碼,也就是計算機能夠識別的0、1代碼,隨後你點擊連接,這個時候代碼將你頭文件內容以及除主函數外的其他文件的函數連接起來生成可執行代碼,最後就是執行了。
Ⅶ 一個exe文件怎麼運行起來的
從OS層說起吧。 OS都有載入程序的功能,一個可執行文件(比如exe,com等)內部都是機器指令(cpu相關的)和數據,所以可執行文件和OS以及編譯器是密切相關的,不同的OS下不同的編譯器產生的可執行文件都不盡相同。不同的平台上其格式大概有elf,pe,coff等。大致都是段的形式來表示。而OS的功能就是讀懂這些文件然後完成從磁碟文件到內存的映射工作,也就是適當的時候把文件的內容搬到內存適當的位置; OS載入的過程就是進程創建的過程,進程創建完畢後,會找到入口函數去執行; 進入入口函數後就等於進入了運行庫,因為入口函數就是運行庫的一部分; 入口函數開始初始化運行程序和程序的運行環境,比如堆的初始化,I/O初始化,線程的准備,全局變數等的初始化; 下一步就進入程序的主體,也就是調用main函數部分。 main函數執行結束後又回到入口函數,此時入口函數要進行一些清理工作。 清理完成後執行一個系統調用來kill掉進程。 OK,一個可執行文件的整個執行周期就結束了。 對於c語言,運行庫叫crt(c runtime),linux下的crt為glibc,它的程序入口函數為_start,是由匯編語言實現的,包含在crt1.o這個目標庫文件里。在windows下crt為msvc crt,它的入口函數是mainCRTStartup。對於每個程序,鏈接過程都會給你的可執行程序加進一些運行庫目標文件,這樣才保證你的程序是一個獨立的可執行體。正式這些額外的代碼把你的main函數調用起來的。 一般在鏈接程序的時候須指定入口函數名。
Ⅷ 怎麼讓電腦從睡眠模式自動喚醒並執行某個程序
計算機進入睡眠狀態內部程序不會繼續運行。
計算機睡眠(Sleep)是計算機由工作狀態轉為等待狀態的一種新的節能模式。其開啟方式是在電腦系統的開始菜單中點擊電源按鈕右側的下拉箭頭選擇「睡眠」按鈕。開啟睡眠狀態時,系統的所有工作都會保存在硬碟下的一個系統文件,同時關閉除了內存外所有設備的供電。
睡眠是待機+休眠的方式,不光機器僅提供維持內存數據不丟失所需要的工作(像待機一樣),還把當前狀態存入硬碟(像休眠一樣)。 如果在睡眠過程中不斷電,那麼,就不從硬碟讀數據了,用內存數據直接恢復機器狀態,象從待機中恢復一樣。如果斷了電,那就從硬碟讀入數據,象休眠一樣。
Ⅸ 電腦的EXE文件怎麼在手機上執行
材料/工具:
手機
bochs (win模擬器)
系統鏡像 c.img
方法:
1、首先要先下載bochs這一款系統模擬器apk
拓展資料:
EXE File可執行程序一種可在操作系統存儲空間中浮動定位的可執行程序。MS-DOS和MS-WINDOWS下,此類文件擴展名為·exe。WINDOWS操作系統中的二進制可執行文件,可執行文件分兩種一種是後輟名為·COM另一種就是·EXE 。.COM一般用於DOS,在WINDOWS系統中的執行文件一般都是·EXE文件在 MS-DOS 中,用以標識可執行文件的文件擴展名。用戶在提示行中輸入不帶 .exe 擴展名的文件名後按 Enter 鍵就能運行可執行程序。