親們,無論您是否閱讀完該文章,LC 懇請您們告訴他這文章寫的哪兒好哪兒不好, 會有禮物送哦.. -- LCatro
一 單工/半雙工/全雙工 通信的概念
1.單工通信:
單工通信定義:信息在兩點之間只能單方向發(fā)送的工作方式.它的意思是指:假設(shè)A 和B 通信,只能由一方向另一方發(fā)送數(shù)據(jù)而不能接收來自另一方發(fā)送來的數(shù)據(jù).就像小朋友們玩的聽筒,在兩個杯子之間系上一條線再拉緊,這就可以對著杯子說話而另一邊能夠聽到聲音.
2.半雙工通信:
半雙工通信定義:信息在兩點之間能夠在兩個方向上進行發(fā)送,但不能同時發(fā)送的工作方式.這就表示發(fā)送/接收數(shù)據(jù) 是有先后順序的,比如:A 向B 發(fā)送數(shù)據(jù)請求后A 只能接收來自B 發(fā)送來的回傳數(shù)據(jù),但A 接收完來自B 發(fā)送來的會傳數(shù)據(jù)后又可以立即向B 發(fā)送數(shù)據(jù)請求,而且B 也可以向A 發(fā)送數(shù)據(jù).
3.全雙工通信:
全雙工通信定義:通信允許數(shù)據(jù)在兩個方向上同時傳輸,它在能力上相當于兩個單工通信方式的結(jié)合.全雙工通信和半雙工通信的本質(zhì)區(qū)別是半雙工通信雙方只共用一條線路實現(xiàn)雙向通信,但全雙工通信卻利用兩條線路,一條作發(fā)送數(shù)據(jù)用,另一條作接收數(shù)據(jù)用.
二 芯片間通信
1.串口通信:
主機和主機之間的通信,實質(zhì)上就是兩顆芯片之間來回傳輸數(shù)據(jù)..
串口通信是通過全雙工通信進行的
按位傳輸的通信.它的優(yōu)點是可以
長距離傳輸數(shù)據(jù)(通過太長的數(shù)據(jù)鏈路時信號是會減小的,但一般我們利用信號放大來實現(xiàn)更遠的數(shù)據(jù)傳輸),占用線路少(發(fā)送線路,接收線路,地線[主要是為了抗干擾]).不過串口通信比并口通信稍微慢些.一般我們使用RS-232 號傳輸標準來
規(guī)范數(shù)據(jù)傳輸.
對于DB 9腳的串口接口定義:2號線路 接收數(shù)據(jù)(RxD),3號線路 發(fā)送數(shù)據(jù)(TxD),5號線路 信號地(GND) [其用意就是屏蔽掉外界的電磁干擾]
*RS-232 協(xié)議設(shè)計:
對于某些沒有輸出RS-232 信號的芯片,設(shè)計者常用MAX 232 (芯片通信輸出的TTL 電平轉(zhuǎn)換到RS-232
信號的器件) 來把PC 和該芯片相聯(lián).在圖六中,89S51 首先通過TxD 發(fā)送數(shù)據(jù)到MAX 232 T1IN,然后MAX 232 在它的內(nèi)部把TTL 電平信號轉(zhuǎn)換為RS-232
信號,最后MAX 232 通過T1OUT 發(fā)送到PC 的COM 接口,此時PC 就接收到了我們發(fā)送來的數(shù)據(jù)(反過來就是接收數(shù)據(jù):COM TxD ->R1IN ->R1OUT ).關(guān)于單片機方面的知識可以上www.51hei.com查閱.寫得比較容易理解.
三 通信協(xié)議
1.以太網(wǎng) 傳輸協(xié)議:
以太網(wǎng)定義:當前廣泛使用,采用共享總線型傳輸媒體方式的局域網(wǎng).過去的年代,多臺計算機要想利用一個Moden 上網(wǎng)的話,就需要添加一塊集線器(HUB ) 來把這些計算機并聯(lián)起來.[PS:集線器和交換機(SWITCH) 相比,集線器會把總網(wǎng)絡(luò)數(shù)據(jù)傳輸速率平均分配到每臺計算機,但交換機卻不會,這和硬件設(shè)計有關(guān)]
圖七 集線器實物圖(這年頭找張沒有水印的圖片還真少啊..)
下面就是多臺計算機共享網(wǎng)絡(luò)線路的拓撲圖.
線路倒是共享了,作為在線路中的某臺計算機是怎么知道線路中的數(shù)據(jù)到底是發(fā)送到自己還是發(fā)送到其它計算機的呢?為此人們制定了以太網(wǎng)數(shù)據(jù)傳輸協(xié)議,下圖是傳輸數(shù)據(jù)結(jié)構(gòu).
圖九 以太網(wǎng)數(shù)據(jù)傳輸結(jié)構(gòu)
目的地址 指的是該數(shù)據(jù)是由哪臺計算機接收.源地址 就是這個數(shù)據(jù)是從哪兒發(fā)送的.打個比方:比如A 主機需要發(fā)送數(shù)據(jù)到廣域網(wǎng),那這個目的地址就填寫集線器的網(wǎng)絡(luò)適配器的地址(這個地址就做MAC 地址,它是網(wǎng)絡(luò)適配器
所擁有的唯一地址). 當集線器接收到數(shù)據(jù)并轉(zhuǎn)發(fā)B 主機時,總線上所有主機都可以接收都這個數(shù)據(jù)包,假設(shè)A 主機接收到這個數(shù)據(jù)包,它會把數(shù)據(jù)包中的目的地址和自己的網(wǎng)絡(luò)適配器作對比,相同的話則表明這個數(shù)據(jù)是傳遞到我的,若不相同則丟棄數(shù)據(jù)包.這也就解釋了同集線器總線下監(jiān)聽其它主機發(fā)送/接收網(wǎng)絡(luò)信息的原理.
以太網(wǎng)數(shù)據(jù)包有許多不同的類型,上面是在集線器下常用的三個類型:IP 數(shù)據(jù)傳輸[0x0800],ARP 請求/應(yīng)答[0x0806],RARP 請求/應(yīng)答[0x8035].
ARP 請求/應(yīng)答:它的用處是利用某個網(wǎng)絡(luò)適配器的地址在總線中發(fā)起詢問,然后得到要查詢的網(wǎng)絡(luò)適配器的IP 地址.由于在計算機需要依靠集線器或交換機或路由器來傳遞消息之前,它一定要利用ARP 請求告訴集線器等轉(zhuǎn)遞消息硬件本機的網(wǎng)絡(luò)適配器的MAC 地址[PS:也可以利用RIP (路由信息協(xié)議)協(xié)議來向轉(zhuǎn)遞消息硬件獲取IP地址(發(fā)送網(wǎng)絡(luò)適配器的MAC 地址獲取IP 地址)].在轉(zhuǎn)遞消息硬件接收到這個請求后會在ARP 緩存表(對應(yīng)著計算機的IP地址和網(wǎng)絡(luò)適配器的MAC 地址)中查找,若無該MAC 地址,則在ARP 緩存表更新該MAC 地址,然后發(fā)送ARP 應(yīng)答數(shù)據(jù)包,那么當轉(zhuǎn)遞消息硬件接收到消息后就可以根據(jù)數(shù)據(jù)中的IP 地址在ARP 緩存表尋找MAC 地址然后就在總線上發(fā)送.假如接收到一個數(shù)據(jù)包的的IP 地址在ARP 緩存表中找不到的話,那轉(zhuǎn)遞消息硬件將會丟棄該數(shù)據(jù)包并向源IP 地址發(fā)送ICMP 數(shù)據(jù)不可到達的數(shù)據(jù)包.注意,轉(zhuǎn)遞消息硬件一般是三十分鐘刷新一次ARP 緩存表的.
RARP 請求/應(yīng)答:假如我們只知道同集線器下的某臺計算機的IP 地址并想發(fā)送數(shù)據(jù)給它但又沒有該計算機的網(wǎng)絡(luò)適配器的MAC 地址那怎么辦呢?那就需要向總線廣播RARP (反向地址轉(zhuǎn)換協(xié)議)請求,此時以太網(wǎng)數(shù)據(jù)結(jié)構(gòu)中的目的地址置為FFFFFFFFFFFF (即:-1),RARP 數(shù)據(jù)包結(jié)構(gòu)(見圖十三)中的目的IP 地址則置為需要查詢的IP 地址.接下來,當總線下的某臺計算機的網(wǎng)絡(luò)適配器接收到后就會把該IP 和自己的對比,假若查詢的是自己的IP 地址,那就返回包含這個網(wǎng)絡(luò)適配器的IP 地址和MAC 地址的RARP 應(yīng)答,最后查詢主機接收到該數(shù)據(jù)包后就更新本機的ARP 緩存表,然后就可以進行IP 層的數(shù)據(jù)發(fā)送了.
圖十 ARP /RARP 數(shù)據(jù)包結(jié)構(gòu)
2.IP 協(xié)議:
由于以太網(wǎng)協(xié)議只適用于局域網(wǎng),而且以太網(wǎng)數(shù)據(jù)不能跨轉(zhuǎn)遞消息硬件發(fā)送,所以人們制定了IP (Internet Protocol ,因特網(wǎng)協(xié)議)協(xié)議.有了它,
只要計算機連接到因特網(wǎng)那它都可以利用IP 地址(就像手機號碼) 來實現(xiàn)通信(就像手機利用GSM 協(xié)議打電話).下面就是IP 協(xié)議數(shù)據(jù)包結(jié)構(gòu):
圖十一 IP 協(xié)議頭部數(shù)據(jù)包結(jié)構(gòu)
源IP 地址和目的IP 地址的意思和以太網(wǎng)數(shù)據(jù)包結(jié)構(gòu)中的源地址和目的地址作用相同.(這里略去了其它TCP 特性,因為它們與本文無關(guān))
讀者們先來看看下面的網(wǎng)絡(luò)拓撲圖:
圖十二 網(wǎng)絡(luò)門禁系統(tǒng)的網(wǎng)絡(luò)拓撲圖
在每一個門禁控制系統(tǒng)里面都有主控制器.而這些主控制器利用以太網(wǎng)通過交換機來實現(xiàn)把數(shù)據(jù)傳遞到因特網(wǎng)(Internet )上.由于以太網(wǎng)傳輸協(xié)議只能使用在同一以太網(wǎng)下,所以這些數(shù)據(jù)是不可能傳遞到這個區(qū)域的外面的.你可以這樣想一下:廣州分廠的其中一個門禁控制系統(tǒng)的主控制器向它所屬的以太網(wǎng)發(fā)送一條信息給上海分廠的管理電腦及卡證中心主機顯然是不行的.而IP 協(xié)議卻不同,IP (Internet Protocol ) 協(xié)議適合所有只要連接到因特網(wǎng)而且還擁有其獨立的IP 地址的主機.所以,當廣州分廠的其中一個門禁控制系統(tǒng)要和上海分廠的管理電腦及卡證中心主機實現(xiàn)數(shù)據(jù)交換那就必須要知道該主機的IP 地址.有了它,系統(tǒng)會根據(jù)實際情況把IP 協(xié)議頭部數(shù)據(jù)包的各個數(shù)據(jù)填充好,然后通過以太網(wǎng)指定發(fā)送到交換機.交換機會再把我們的數(shù)據(jù)包轉(zhuǎn)發(fā)到因特網(wǎng)上,接下來這個數(shù)據(jù)包會到達上海分廠的交換機, 最后
上海分廠的交換機通過以太網(wǎng)發(fā)送數(shù)據(jù)包到管理電腦及卡證中心主機.
以IP 協(xié)議為基礎(chǔ),我們還可以利用TCP 和UDP 的傳輸數(shù)據(jù)方式來實現(xiàn)數(shù)據(jù)的傳輸.一般地,TCP 會提供"無差別","可靠的" 的數(shù)據(jù)傳輸服務(wù).
3.TCP 協(xié)議:
TCP 協(xié)議作為現(xiàn)在廣泛使用的協(xié)議,它有著許多網(wǎng)絡(luò)通信協(xié)議所沒有的特性(比如:重傳).TCP 協(xié)議是基于IP 協(xié)議上開發(fā)的.下面先來討論TCP 的數(shù)據(jù)包結(jié)構(gòu):
圖十三 TCP 協(xié)議頭部數(shù)據(jù)結(jié)構(gòu)
TCP 協(xié)議并沒有指定發(fā)送方/接收方的地址,因為它是以IP 協(xié)議作為基礎(chǔ)的協(xié)議,所以IP 協(xié)議的地址也可以說是TCP 協(xié)議的地址.在TCP 協(xié)議頭部數(shù)據(jù)結(jié)構(gòu)里,有一個新名詞叫"端口",它的用意是為了
標識不同的程序接收不同的數(shù)據(jù)包,比如:80 端口發(fā)送/接收HTTP 協(xié)議數(shù)據(jù)包,21 端口實現(xiàn)TELNET 協(xié)議 等.TCP 協(xié)議的傳輸機制是比較特殊的,它首先需要兩臺主機之間建立通信連接,然后才可以傳輸數(shù)據(jù),最后數(shù)據(jù)傳輸完成的時候還
必須要對這個連接進行關(guān)閉.先看看下面是TCP 的通信流程圖:
圖十三 TCP 協(xié)議通信連接與關(guān)閉連接時數(shù)據(jù)包傳送情況(由于源圖被畫了很多紅圈,沒辦法啊只能搶救成這樣,原諒LC 吧)
對于上面的數(shù)據(jù)包交換我們可以分為兩部分來分析:前三個數(shù)據(jù)包表示的意思是建立TCP 連接,后四個數(shù)據(jù)包的意思是關(guān)閉TCP 連接.
在TCP 建立連接的時候,主動建立的一方將會發(fā)送SYN_SENT 類型的TCP 數(shù)據(jù)包到目的主機,目的主機處理完成這個連接請求后立即返回SYN_ACK 類型的TCP 數(shù)據(jù)包(編者注:無論目的主機是否愿意和它建立連接,要想實現(xiàn)這個結(jié)構(gòu)那就必須忽略防火墻等的外界影響條件),最后在主動建立的一方接收到該SYN_ACK 數(shù)據(jù)包后返回ACK 數(shù)據(jù)包,它也就代表了TCP 連接真正建立成功.這就是TCP 三次握手過程.
兩臺主機之間的數(shù)據(jù)傳輸結(jié)束了,那就要關(guān)閉連接.當一方主動關(guān)閉連接時,它將會發(fā)送FIN 數(shù)據(jù)包來通告對方.對方接收FIN 數(shù)據(jù)包后就會返回FIN_ACK 數(shù)據(jù)包來確認.(編者注:凡是已經(jīng)主動發(fā)送過FIN 數(shù)據(jù)包的主機都不能夠再發(fā)送任何數(shù)據(jù),但可以接收數(shù)據(jù))只有雙方都各自都完成了發(fā)送FIN 數(shù)據(jù)包,那么TCP 連接也就關(guān)閉了.這就是TCP 的四次握手過程.
發(fā)送數(shù)據(jù)和這些差不多,有興趣的讀者可以看看<<TCP/IP 協(xié)議詳解>> 或者給LCatro 留個言.
4.小總結(jié):
數(shù)據(jù)包的結(jié)構(gòu)搞亂了?請看看下圖吧..
圖十四 網(wǎng)絡(luò)數(shù)據(jù)包結(jié)構(gòu)
由于我們在以太網(wǎng)下利用以太網(wǎng)協(xié)議發(fā)送數(shù)據(jù),所以我們的要發(fā)送到目的主機的數(shù)據(jù)就包含在以太網(wǎng)數(shù)據(jù)包的數(shù)據(jù)里面.對于這個數(shù)據(jù),實際上是IP 數(shù)據(jù)包,然而IP 數(shù)據(jù)包里面的數(shù)據(jù)其實是TCP 數(shù)據(jù)包,TCP 數(shù)據(jù)包里面的數(shù)據(jù)就是我們要發(fā)送的信息.所以讀者們結(jié)合上圖來理解網(wǎng)絡(luò)數(shù)據(jù)包結(jié)構(gòu)(右邊)就容易了..
至于左邊的結(jié)構(gòu)圖的意思是網(wǎng)絡(luò)模型,它代表了哪個協(xié)議所在哪一個網(wǎng)絡(luò)模型層的級別.
四 網(wǎng)絡(luò)適配器(網(wǎng)卡)原理:
1.什么是網(wǎng)絡(luò)適配器:
網(wǎng)絡(luò)適配器的意義在于協(xié)助計算機處理器來實現(xiàn)數(shù)據(jù)的傳輸.
下面是實物圖片,這個網(wǎng)絡(luò)適配器是臺式計算機使用的.
由于現(xiàn)代計算機發(fā)展迅速,導(dǎo)致網(wǎng)絡(luò)服務(wù)器數(shù)據(jù)傳輸速度有些時候并不能滿足日益增長的需求.為此,雙端口網(wǎng)絡(luò)適配器誕生了,也即是說同一個網(wǎng)絡(luò)適配器可以連接兩條網(wǎng)線.如果讀者想更深入了解請到:
http://www.doc88.com/p-374664665354.html (
HP CN1000E雙端口聚合網(wǎng)絡(luò)適配器 - 產(chǎn)品簡介)
圖十六 雙端口聚合網(wǎng)絡(luò)適配器
*網(wǎng)絡(luò)適配器的普通模式和混雜模式:
一般情況下,我們都使用網(wǎng)絡(luò)適配器的普通模式.所謂普通模式,其實是讓網(wǎng)絡(luò)適配器只接收發(fā)送到自己的數(shù)據(jù)包.但混雜模式卻與此相反,凡是網(wǎng)絡(luò)適配器接收到數(shù)據(jù)包就傳遞給處理器,無論這個數(shù)據(jù)包是不是發(fā)送該主機的.
*關(guān)于網(wǎng)絡(luò)適配器的混雜模式
由于數(shù)據(jù)的傳輸都是按照一定的標準的,那么只要有多臺主機在同一以太網(wǎng)下,其中一臺主機就可以利用混雜模式來獲取其它計算機發(fā)送/接收的數(shù)據(jù)包.(請回顧下:"圖八 總線型數(shù)據(jù)傳輸鏈路",在總線下傳輸?shù)臄?shù)據(jù)各個主機都可以接收到)所以這就是局域網(wǎng)下監(jiān)聽其它計算機的原理.同樣地,我們也可以利用此原理去盜取用戶賬號和密碼等敏感信息.但在盜取成功之前還需要一個前提:數(shù)據(jù)的解密.
五 Windows 驅(qū)動層:
1.WinSock 函數(shù)庫:
WinSock 是Windows 自帶的與網(wǎng)絡(luò)交互的運行庫.在此,程序員們利用一些相關(guān)的接口就可以實現(xiàn)端口綁定,TCP 連接,關(guān)閉,發(fā)送,接收數(shù)據(jù)等功能.請注意,WinSock 只是網(wǎng)絡(luò)接口,更準確地來講就是DLL 文件(Dynamic Link Library ,動態(tài)鏈接庫.它是用來儲存代碼或者資源數(shù)據(jù)的文件,詳情請看:http://baike.baidu.com/view/887.htm?fromId=4373 動態(tài)鏈接庫 - 百度百科).所以WinSock 也只是通過調(diào)用驅(qū)動程序(驅(qū)動程序的用意是讓處理器控制外圍硬件)的方式來編寫接口.接下來,你將會看到從網(wǎng)絡(luò)適配器接收的數(shù)據(jù)需要經(jīng)過多少個驅(qū)動才可以到達WinSock.DLL .
2.網(wǎng)絡(luò)適配器遞交數(shù)據(jù)需要經(jīng)過的驅(qū)動:
在看內(nèi)核網(wǎng)絡(luò)驅(qū)動程序結(jié)構(gòu)之前,我們首先要知道:
1.WinSock.DLL 其實是在TDI (Transport Driver Interface ,傳輸驅(qū)動程序接口.它的用意是把從上往下/從下往上 傳遞的驅(qū)動程序I/O 請求數(shù)據(jù)結(jié)構(gòu)逐級搬運.在數(shù)據(jù)搬運的過程中,中間驅(qū)動程序可以對這些數(shù)據(jù)進行過濾)層上的.
2.Protocol Driver ,協(xié)議驅(qū)動程序.每個協(xié)議驅(qū)動程序都代表著不同的網(wǎng)絡(luò)協(xié)議(編者注:Winpcap 和NDISUIO 不是網(wǎng)絡(luò)協(xié)議驅(qū)動程序.前者是Windows 網(wǎng)絡(luò)底層抓包驅(qū)動程序.后者是控制NDIS 驅(qū)動程序I/O 的驅(qū)動程序)
3.HAL 是硬件抽象層(詳細請見:http://baike.baidu.com/view/1166796.htm HAL - 百度百科).當驅(qū)動程序的I/O 請求數(shù)據(jù)結(jié)構(gòu)傳輸?shù)酱藭r,接下來就是處理器通過總線來控制外圍硬件.
圖十七 Windows 系統(tǒng)內(nèi)核網(wǎng)絡(luò)驅(qū)動程序結(jié)構(gòu)
在普通程序調(diào)用WinSock.DLL 發(fā)送TCP 連接請求時,WinSock.DLL 會自動填寫好該請求數(shù)據(jù)包的IP 及TCP 數(shù)據(jù)包頭部結(jié)構(gòu).然后向下層驅(qū)動程序傳遞,直到TCP/IP 驅(qū)動程序.TCP/IP 驅(qū)動程序再轉(zhuǎn)發(fā)到NDIS (Network Driver Interface Specification ,網(wǎng)絡(luò)適配器驅(qū)動程序
),最后通過HAL 實現(xiàn)把TCP 連接請求數(shù)據(jù)包從處理器發(fā)送到網(wǎng)絡(luò)適配器.接下來網(wǎng)絡(luò)適配器會通過網(wǎng)線發(fā)送到以太網(wǎng).接收數(shù)據(jù)與此相反,略之.
六 在一次瀏覽www.baidu.com 中系統(tǒng)工作的過程
至此,相信讀者們已經(jīng)對于硬件間數(shù)據(jù)傳輸,網(wǎng)絡(luò)協(xié)議,Windows 系統(tǒng)內(nèi)核網(wǎng)絡(luò)驅(qū)動程序結(jié)構(gòu) 都有了一定的了解.那LCatro 就和大家分析下瀏覽百度首頁的過程吧.
假設(shè)我們剛剛把電腦啟動完成,然后立即瀏覽百度首頁.(這樣做的用意是提供一個DNS 緩存表為空的環(huán)境)
在我們輸入www.baidu.com (編者注:www.baidu.com 準備地來說是網(wǎng)站的域名) 使瀏覽器訪問的時候,它會先把域名轉(zhuǎn)換到IP 地址(即:解析,用gethostbyname() 函數(shù)實現(xiàn)) .此時WinSock 會從本地的DNS (用于解析域名和IP 地址的協(xié)議)緩存表(在本機里面的一張專門存放域名和對應(yīng)的IP 地址的數(shù)據(jù)塊) 中尋找www.baidu.com 的IP 地址.由于主機是剛剛啟動的,所以DNS 緩存表還是一片空白.WinSock 從DNS 緩存表中找不到對應(yīng)的IP 地址,于是就向DNS 服務(wù)器發(fā)送查詢域名請求(即:DNS 指針查詢).DNS 服務(wù)器接收到該請求后會在本地查詢該域名,假如該DNS 服務(wù)器沒有該域名和對應(yīng)的IP 地址的話,那該DNS 服務(wù)器便會向比它更高級的DNS 服務(wù)器提交查詢,一直到查詢結(jié)果得到為止.成功則返回查詢成功數(shù)據(jù)包,如果還是查詢不到的話DNS 服務(wù)器會返回查詢失敗數(shù)據(jù)包. [該過程為域名轉(zhuǎn)換到IP 過程,用專業(yè)的語言來說就是:域名解析過程]
有了IP 地址,瀏覽器就向它發(fā)送TCP 連接請求,接下來就是三次握手過程.連接成功建立后,瀏覽器會向百度的服務(wù)器發(fā)送獲取http://www.baidu.com/index.html (編者注:www.baidu.com/index.html 的意思是百度首頁的index 索引網(wǎng)頁的.HTML 文件(網(wǎng)頁代碼文件))的源代碼.隨后,百度服務(wù)器返回索引網(wǎng)頁的源代碼,并且主動關(guān)閉TCP 連接.最后瀏覽器便根據(jù)這里面的源代碼逐一顯示在程序的網(wǎng)頁瀏覽控件上.
思考題:請你聯(lián)系該文章所講述到的知識認真地想一想系統(tǒng)是怎么樣去一步步實現(xiàn)的呢?
與主題無關(guān)的相關(guān)知識:
*程序啟動過程:
在我們雙擊程序時,Explorer.exe 會調(diào)用CreateProcess() 運行該程序.CreateProcess() 立即讀取程序文件(即: .EXE 文件) 的PE (PreInstallation Environment ,預(yù)安裝環(huán)境.這個是Windows 特有的程序結(jié)構(gòu),它的用意是告訴Windows 系統(tǒng)在運行程序之前需要先做哪些東西.詳細請見:http://baike.baidu.com/view/3326.htm?fromId=8358 Windows PE 結(jié)構(gòu) - 百度百科) 結(jié)構(gòu),Windows 系統(tǒng)會根據(jù).EXE 的需求先做一些相關(guān)的工作,比如:程序需要加載到哪一個內(nèi)存位置?程序代碼的入口點在哪兒?系統(tǒng)加載完成后,就將這個程序從硬盤中把程序文件映射到內(nèi)存中 (內(nèi)存映射).接下來CreateProcess() 會給該程序分配堆棧,最后再創(chuàng)建線程來執(zhí)行該程序.假如我們運行的是.INK 文件(即:快捷方式),Explorer.exe 會解析.INK 文件,從中獲取到目的程序的運行路徑.
*VB 程序運行細節(jié):
由于VB 程序在設(shè)計窗口界面的時候完全使開發(fā)者避免怎么樣用代碼把控件一個個創(chuàng)建.讀者們可以聯(lián)系下Win32 窗口程序的開發(fā).首先,在WinMain() (即:Win32 應(yīng)用程序入口點) 的時候程序就開始注冊->創(chuàng)建窗口了.在創(chuàng)建窗口完成后(注意,此時窗口只是空白的!),Windows 系統(tǒng)會向該窗口發(fā)送WM_PRINT 消息通告窗口開始畫控件.
Q:既然說剛剛創(chuàng)建窗口的時候是空白的,那為什么我們沒有先看到空白的窗口再看到程序一步步在窗口上面畫控件呢?
A:因為處理器執(zhí)行代碼的速度太快了,所以它在繪畫的過程中只使用了非常短的時間,以至于人類的眼晴不能接收到這些圖像.
*內(nèi)核處理按鍵過程:
在我們輸入完成網(wǎng)址后按下鍵盤的Enter 鍵,鍵盤會主動向處理器引發(fā)中斷事件.由于計算機系統(tǒng)中中斷種類太多,而且對于不同的中斷有不同的處理方法,于是人們把各個不同的中斷處理程序的入口地址儲存在中斷程序入口表.這是鍵盤所引發(fā)的中斷,那處理器接收到這個中斷的時候立即跳出當前正在運行的程序,轉(zhuǎn)而去運行鍵盤中斷程序,當鍵盤中斷程序執(zhí)行結(jié)束后,處理會繼續(xù)執(zhí)行原先的暫停運行的代碼.
這個被按下的按鍵在處理器里面是用ASCII 碼來保存的,并且它也會從最底層驅(qū)動一直上傳到應(yīng)用程序.應(yīng)用程序是通過系統(tǒng)發(fā)來的WM_KEYDOWN 消息然后來獲取按下的鍵值的.