www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 嵌入式 > 技術(shù)讓夢想更偉大
[導(dǎo)讀]????關(guān)注、星標(biāo)公眾號,直達(dá)精彩內(nèi)容作者:hguisu一、地址概念和程序如何運(yùn)行在多道程序環(huán)境下,要使程序運(yùn)行,必須先為之創(chuàng)建進(jìn)程。而創(chuàng)建進(jìn)程的第一件事,便是將程序和數(shù)據(jù)裝入內(nèi)存。如何將一個用戶源程序變?yōu)橐粋€可在內(nèi)存中執(zhí)行的程序,通常都要經(jīng)過以下幾個步驟:首先是要編譯由編譯程序...



作者:hguisu



一、地址概念和程序如何運(yùn)行

在多道程序環(huán)境下,要使程序運(yùn)行,必須先為之創(chuàng)建進(jìn)程。而創(chuàng)建進(jìn)程的第一件事,便是將程序和數(shù)據(jù)裝入內(nèi)存。如何將一個用戶源程序變?yōu)橐粋€可在內(nèi)存中執(zhí)行的程序,通常都要經(jīng)過以下幾個步驟:


首先是要編譯

由編譯程序(Compiler)將用戶源代碼編譯成cpu可執(zhí)行的目標(biāo)代碼,產(chǎn)生了若干個目標(biāo)模塊(Object  Module)(即若干程序段)。形成的目標(biāo)代碼,每個目標(biāo)代碼都是以0為基址順序進(jìn)行編址,原來用符號名訪問的單元用具體的數(shù)據(jù)——單元號取代。這樣生成的目標(biāo)程序占據(jù)一定的地址空間,稱為作業(yè)的邏輯地址空間,簡稱邏輯空間


在邏輯空間中每條指令的地址和指令中要訪問的操作數(shù)地址統(tǒng)稱為邏輯地址  。很簡單,邏輯地址就是你源程序里使用的地址,或者源代碼經(jīng)過編譯以后編譯器將一些標(biāo)號,變量轉(zhuǎn)換成的地址。


其次是鏈接

由鏈接程序(Linker)將編譯后形成的一組目標(biāo)模塊(程序段),以及它們所需要的庫函數(shù)鏈接在一起,形成一個完整的裝入模塊(Load  Module);


最后是裝入(地址重定位)

由裝入程序(Loader)將裝入模塊裝入物理內(nèi)存。物理內(nèi)存是真實(shí)存在的插在主板內(nèi)存槽上的內(nèi)存條的容量的大小。


物理內(nèi)存內(nèi)存是由若干個存儲單元組成的,每個存儲單元有一個編號,這種編號可唯一標(biāo)識一個存儲單元,稱為內(nèi)存地址(或物理地址)。我們可以把內(nèi)存看成一個從0字節(jié)一直到內(nèi)存最大容量逐字節(jié)編號的存儲單元數(shù)組,即每個存儲單元與內(nèi)存地址的編號相對應(yīng)。


裝入模塊雖然具有統(tǒng)一的地址空間,但它仍是以“0”作為參考地址,即是浮動的。要把它裝入內(nèi)存執(zhí)行,就要確定裝入內(nèi)存的實(shí)際物理地址,并修改程序中與 地址有關(guān)的代碼,這一過程叫做地址重定位。地址重定位主要是把邏輯地址轉(zhuǎn)換成物理內(nèi)存絕對地址,這個工作又稱為地址映射。


圖 4-2 示出了這樣的三步過程。



圖4-2  對用戶程序的處理步驟


二. 程序的鏈接

源程序經(jīng)過編譯后,可得到一組目標(biāo)模塊,再利用鏈接程序?qū)⑦@組目標(biāo)模塊鏈接,形成裝入模塊。根據(jù)鏈接時間的不同,可把鏈接分成如下三種:


(1) 、 靜態(tài)鏈接。在程序運(yùn)行之前,先將各目標(biāo)模塊及它們所需的庫函數(shù),鏈接成一個完整的裝配模塊,以后不再拆開。我們把這種事先進(jìn)行鏈接的方式稱為靜態(tài)鏈接方式。


(2)、 裝入時動態(tài)鏈接。這是指將用戶源程序編譯后所得到的一組目標(biāo)模塊,在裝入內(nèi)存時,采用邊裝入邊鏈接的鏈接方式。


(3)、 運(yùn)行時動態(tài)鏈接。這是指對某些目標(biāo)模塊的鏈接,是在程序執(zhí)行中需要該(目標(biāo))模塊時,才對它進(jìn)行的鏈接。


1.靜態(tài)鏈接方式(Static Linking)

我們通過一個例子來說明在實(shí)現(xiàn)靜態(tài)鏈接時應(yīng)解決的一些問題。在圖 4-4(a)中示出了經(jīng)過編譯后所得到的三個目標(biāo)模塊A、B、C,它們的長度分別為 L、M和N。在模塊A中有一條語句CALL B,用于調(diào)用模塊B。在模塊B中有一條語句CALL C,用于調(diào)用模塊C。B和C都屬于外部調(diào)用符號,在將這幾個目標(biāo)模塊裝配成一個裝入模塊時,須解決以下兩個問題:


(1)  對相對地址進(jìn)行修改。在由編譯程序所產(chǎn)生的所有目標(biāo)模塊中,使用的都是相對地址,其起始地址都為 0,每個模塊中的地址都是相對于起始地址計(jì)算的。


在鏈接成一個裝入模塊后,原模塊B和 C在裝入模塊的起始地址不再是 0,而分別是 L和 L M,所以此時須修改模塊B和C中的相對地址,即把原B中的所有相對地址都加上 L,把原 C中的所有相對地址都加上L M。


(2)  變換外部調(diào)用符號。將每個模塊中所用的外部調(diào)用符號也都變換為相對地址,如把B 的起始地址變換為 L,把 C 的起始地址變換為 L M,如圖 4-4(b)所示。


這種先進(jìn)行鏈接所形成的一個完整的裝入模塊,又稱為可執(zhí)行文件。通常都不再拆開它,要運(yùn)行時可直接將它裝入內(nèi)存。這種事先進(jìn)行鏈接,以后不再拆開的鏈接方式,稱為靜態(tài)鏈接方式。



圖 4-4 程序鏈接示意圖


2.裝入時動態(tài)鏈接(Load-time Dynamic Linking)

用戶源程序經(jīng)編譯后所得的目標(biāo)模塊,是在裝入內(nèi)存時邊裝入邊鏈接的,即在裝入一個目標(biāo)模塊時,若發(fā)生一個外部模塊調(diào)用事件,將引起裝入程序去找出相應(yīng)的外部目標(biāo)模塊,并將它裝入內(nèi)存,還要按照圖4-4所示的方式來修改目標(biāo)模塊中的相對地址。裝入時動態(tài)鏈接方式有以下優(yōu)點(diǎn):


(1) 、 便于修改和更新。對于經(jīng)靜態(tài)鏈接裝配在一起的裝入模塊,如果要修改或更新其中的某個目標(biāo)模塊,則要求重新打開裝入模塊。這不僅是低效的,而且有時是不可能的。若采用動態(tài)鏈接方式,由于各目標(biāo)模塊是分開存放的,所以要修改或更新各目標(biāo)模塊是件非常容易的事。


(2)、 便于實(shí)現(xiàn)對目標(biāo)模塊的共享。在采用靜態(tài)鏈接方式時,每個應(yīng)用模塊都必須含有其目標(biāo)模塊的拷貝,無法實(shí)現(xiàn)對目標(biāo)模塊的共享。但采用裝入時動態(tài)鏈接方式,OS則很容易將一個目標(biāo)模塊鏈接到幾個應(yīng)用模塊上,實(shí)現(xiàn)多個應(yīng)用程序?qū)υ撃K的共享。


3.運(yùn)行時動態(tài)鏈接(Run-time Dynamic Linking)

在許多情況下,應(yīng)用程序在運(yùn)行時,每次要運(yùn)行的模塊可能是不相同的。但由于事先無法知道本次要運(yùn)行哪些模塊,故只能是將所有可能要運(yùn)行到的模塊都全部裝入內(nèi)存,并在裝入時全部鏈接在一起。顯然這是低效的,因?yàn)橥鶗行┠繕?biāo)模塊根本就不運(yùn)行。


比較典型的例子是作為錯誤處理用的目標(biāo)模塊,如果程序在整個運(yùn)行過程中都不出現(xiàn)錯誤,則顯然就不會用到該模塊。近幾年流行起來的運(yùn)行時動態(tài)鏈接方式,是對上述在裝入時鏈接方式的一種改進(jìn)。


這種鏈接方式是將對某些模塊的鏈接推遲到程序執(zhí)行時才進(jìn)行鏈接,亦即,在執(zhí)行過程中,當(dāng)發(fā)現(xiàn)一個被調(diào)用模塊尚未裝入內(nèi)存時,立即由OS去找到該模塊并將之裝入內(nèi)存,把它鏈接到調(diào)用者模塊上。凡在執(zhí)行過程中未被用到的目標(biāo)模塊,都不會被調(diào)入內(nèi)存和被鏈接到裝入模塊上,這樣不僅可加快程序的裝入過程,而且可節(jié)省大量的內(nèi)存空間。


三. 程序的裝入(地址的變換)

為了闡述上的方便,我們先介紹一個無需進(jìn)行鏈接的單個目標(biāo)模塊的裝入過程。該目標(biāo)模塊也就是裝入模塊。在將一個裝入模塊裝入內(nèi)存時,可以有絕對裝入方式可重定位裝入方式動態(tài)運(yùn)行時裝入方式,下面分別簡述之。


1.絕對裝入方式(Absolute Loading Mode)

在編譯時,如果知道程序?qū)Ⅰv留在內(nèi)存的什么位置,那么,編譯程序?qū)a(chǎn)生絕對地址的目標(biāo)代碼。即按照物理內(nèi)存的位置賦予實(shí)際的物理地址。例如,事先已知用戶程序(進(jìn)程)駐留在從R處開始的位置,則編譯程序所產(chǎn)生的目標(biāo)模塊(即裝入模塊)便從R處開始向上擴(kuò)展。


絕對裝入程序按照裝入模塊中的地址,將程序和數(shù)據(jù)裝入內(nèi)存。裝入模塊被裝入內(nèi)存后,由于程序中的邏輯地址與實(shí)際內(nèi)存地址完全相同,故不須對程序和數(shù)據(jù)的地址進(jìn)行修改。程序中所使用的絕對地址,既可在編譯或匯編時給出,也可由程序員直接賦予。


這個方式的優(yōu)點(diǎn):是CPU執(zhí)行目標(biāo)代碼快。


缺點(diǎn):


1)是由于內(nèi)存大小限制,能裝入內(nèi)存并發(fā)執(zhí)行的進(jìn)程數(shù)大大減少


2)編譯程序必須知道內(nèi)存的當(dāng)前空閑地址部分和其地址,并且把進(jìn)程的不同程序段連續(xù)地存放起來,編譯非常復(fù)雜。由于程序
因此,通常是寧可在程序中采用符號地址,然后在編譯或匯編時,再將這些符號地址轉(zhuǎn)換為絕對地址。


如何把虛擬內(nèi)存地址空間變換到內(nèi)存唯一的一維物理線性空間?涉及到兩個問題:


一是虛擬空間的劃分問題。


二是把虛擬空間中已經(jīng)鏈接和劃分好的內(nèi)容裝入內(nèi)存,并將虛擬空間地址映射內(nèi)存地址的問題。即地址映射。地址映射就是建立虛擬地址與內(nèi)存地址的關(guān)系。


2.靜態(tài)地址重定位(可重定位裝入方式 Relocation Loading Mode)

絕對裝入方式只能將目標(biāo)模塊裝入到內(nèi)存中事先指定的位置。在多道程序環(huán)境下,編譯程序不可能預(yù)知所編譯的目標(biāo)模塊應(yīng)放在內(nèi)存的何處,因此,絕對裝入方式只適用于單道程序環(huán)境。


在多道程序環(huán)境下,所得到的目標(biāo)模塊的起始地址通常是從 0 開始的,程序中的其它地址也都是相對于起始地址計(jì)算的。此時應(yīng)采用可重定位裝入方式,根據(jù)內(nèi)存的當(dāng)前情況,將裝入模塊裝入到內(nèi)存的適當(dāng)位置。


靜態(tài)地址重定位:即在程序裝入對目標(biāo)代碼裝入內(nèi)存的過程中完成,是指在程序開始運(yùn)行前,程序中指令和數(shù)據(jù)的各個地址均已完成重定位,即完成虛擬地址到內(nèi)存地址映射。地址變換通常是在裝入時一次完成的,以后不再改變。


值得注意的是, 在采用可重定位裝入程序?qū)⒀b入模塊裝入內(nèi)存后, 會使裝入模塊中的所有邏輯地址與實(shí)際裝入內(nèi)存的物理地址不同,圖4-3示出了這一情況。



圖 4-3 作業(yè)裝入內(nèi)存時的情況


例如,在用戶程序的 1000 號單元處有一條指令LOAD 1,2500,該指令的功能是將 2500 單元中的整數(shù) 365 取至寄存器 1。但若將該用戶程序裝入到內(nèi)存的 10000~15000號單元而不進(jìn)行地址變換, 則在執(zhí)行11000號單元中的指令時,它將仍從 2500 號單元中把數(shù)據(jù)取至寄存器1而導(dǎo)致數(shù)據(jù)錯誤。


由圖4-3 可見,正確的方法應(yīng)該是將取數(shù)指令中的地址 2500 修改成 12500,即把指令中的相對地址 2500 與本程序在內(nèi)存中的起始地址 10000 相加,才得到正確的物理地址12500。除了數(shù)據(jù)地址應(yīng)修改外,指令地址也須做同樣的修改,即將指令的相對地址 1000 與起始地址 10000 相加,得到絕對地址 11000。


優(yōu)點(diǎn):無需硬件支持


缺點(diǎn):


1)程序重定位之后就不能在內(nèi)存中搬動了;


2)要求程序的存儲空間是連續(xù)的,不能把程序放在若干個不連續(xù)的區(qū)域中。


3.動態(tài)地址重定位(動態(tài)運(yùn)行時裝入方式Dynamic Run-time Loading)

可重定位裝入方式可將裝入模塊裝入到內(nèi)存中任何允許的位置,故可用于多道程序環(huán)境;但這種方式并不允許程序運(yùn)行時在內(nèi)存中移動位置。因?yàn)?,程序在?nèi)存中的移動,意味著它的物理位置發(fā)生了變化, 這時必須對程序和數(shù)據(jù)的地址(是絕對地址)進(jìn)行修改后方能運(yùn)行。


然而,實(shí)際情況是,在運(yùn)行過程中它在內(nèi)存中的位置可能經(jīng)常要改變,此時就應(yīng)采用動態(tài)運(yùn)行時裝入的方式。


動態(tài)地址重定位:不是在程序執(zhí)行之前而是在程序執(zhí)行過程中進(jìn)行地址變換。更確切的說,是把這種地址轉(zhuǎn)換推遲到程序真正要執(zhí)行時才進(jìn)行,即在每次訪問內(nèi)存單元前才將要訪問的程序或數(shù)據(jù)地址變換成內(nèi)存地址。


動態(tài)重定位可使裝配模塊不加任何修改而裝入內(nèi)存。為使地址轉(zhuǎn)換不影響指令的執(zhí)行速度,這種方式需要一個重定位寄存器的支持,


優(yōu)點(diǎn):


1)目標(biāo)模塊裝入內(nèi)存時無需任何修改,因而裝入之后再搬遷也不會影響其正確執(zhí)行,這對于存儲器緊縮、解決碎片問題是極其有利的;


2)一個程序由若干個相對獨(dú)立的目標(biāo)模塊組成時,每個目標(biāo)模塊各裝入一個存儲區(qū)域,這些存儲區(qū)域可以不是順序相鄰的,只要各個模塊有自己對應(yīng)的定位寄存器就行。


缺點(diǎn):需要硬件支持。


四. Windows NT動態(tài)鏈接庫

5.1. 構(gòu)造動態(tài)鏈接庫

DLL是包含函數(shù)和數(shù)據(jù)的模塊,它的調(diào)用模塊可為EXE或DLL,它由調(diào)用模塊在運(yùn)行時加載;加載時,它被映射到調(diào)用進(jìn)程的地址空間。在VC中有一類工程用于創(chuàng)建DLL。


  • 庫程序文件 .C:相當(dāng)于給出一組函數(shù)定義的源代碼;
  • 模塊定義文件 .DEF:相當(dāng)于定義鏈接選項(xiàng),也可在源代碼中定義;如:DLL中函數(shù)的引入和引出(dllimport和dllexport)。
  • 編譯程序利用 .C文件生成目標(biāo)模塊 .OBJ
  • 庫管理程序利用 .DEF文件生成DLL輸入庫 .LIB和輸出文件 .EXP
  • 鏈接程序利用 .OBJ和 .EXP文件生成動態(tài)鏈接庫 .DLL。

5.2. DLL的裝入方法

1)裝入時動態(tài)鏈接(load-time):

  • 在編程時顯式調(diào)用某個DLL函數(shù),該DLL函數(shù)在可執(zhí)行文件中稱為引入(import)函數(shù)。
  • 鏈接時需利用 .LIB文件。在可執(zhí)行文件中為引入的每個DLL建立一個IMAGE_IMPORT_DESCRIPTOR結(jié)構(gòu)。
  • 在裝入時由系統(tǒng)根據(jù)該DLL映射在進(jìn)程中的地址改寫Import Address Table中的各項(xiàng)函數(shù)指針。Hint是DLL函數(shù)在DLL文件中的序號,當(dāng)DLL文件修改后,就未必指向原先的DLL函數(shù)。在裝入時,系統(tǒng)會查找相應(yīng)DLL,并把它映射到進(jìn)程地址空間,獲得DLL中各函數(shù)的入口地址,定位本進(jìn)程中對這些函數(shù)的引用
裝入時動態(tài)鏈接過程:


(注:Import Address Table是在裝入時依據(jù)DLL模塊的加載位置確定)。



「DLL函數(shù)的調(diào)用過程:」



2)運(yùn)行時動態(tài)鏈接(run-time):

在編程時通過LoadLibrary(給出DLL名稱,返回裝入和鏈接之后該DLL的句柄), FreeLibrary, GetProcAddress(其參數(shù)包括函數(shù)的符號名稱,返回該函數(shù)的入口指針)等API來使用DLL函數(shù)。這時不再需要引入庫(import library)。


  • LoadLibrary或LoadLibraryEx把可執(zhí)行模塊映射到調(diào)用進(jìn)程的地址空間,返回模塊句柄;
  • GetProcAddress獲得DLL中特定函數(shù)的指針,返回函數(shù)指針;
  • FreeLibrary把DLL模塊的引用計(jì)數(shù)減1;當(dāng)引用計(jì)數(shù)為0時,拆除DLL模塊到進(jìn)程地址空間的映射;
運(yùn)行時動態(tài)鏈接的例子:


HINSTANCE hInstLibrary;//模塊句柄定義
DWORD (WINAPI *InstallStatusMIF)(char*, char*, char*, char*, char*, char*, char*, BOOL);//函數(shù)指針定義
if (hInstLibrary = LoadLibrary("ismif32.dll"))//映射
{
InstallStatusMIF = (DWORD (WINAPI *)(char*,char*,char*, char*, char*, char*, char*, BOOL))      GetProcAddress(hInstLibrary, "InstallStatusMIF");//獲得函數(shù)指針
if (InstallStatusMIF)
{
if (InstallStatusMIF(“office97”, “Microsoft”, “Office 97”, “999.999”, “ENU”, “1234”, ”Completed successfully”, TRUE) !=0)//調(diào)用DLL模塊中的函數(shù)
{
}
}
FreeLibrary(hInstLibrary);//拆除映射
}
作者:hguisu原文地址:https://blog.csdn.net/hguisu/article/details/5713099版權(quán)歸原作者所有,如有侵權(quán),請聯(lián)系刪除。????????????????  END  ????????????????


關(guān)注我的微信公眾號,回復(fù)“加群”按規(guī)則加入技術(shù)交流群。


歡迎關(guān)注我的視頻號:
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護(hù)是驅(qū)動電源設(shè)計(jì)中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機(jī)驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計(jì)工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉