延遲鎖相環
簡述
與PLL相比,DLL有幾個固有的優點。例如沒有抖動累加,更小的鎖定時間,環路濾波器易集成等。
實現方法
目前DLL有兩種實現方法,一個是
時鐘頻率測量法(CFM,Clock Frequency Measurement),一個是時鐘比較法(CC,Clock Comparator)。
CFM 是測量外部時鐘的頻率周期,然後以此周期為延遲值控制內部時鐘,這樣內外時鐘正好就相差了一個
時鐘周期,從而實現同步。DLL就這樣反覆測量反覆控制延遲值,使內部時鐘與外部時鐘保持同步。
CC 的方法則是比較內外部時鐘的長短,如果內部時鐘周期短了,就將所少的延遲加到下一個內部時鐘周期里,然後再與外部時鐘做比較,若是內部時鐘周期長了,就將多出的延遲從下一個內部時鐘中刨除,如此往復,最終使內外
時鐘同步。
CFM與CC 各有優缺點,CFM 的校正速度快,僅用兩個時鐘周期,但容易受到噪音干擾,並且如果測量失誤,則內部的延遲就永遠錯下去了。CC 的優點則是更穩定可靠,如果比較失敗,延遲受影響的只是一個數據(而且不會太嚴重),不會涉及到後面的延遲修正,但它的修正時間要比CFM 長。DLL 功能在DDR SDRAM 中可以被禁止,但僅限於除錯與評估操作,正常工作狀態是自動有效的。
動態程式庫
DLL綜述
DLL是Dynamic Link Library的縮寫,意為動態程式庫。在Windows中,許多應用程式並不是一個完整的
執行檔,它們被分割成一些相對獨立的動態程式庫,即
DLL檔案,放置於系統中。當我們執行某一個程式時,相應的DLL檔案就會被調用。一個應用程式可有多個DLL檔案,一個DLL檔案也可能被幾個應用程式所共用,這樣的DLL檔案被稱為共享DLL檔案。
它允許
程式共享執行特殊任務所必需的代碼和其他資源.比較大的應用程式都由很多模組組成,這些模組分別完成相對獨立的功能,它們彼此協作來完成整個軟體系統的工作。可能存在一些模組的功能較為通用,在構造其它軟體系統時仍會被使用。在構造軟體系統時,如果將所有模組的
原始碼都
靜態編譯到整個應用程式 EXE 檔案中,會產生一些問題:一個缺點是增加了應用程式的大小,它會占用更多的磁碟空間,程式運行時也會消耗較大的記憶體空間,造成系統資源的浪費;另一個缺點是,在編寫大的 EXE 程式時,在每次修改重建時都必須調整編譯所有原始碼,增加了編譯過程的複雜性,也不利於階段性的
單元測試。
Windows 系統平台上提供了一種完全不同的較有效的編程和運行環境,你可以將獨立的
程式模組創建為較小的 DLL 檔案,並可對它們單獨編譯和測試。在運行時,只有當 EXE 程式確實要調用這些 DLL 模組的情況下,系統才會將它們裝載到記憶體空間中。這種方式不僅減少了 EXE 檔案的大小和對記憶體空間的需求,而且使這些 DLL 模組可以同時被多個應用程式使用。Windows 自己就將一些主要的系統功能以 DLL 模組的形式實現。
一般來說,DLL 是一種磁碟檔案,以.dll、.DRV、.FON、.SYS 和許多以 .EXE 為擴展名的系統檔案都可以是 DLL。它由全局數據、服務函式和資源組成,在運行時被系統載入到調用進程的虛擬空間中,成為調用進程的一部分。如果與其它 DLL 之間沒有衝突,該檔案通常映射到進程虛擬空間的同一地址上。DLL 模組中包含各種導出函式,用於向外界提供服務。DLL 可以有自己的
數據段,但沒有自己的
堆疊,使用與調用它的應用程式相同的堆疊模式;一個 DLL 在記憶體中只有一個實例;DLL 實現了代碼封裝性;DLL 的編制與具體的程式語言及
編譯器無關。
在 Win32 環境中,每個進程都複製了自己的讀/寫
全局變數。如果想要與其它進程
共享記憶體,必須使用
記憶體映射檔案或者聲明一個共享數據段。DLL 模組需要的堆疊記憶體都是從運行進程的堆疊中分配出來的。Windows 在載入 DLL 模組時將進程
函式調用與 DLL 檔案的導出函式相匹配。Windows 作業系統對 DLL 的操作僅僅是把 DLL 映射到需要它的進程的
虛擬地址空間裡去。DLL 函式中的代碼所創建的任何對象(包括變數)都歸調用它的
執行緒或進程所有。
數種調用方式
1.靜態調用方式:由
編譯系統完成對 DLL 的載入和應用程式結束時 DLL
卸載的編碼(如還有其它程式使用該 DLL,則 Windows 對 DLL 的套用記錄減1,直到所有相關程式都結束對該 DLL 的使用時才釋放它,簡單實用,但不夠靈活,只能滿足一般要求。
隱式的調用:需要把產生
動態連線庫時產生的 .LIB 檔案加入到應用程式的工程中,想使用 DLL 中的函式時,只須說明一下。
隱式調用不需要調用 LoadLibrary() 和 FreeLibrary()。程式設計師在建立一個 DLL 檔案時,連結程式會自動生成一個與之對應的 LIB 導入檔案。該檔案包含了每一個 DLL 導出函式的符號名和可選的標識號,但是並不含有實際的代碼。LIB 檔案作為 DLL 的替代檔案被編譯到應用程式項目中。
當程式設計師通過靜態連結方式編譯生成應用程式時,應用程式中的調用函式與 LIB 檔案中導出符號相匹配,這些符號或標識號進入到生成的 EXE 檔案中。LIB 檔案中也包含了對應的 DL L
檔案名稱(但不是完全的路徑名),連結程式將其存儲在 EXE 檔案內部。
當應用程式運行過程中需要載入 DLL 檔案時,Windows 根據這些信息發現並載入 DLL,然後通過符號名或標識號實現對 DLL 函式的
動態連結。所有被應用程式調用的 DLL 檔案都會在應用程式 EXE 檔案載入時被載入在到記憶體中。可執行程式連結到一個包含 DLL 輸出函式信息的輸入
庫檔案(.LIB檔案)。作業系統在載入使用可執行程式時載入 DLL。可執行程式直接通過函式名調用 DLL 的輸出函式,調用方法和程式內部其 它的函式是一樣的。
2.動態調用方式:是由編程者用 API 函式載入和
卸載 DLL 來達到調用 DLL 的目的,使用上較複雜,但能更加有效地使用記憶體,是編制大型應用程式時的重要方式。
顯式的調用:
是指在應用程式中用 LoadLibrary 或 MFC 提供的 AfxLoadLibrary 顯式的將自己所做的
動態連線庫調進來,動態連線庫的
檔案名稱即是上面兩個函式的參數,再用 GetProcAddress() 獲取想要引入的函式。自此,你就可以象使用如同本應用程式自定義的函式一樣來調用此引入函式了。在應用程式退出之前,應該用 FreeLibrary 或 MFC 提供的
AfxFreeLibrary 釋放動態連線庫。直接調用 Win32 的 LoadLibary 函式,並指定 DLL 的路徑作為參數。LoadLibary 返回 HINSTANCE 參數,應用程式在調用 GetProcAddress 函式時使用這一參數。GetProcAddress 函式將符號名或標識號轉換為 DLL 內部的地址。程式設計師可以決定 DLL 檔案何時載入或不載入,顯式連結在運行時決定載入哪個 DLL 檔案。使用 DLL 的程式在使用之前必須載入(LoadLibrary)載入DLL從而得到一個DLL模組的句柄,然後調用 GetProcAddress 函式得到輸出函式的
指針,在退出之前必須
卸載DLL(FreeLibrary)。
正因為DLL 有占用記憶體小,好編輯等的特點有很多電腦病毒都是DLL格式檔案。但不能單獨運行。
動態連結庫通常都不能直接運行,也不能接收訊息。它們是一些獨立的檔案,其中包含能被可執行程式或其它DLL調用來完成某項工作的函式。只有在其它模組調用動態程式庫中的函式時,它才發揮作用。
記憶體管理
在Win32中,DLL檔案按照片段(sections)進行組織。每個片段有它自己的屬性,如可寫或是唯讀、可執行(代碼)或者不可執行(數據)等等。
DLL
代碼段通常被使用這個DLL的進程所共享;也就是說它們在
物理記憶體中占據一個地方,並且不會出現在
頁面檔案中。如果代碼段所占據的物理記憶體被收回,它的內容就會被放棄,後面如果需要的話就直接從DLL檔案重新載入。
與代碼段不同,DLL的
數據段通常是私有的;也就是說,每個使用DLL的進程都有自己的DLL數據副本。作為選擇,數據段可以設定為共享,允許通過這個
共享記憶體區域進行
進程間通信。但是,因為用戶許可權不能套用到這個共享DLL記憶體,這將產生一個安全漏洞;也就是一個進程能夠破壞共享數據,這將導致其它的共享進程異常。例如,一個使用訪客賬號的進程將可能通過這種方式破壞其它運行在特權賬號的進程。這是在DLL中避免使用共享片段的一個重要原因。
當DLL被如UPX這樣一個可執行的packer壓縮時,它的所有代碼段都標記為可以讀寫並且是非共享的。可以讀寫的代碼段,類似於私有
數據段,是每個進程私有的並且被頁面檔案備份。這樣,壓縮DLL將同時增加記憶體和磁碟空間消耗,所以共享DLL應當避免使用壓縮DLL。
找到DLL檔案地址:C:\WINDOWS\system32\****.dll時出錯(****就是你的那個找不到的
檔案名稱)
開始--運行--msconfig--啟動--找到和你說的類似的選項****--取消勾--確定,然後
1,開始-運行-輸入:regedit,然後回車
2,選擇“我的電腦”,然後點擊“檔案”-“導出”-隨便起個名字點“保存”。這樣做的目的是備份一下註冊表,以免誤操作後及時恢復。恢復的方法是,找到你剛才保存的檔案,雙擊它,然後選擇“允許導入”即可。
3,選擇“我的電腦”,按F3鍵,然後輸入“****”,點擊“查找下一個”,找到後一定要核對是不是****.
dll檔案,因為你給的
檔案名稱不全,如果確認,對該項點“右鍵”選“刪除”。“此時可以輸入****.dll進行查找,結果出來後要看後面的數值部分,不能光看檔案名稱稱,只要有****.dll在的檔案不管它邊上還寫沒寫別的(如:****.dll,load),都要刪除!”
4,然後再按F3鍵-刪除,直到提示“沒有找到相應選項”為止。
5,重新啟動計算機,看看系統有沒有問題。
注,如果出現了其它嚴重問題,請恢復註冊表。
最佳化系統方法
逼迫DLL檔案交出記憶體資源
不少應用程式在啟動時需要調用某些DLL檔案,這些DLL檔案往往會占用一定的記憶體資源,但遺憾的是當應用程式被使用完畢退出系統後,那些曾經被調用的DLL檔案並不會隨程式關閉而自動交出它們所占用的記憶體資源,這樣就容易造成記憶體資源的浪費,並且隨著運行的應用程式越多,
系統記憶體資源就被消耗得越多,最終會影響系統的整體運行效率。那有沒有辦法逼迫那些已經過時的DLL檔案,交出它們所占有的記憶體資源,從而保證系統記憶體空間始終處於“乾淨”狀態呢?答案是肯定的,我們可以按照如下步驟來逼迫DLL檔案交出記憶體資源:
依次單擊“開始”/“運行”命令,在彈出的系統運行對話框中,輸入字元串命令“regedit”,單擊“確定”按鈕後,打開系統的註冊表編輯界面;
在註冊表編輯界面中,找到其中的註冊表分支HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Explorer在對應“Explorer”子鍵的右側視窗區域中,檢查一下是否有“AlwaysUnloadDLL”字元串
鍵值的身影,如果沒有的話,那可以用滑鼠右鍵單擊右側視窗區域中的空白位置,並從彈出的
快捷選單中依次執行“新建”、“字元串值”命令,然後將新創建好的字元串值名稱設定為“AlwaysUnloadDLL”,再用滑鼠雙擊“AlwaysUnloadDLL”鍵值,在其後界面的“數值數據”文本框中直接輸入數字“1”,並單擊“確定”按鈕,最後刷新一下
系統註冊表,這樣就能逼迫那些過時的DLL檔案交出曾經占有的系統記憶體資源了。
逼迫DLL檔案交出空間資源
在頻繁地安裝與
卸載應用程式之後,系統中的有些DLL檔案就會變成無用的
垃圾檔案,不過這些垃圾檔案仍然會占用系統的硬碟空間資源,時間一長越來越多的垃圾DLL檔案就會消耗越來越多的硬碟空間資源。為此,我們可以通過下面的操作步驟,來將無用的垃圾DLL檔案刪除掉:
依次單擊“開始”/“運行”命令,在彈出的系統運行對話框中,輸入字元串命令“regedit”,單擊“確定”按鈕後,打開系統的註冊表編輯界面;
用滑鼠逐一展開其中的註冊表分支
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/SharedDlls在對應“SharedDlls”子鍵的右側視窗區域中,我們就能看到當前系統的所有DLL調用情況,要是對應某個DLL檔案的數據顯示為“0”的話,那就說明沒有應用程式使用該DLL檔案,那么該DLL檔案就是無用垃圾檔案,將這些無用的DLL
檔案名稱稱逐一記錄下來;
接下來返回到Windows系統桌面,並依次單擊“開始”/“搜尋”/“檔案或資料夾”命令,然後在彈出的系統
搜尋檔案對話框中,輸入前面記錄下來的無用DLL檔案,再單擊“搜尋”按鈕找到無用DLL檔案所在的具體位置,之後將這些找到的DLL檔案臨時轉移到其他位置,並讓系統再運行一些日子,看看系統是否能夠正常運行,要是系統仍然可以正常運行的話,那我們就能把那些無用的DLL檔案真的從硬碟中刪除掉了,這樣就能有效地節省硬碟空間資源了。
借用DLL檔案解決系統運行錯誤
由於許多應用程式的DLL檔案都是共用的,一旦對某個應用程式執行了
卸載操作之後,共用的那個DLL檔案也有可能被隨之卸載,這么一來其他應用程式運行時由於找不到共用DLL檔案而出現運行錯誤。當不幸遇到這樣的故障現象時,我們不妨通過對DLL檔案的註冊與卸載,來快速有效地解決各種常見的系統故障。
WINXP/WIN2000通過修改DLL提升安全和性能
系統的
組策略和註冊表中,我們可以修改一些鍵值來最佳化我們的系統,並加強作業系統的安全性。可是,對於限制下載、禁止刪除檔案等功能,我們無法通過上述的操作來完成,這隻有通過修改系統DLL檔案來實現。目前,我們通過修改系統的DLL檔案,可以實現禁止刪除檔案、禁止IE下載、禁止IE另外儲存為、禁止檔案打開方式等功能。
系統中部分DLL檔案的功能
1.Browselc.dll IE所需要調用的
庫檔案DLL結構雛形就是它了
2.Shdoclc.dll 系統視窗及設定等,如刪除檔案、重命名
3.Shell32.dll 系統視窗及設定等,如刪除檔案、重命名
4.Cryptui.dll IE控制項下載及提示對話框程式
修改DLL檔案的方法
1.下載DLL檔案
修改工具EXESCOPE6.0-6.3或6.4工具
2.獲取Browselc.dll、Shdoclc.dll、Shell32.dll和Cryptui.dll這幾個連結檔案。在找這幾個檔案時,最好將其他機器的硬碟,掛接在本機中,然後用本機的作業系統啟動並複製這幾個檔案。
3.在修改DLL檔案的時候,打開該鍵值,在右面的對話框中將所要修改的鍵值禁用即可,不要刪除,以備日後恢復
DLL檔案修改秘籍
1.禁止下載的修改方法:打開Shdoclc.dll修改資源--對話框---4416,將4416鍵值禁用即可。
2.禁止網頁添加到收藏夾,打開Shdoclc.dll修改資源--對話框---21400,將該鍵值禁用即可。
3.禁止惡意網頁載入控制項,修改Cryptui.
dll檔案,要同時修改5個地方才能完全禁止 資源--對話框---130 資源--對話框---230 資源--對話框---4101 資源--對話框---4104 資源--對話框---4107 將以各對話框中的相應鍵值,修改成為禁用就可以了。
4.禁止系統刪除檔案修改Shell32.dll,這個檔案需要修改5個地方才可以禁止系統刪除檔案。資源--對話框---1011 資源--對話框---1012 資源--對話框---1013 資源--對話框---1021 資源--對話框---1022 將以上五個地址的鍵值禁用就可以了!
5.禁止檔案被改名,修改
shell32.dll,有2個地方需要修改資源--對話框---1018 資源--對話框---1019 將以上兩處的相應鍵值,修改為禁用就可以了!
6.禁止運行選單,修改shell32.dll,將資源--對話框---1018鍵值設定為禁用。
7.禁止系統檔案被挪動修改shell32.dll,需要修改4個地方 資源--對話框---1014 資源--對話框---1015 資源--對話框---1016 資源--對話框---1017
8.禁止目標另外儲存為,修改Shdoclc.
dll檔案,需要修改3個地方 資源--選單--258---257 資源--選單--258---252 資源--選單--24641--2268 在這個修改中,我們要把各對應的鍵值刪除。打開該鍵值後,右鍵選單中有刪除。在資源--選單--24641—2268中,有多項該鍵值,請逐一刪除。
9.禁止
自定義資料夾選項修改Shell32.dll檔案,需要修改以下4個地方 資源--選單--215---28719 資源--選單--216---28719 資源--選單--217---28719 資源--選單--216---28719 找到以上四處鍵值,直接需要刪除後即可,而不是禁用。
10.禁止IE
資料夾選項,修改Browselc.
dll檔案,需要修改3個鍵值 資源--選單--263 (這裡有多個請刪除)---41251(刪除) 資源--選單--266(也有多個請刪除)---41329 (刪除) 資源--選單--268---41251 (刪除) 在上面的3個鍵值中,個別鍵值有多處,請逐一刪除。
11.禁止98
檔案共享控制項,修改Msshrui.dll,需要修改2個地方 資源---對話框---- 1 --- AutoRadioButton 資源---對話框---- 30 --- AutoRadioButton 將以上兩處的鍵值禁用即可。其他的選項,可以根據自己的需要進行修改。找到相應的功能鍵值,將不需要的功能,禁用就可以了。
12.禁止檔案的打開方式,修改Url.dll,需要修改2個地方 資源---對話框--- 7000 資源---對話框--- 7005 將以上兩處的鍵值禁用即可。
13.禁止更改系統桌面,修改Shdoc401.dll,有2處地方需要修改 資源---對話框--- 29952--- PushButton:瀏覽資源---對話框--- 29952--- PushButton:圖案 將以上兩處的鍵值禁用即可。
14.禁止
系統資料夾自定義,修改Shd401lc.dll,有2處地方需要修改 資源---對話框--- 29957 資源---對話框--- 29958 將以上兩處的鍵值禁用即可。
15.禁止檔案保存路徑及打開,修改Comdlg32.dll,有2處地方需要修改 資源---對話框--- 1547 資源---對話框--- 1548 將以上兩處的鍵值禁用即可。