| |||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
27 | 28 | 29 | 30 | 31 | 1 | 2 | |||
3 | 4 | 5 | 6 | 7 | 8 | 9 | |||
10 | 11 | 12 | 13 | 14 | 15 | 16 | |||
17 | 18 | 19 | 20 | 21 | 22 | 23 | |||
24 | 25 | 26 | 27 | 28 | 29 | 30 | |||
1 | 2 | 3 | 4 | 5 | 6 | 7 |
物理地址是外部連接使用的、唯一的,它是“與地址總線相對(duì)應(yīng)”;而邏輯地址是內(nèi)部和編程使用的、并不唯一。 在內(nèi)存中的實(shí)際地址就是所謂的“物理地址”,而邏輯地址就是邏輯段管理內(nèi)存而形成的。 例如,你在進(jìn)行C語(yǔ)言指針編程中,可以讀取指針變量本身值(&操作),實(shí)際上這個(gè)值就是邏輯地址,它是相對(duì)于你當(dāng)前進(jìn)程數(shù)據(jù)段的地址(偏移地址),不和絕對(duì)物理地址相干。只有在Intel實(shí)模式下,邏輯地址才和物理地址相等(因?yàn)閷?shí)模式?jīng)]有分段或分頁(yè)機(jī)制,Cpu不進(jìn)行自動(dòng)地址轉(zhuǎn)換),邏輯地址也就是在Intel 保護(hù)模式下程序執(zhí)行代碼段限長(zhǎng)內(nèi)的偏移地址(假定代碼段、數(shù)據(jù)段如果完全一樣)。8086體系的CPU一開(kāi)始是20根地址線, 尋址寄存器是16位, 16位的寄存器可以訪問(wèn)64K的地址空間, 如果程序要想訪問(wèn)大于64K的內(nèi)存, 就要把內(nèi)存分段, 每段64K, 用段地址+偏移量的方法來(lái)訪問(wèn)
將邏輯地址中的段地址左移4位,加上偏移地址就得到20位物理地址。這里左移的4位是二進(jìn)制位;如果用十六進(jìn)制表達(dá)地址就是左移一位。左移4位還可以表達(dá)為乘以16,即:段地址×16+偏移地址。
同一個(gè)物理地址可以對(duì)應(yīng)多個(gè)邏輯地址形式。所以物理地址轉(zhuǎn)換為邏輯地址,需要明確段基地址或偏移地址,然后同上原則確定另一個(gè)地址。
邏輯地址 1460H : 0100H 或1380H : 0900H
物理地址 14700H
于是,對(duì)于主存14700H單元,我們可以描述為在1460H(或1380H)段的0100H(或0900H)單元,或者說(shuō)主存1460H : 0100H(或1380H : 0900H)單元。
存儲(chǔ)單元的地址可以用段基值和段內(nèi)偏移量來(lái)表示,段基值確定它所在的段居于整個(gè)存儲(chǔ)空間的位置,偏移量確定它在段內(nèi)的位置,這種地址表示方式稱(chēng)為邏輯地址。
一.綁定過(guò)程
1. DriverEntry
中間層驅(qū)動(dòng)對(duì)上層來(lái)說(shuō),扮演一個(gè)Miniport Driver的角色,它在上邊沿向NDIS注冊(cè)一組Miniportxxx函數(shù);對(duì)于下層Miniport Driver來(lái)說(shuō),中間層驅(qū)動(dòng)扮演一個(gè)Protocol Driver的角色,因此它在下邊沿向NDIS注冊(cè)一組Protocolxxx函數(shù)。Miniport Driver通過(guò)調(diào)用NdisMRegisterMiniport向NDIS注冊(cè)一組MiniportXxx函數(shù);Protocol Driver 通過(guò)調(diào)用 NdisRegisterProtocol向NDIS注冊(cè)一組ProtocolXxx函數(shù)。
首先通過(guò)調(diào)用NdisMInitializeWrapper(&NdisWrapperHandle, DriverObject, RegistryPath, NULL);來(lái)初始化NdisWrapperHandle,該句柄用來(lái)代表IM Driver的自身。
接著調(diào)用NdisIMRegisterLayeredMiniport來(lái)向NDIS注冊(cè)一組MiniportXxx函數(shù),返回指向Miniport的DriverHandle。
隨后調(diào)用NdisRegisterProtocol來(lái)向NDIS注冊(cè)一組Protocolxxx函數(shù),返回指向Protocol的ProtHandle。
然后調(diào)用NdisIMAssociateMiniport(DriverHandle, ProtHandle);將兩者綁定。
2. PtBindAdapter
NDIS在完成第一步之后,將會(huì)調(diào)用PtBindAdapter來(lái)完成對(duì)適配器的綁定(注意:此函數(shù)的調(diào)用次數(shù)是根據(jù)用戶(hù)電腦上的適配器數(shù)目而定的,一般至少有兩塊,會(huì)有一塊叫NDISWANIP),PtBindAdapter中有用的參數(shù)主要是DeviceName和SystemSpecific1,其中DeviceName是下層NIC驅(qū)動(dòng)的服務(wù)名,SystemSpecific1可以用來(lái)讀取注冊(cè)表中相關(guān)的值。(參考注冊(cè)表HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Linkage下的Bind子鍵值)
首先調(diào)用NdisOpenProtocolConfiguration ,NdisReadConfiguration來(lái)讀取注冊(cè)表信息,然后初始化PADAPT pAdapt結(jié)構(gòu)體。
接著調(diào)用NdisOpenAdapter來(lái)將IM的下層協(xié)議驅(qū)動(dòng)(ProtHandle)綁定適配器。
調(diào)用NdisIMInitializeDeviceInstanceEx來(lái)觸發(fā)對(duì)MPInitialize的調(diào)用
3. MPInitialize
在MpInitialize里面主要做三件事情:
1). 判斷介質(zhì)類(lèi)型
2). 調(diào)用NdisMSetAttributesEx設(shè)置一些特性
3). 調(diào)用PtRegisterDevice函數(shù)向NDIS注冊(cè)設(shè)備
4. PtRegisterDevice
在PtRegisterDevice里,主要是設(shè)置IM Driver自己要處理的一些派遣例程和注冊(cè)設(shè)備名和設(shè)備符號(hào)鏈接名。要注意的是,這個(gè)函數(shù)提供的功能是為整個(gè)設(shè)備服務(wù)而不是每個(gè)適配器都需要注冊(cè),所以通過(guò)一個(gè)全局變量MiniportCount來(lái)控制。
在這里,定義了PDRIVER_DISPATCH DispatchTable[IRP_MJ_MAXIMUM_FUNCTION+1];
然后如下的設(shè)置:DispatchTable[IRP_MJ_CREATE] = DevOpen;…
接著調(diào)用NdisMRegisterDevice來(lái)注冊(cè)設(shè)備名和設(shè)備符號(hào)鏈接名。
二.卸載過(guò)程
1. PtUnbindAdapter
針對(duì)每個(gè)綁定的適配器,首先查看對(duì)IM的miniport是否有還在排隊(duì)的請(qǐng)求,如果有,則先調(diào)用PtRequestComplete完成它(返回NDIS_STATUS_FAILURE),然后查看狀態(tài)是否為pending,是的話則調(diào)用NdisIMCancelInitializeDeviceInstance。再調(diào)用NdisIMDeInitializeDeviceInstance來(lái)卸載設(shè)備,在此會(huì)觸發(fā)對(duì)MPHalt的調(diào)用。
2. MPHalt
在MPHalt里,首先調(diào)用PtDeregisterDevice來(lái)卸載設(shè)備,然后調(diào)用NdisCloseAdapter關(guān)閉綁定的適配器。
3. PtDeregisterDevice (MiniportCount == 0?)
在PtDeregisterDevice 里,調(diào)用NdisMDeregisterDevice來(lái)卸載設(shè)備。同PtRegisterDevice類(lèi)似,要注意的是,這個(gè)函數(shù)提供的功能是為整個(gè)設(shè)備服務(wù)而不是每個(gè)適配器都需要注冊(cè),所以通過(guò)一個(gè)全局變量MiniportCount來(lái)控制。只有最后一個(gè)綁定的適配器卸載時(shí),才調(diào)用NdisMDeregisterDevice。
4. PtUnloadProtocol
在CloseAdapterComplete完成后,NDIS會(huì)調(diào)用PtUnloadProtocol來(lái)完成下層綁定的協(xié)議驅(qū)動(dòng)(ProtHandle)的卸載,調(diào)用NdisDeregisterProtocol函數(shù)。
5. PtUnload
首先,要說(shuō)明的是,在DriverEntry函數(shù)里,有注冊(cè)該函數(shù)(NdisMRegisterUnloadHandler(NdisWrapperHandle, PtUnload);)。該函數(shù)是整個(gè)卸載過(guò)程的最后一步,在這里,會(huì)繼續(xù)完成對(duì)綁定的上層miniport,下層的protocol的卸載(其實(shí)protocol的卸載在第4步已經(jīng)完成),調(diào)用如下兩個(gè)函數(shù)PtUnloadProtocol,NdisIMDeregisterLayeredMiniport。
集中回復(fù)001
時(shí)寒冰
最近,來(lái)信太多,無(wú)力一一回復(fù),以后選擇性的集中回復(fù)。——寒冰(暖之)
1.問(wèn):如何看股市?
答:超過(guò)7成的股票有階段性見(jiàn)頂跡象。
2.問(wèn):農(nóng)民如何應(yīng)對(duì)未來(lái)的通貨膨脹?
答:養(yǎng)豬。存糧。
3.問(wèn):保8能否成功?
答:能。一定能。
問(wèn):你這樣確信?
答:我對(duì)統(tǒng)計(jì)部門(mén)從來(lái)都有信心。
4.問(wèn):次貸危機(jī)誰(shuí)受害最深?
答:中國(guó)。
問(wèn):誰(shuí)先復(fù)蘇?
答:美國(guó)。
問(wèn):為何很多人看法正好相反。
答:表演看多了。
5.問(wèn):你如何看茅于軾廉租房不建廁所?
答:他可能把廁所當(dāng)成奢侈品,把拉屎尿尿當(dāng)成高消費(fèi)了。
問(wèn):茅于軾認(rèn)為,經(jīng)濟(jì)適用房給人帶來(lái)了貪污腐化的機(jī)會(huì),就應(yīng)該停掉經(jīng)濟(jì)適用房。
答:各行各業(yè)都存在貪污腐化的機(jī)會(huì),都應(yīng)該停掉。
問(wèn):其實(shí),只要有人類(lèi)存在就有腐化機(jī)會(huì)啊?
答:根據(jù)茅老的理論,把人類(lèi)消滅就可以徹底解決這一問(wèn)題。
問(wèn):那茅老呢?
答:他留著。他是品德高尚的人,永遠(yuǎn)不會(huì)腐化。
6.問(wèn):《中國(guó)新聞周刊》報(bào)道說(shuō),北京大學(xué)司法鑒定室主任孫東東表示“對(duì)那些老上訪專(zhuān)業(yè)戶(hù),我負(fù)責(zé)任地說(shuō),不說(shuō)100%吧,至少99%以上精神有問(wèn)題——都是偏執(zhí)型精神障礙”,你如何看?
答:這位教授精神可能有問(wèn)題,很可能是偏執(zhí)型精神障礙。
問(wèn):能否提出一些治療建議?
答:建議看獸醫(yī)。
7.問(wèn):你如何看中國(guó)人民銀行行長(zhǎng)提出最終取代美元的“超主權(quán)儲(chǔ)備貨幣”的設(shè)想?很多人評(píng)價(jià)說(shuō)是中國(guó)偉大的戰(zhàn)略調(diào)整。
答:看不懂。
問(wèn):為啥?
答:一邊積極購(gòu)買(mǎi)美國(guó)國(guó)債等,一邊要廢美元,所以看不懂是啥戰(zhàn)略。
8.問(wèn):你如何看濰坊市寒亭區(qū)采用下發(fā)“紅頭文件”的形式,向該區(qū)副科級(jí)以上干部攤派“售房任務(wù)”?
答:官商勾結(jié)的模板。房子賣(mài)不動(dòng)了。
問(wèn):最近賣(mài)得不是很火嗎?
答:集中演出的回光返照。
寫(xiě)于2009年4月3日下午兩點(diǎn)