您好,登錄后才能下訂單哦!
今天小編給大家分享一下linux如何實現虛擬內存的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
虛擬內存的實現需要建立在離散分配的內存管理方式的基礎上,實現方法有3種:1、請求分頁存儲管理方式;2、請求分段存儲管理方式;3、段頁式存儲管理方式。不管哪種方式,都需要有一定的硬件支持:1、一定容量的內存和外存;2、頁表機制(或段表機制),作為主要的數據結構;3、中斷機構,當用戶程序要訪問的部分尚未調入內存,則產生中斷;4、地址變換機構,邏輯地址到物理地址的變換。
傳統存儲管理方式同時將多個進程保存在內存中以便允許多道程序設計。它們都具有以下兩個共同的特征:
一次性: 作業必須一次性全部裝入內存后,方能開始運行。這會導致兩種情況發生:
1)當作業很大,不能全部被裝入內存時,將使該作業無法運行;
2)當大量作業要求運行時,由于內存不足以容納所有作業,只能使少數作業先運行,導致多道程序度的下降。駐留性: 作業被裝入內存后,就一直駐留在內存中,其任何部分都不會被換出,直至作業運行結束。運行中的進程,會因等待 I/O 而被阻塞,可能處于長期等待狀態。
因此,許多在程序運行中不用或暫時不用的程序(數據)占據了大量的內存空間,而一些需要運行的作業又無法裝入運行,顯然浪費了寶貴的內存資源。
1.1 虛擬存儲器的定義和特征
基于局部性原理,在程序裝入時,可以將程序的一部分裝入內存,而將其余部分留在外存,就可以啟動程序執行。在程序執行過程中,當所訪問的信息不在內存時,由操作系統將所需要的部分調入內存,然后繼續執行程序。另一方面,操作系統將內存中暫時不使用的內容換出到外存上,從而騰出空間存放將要調入內存的信息。
這樣,由于系統提供了部分裝入、請求調入和置換功能后(對用戶完全透明),給用戶的感覺是好像存在一個比實際物理內存大得多的存儲器,稱為虛擬存儲器。
虛擬存儲器的大小由計算機的地址結構決定,并非是內存和外存的簡單相加。
虛擬存儲器有以下三個主要特征:
多次性:無需在作業運行時一次性地全部裝入內存,而是允許被分成多次調入內存運行。
對換性:無需在作業運行時一直常駐內存,而是允許在作業的運行過程中,進行換進和換出。
虛擬性:從邏輯上擴充內存的容量,使用戶所看到的內存容量,遠大于實際的內存容量。
1.2 虛擬內存技術的實現
虛擬內存中,允許將一個作業分多次調入內存。
釆用連續分配方式時,會使相當一部分內存空間都處于暫時或“永久”的空閑狀態,造成內存資源的嚴重浪費,而且也無法從邏輯上擴大內存容量。
因此,虛擬內存的實現需要建立在離散分配的內存管理方式的基礎上。虛擬內存的實現有以下三種方式:
請求分頁存儲管理
請求分段存儲管理
段頁式存儲管理
不管哪種方式,都需要有一定的硬件支持。一般需要的支持有以下幾個方面:
一定容量的內存和外存。
頁表機制(或段表機制),作為主要的數據結構。
中斷機構,當用戶程序要訪問的部分尚未調入內存,則產生中斷。
地址變換機構,邏輯地址到物理地址的變換。
連續分配方式:指為一個用戶程序分配一個連續的內存空間。
固定分區分配:將內存空間劃分為若干個固定大小的區域,在每個分區中只裝入一道作業,便可以有多道作業并發執行。缺乏靈活性,會產生大量的內部碎片,內存的利用率很低。
動態分區分配:根據進程的實際需要,動態地為之分配內存空間。作業裝入內存時,把可用內存分出一個連續區域給作業,且分區的大小正好合適作業大小的需要。會產生很多外部碎片。
離散分配方式:將一個進程分散地裝入到許多不相鄰的分區中,便可充分地利用內存。
分頁存儲的概念:
頁面、頁框和塊。進程中的塊稱為頁或頁面(Page),具有頁號;內存中的塊稱為頁框(Page Frame,頁框=內存塊=物理塊=物理頁面),具有頁框號。外存也以同樣的單位進行劃分,直接稱為塊(Block)。進程在執行時需要申請主存空間,就是要為每個頁面分配主存中的可用頁框,這就產生了頁和頁框的一一對應。各個頁面不必連續存放,可以放到不相鄰的各個頁框中。
地址結構:前一部分為頁號P,后一部分為頁內偏移量W。地址長度為32 位,其中0~11位為頁內地址,即每頁大小為4KB;12~31位為頁號,地址空間最多允許有2^20頁。
頁表。為了便于在內存中找到進程的每個頁面所對應的物理塊,系統為每個進程建立一張頁表,記錄頁面在內存中對應的物理塊號,頁表一般存放在內存中。在配置了頁表后,進程執行時,通過查找該表,即可找到每頁在內存中的物理塊號。可見,頁表的作用是實現從頁號到物理塊號的地址映射。
請求分頁是目前最常用的一種實現虛擬存儲器的方法。
請求分頁系統建立在基本分頁系統基礎之上,為了支持虛擬存儲器功能而增加了請求調頁功能和頁面置換功能。
在請求分頁系統中,只要求將當前需要的一部分頁面裝入內存,便可以啟動作業運行。
在作業執行過程中,當所要訪問的頁面不在內存時,再通過調頁功能將其調入,同時還可以通過置換功能將暫時不用的頁面換出到外存上,以便騰出內存空間。
為了實現請求分頁,系統必須提供一定的硬件支持。除了需要一定容量的內存及外存的計算機系統,還需要有頁表機制、缺頁中斷機構、地址變換機構。
2.1 頁表機制
請求分頁系統的頁表機制不同于基本分頁系統,請求分頁系統在一個作業運行之前不要求全部一次性調入內存。
因此在作業的運行過程中,必然會出現要訪問的頁面不在內存的情況,如何發現和處理這種情況是請求分頁系統必須解決的兩個基本問題。為此,在請求頁表項中增加了四個字段,分別為:
頁號 | 物理塊號 | 狀態位 P | 訪問字段 A | 修改位 M | 外存地址 |
狀態位 P:用于指示該頁是否已調入內存,供程序訪問時參考。
訪問字段 A:用于記錄本頁在一段時間內被訪問的次數,或記錄本頁最近己有多長時間未被訪問,供置換算法換出頁面時參考。
修改位 M:標識該頁在調入內存后是否被修改過。
外存地址:用于指出該頁在外存上的地址,通常是物理塊號,供調入該頁時參考。
2.2 缺頁中斷機構
在請求分頁系統中,每當所要訪問的頁面不在內存時,便產生一個缺頁中斷,請求操作系統將所缺的頁調入內存。
此時應將缺頁的進程阻塞(調頁完成喚醒),如果內存中有空閑塊,則分配一個塊,將要調入的頁裝入該塊,并修改頁表中相應頁表項;若此時內存中沒有空閑塊,則要淘汰某頁(若被淘汰頁在內存期間被修改過,則要將其寫回外存)。
缺頁中斷作為中斷同樣要經歷,諸如保護CPU環境、分析中斷原因、轉入缺頁中斷處理程序、恢復CPU環境等幾個步驟。但與一般的中斷相比,它有以下兩個明顯的區別:
在指令執行期間產生和處理中斷信號,而非一條指令執行完后,屬于內部中斷。
一條指令在執行期間,可能產生多次缺頁中斷。
2.3 地址變換機構
請求分頁系統中的地址變換機構,是在分頁系統地址變換機構的基礎上,為實現虛擬內存,又增加了某些功能而形成的。
在進行地址變換時,先檢索快表:
若找到要訪問的頁,便修改頁表項中的訪問位(寫指令則還須重置修改位),然后利用頁表項中給出的物理塊號和頁內地址形成物理地址。
若未找到該頁的頁表項,應到內存中去查找頁表,再對比頁表項中的狀態位P,看該頁是否已調入內存,未調入則產生缺頁中斷,請求從外存把該頁調入內存。
頁表指出邏輯地址中的頁號與所占主存物理塊號的對應關系。頁式存儲管理在用動態重定位方式裝入作業時,要利用頁表做地址轉換工作。
快表(TLB,Translation Lookaside Buffer)就是存放在高速緩沖存儲器的部分頁表。作為當前進程頁表的Cache,它的作用與頁表相似,但加快了地址映射速度,提高了訪問速率。由于采用頁表做地址轉換,讀寫內存數據時CPU要訪問兩次主存(查詢頁表、訪問目的地址)。
有了快表,有時只要訪問一次高速緩沖存儲器,一次主存,這樣可加速查找并提高指令執行速度。
進程運行時,若其訪問的頁面不在內存而需將其調入,但內存已無空閑空間時,就需要從內存中調出一頁程序或數據,送入磁盤的對換區。
選擇調出頁面的算法就稱為頁面置換算法。好的頁面置換算法應有較低的頁面更換頻率,也就是說,應將以后不會再訪問或者以后較長時間內不會再訪問的頁面先調出。
3.1 最佳置換算法(OPT)
最佳(Optimal, OPT)置換算法所選擇的被淘汰頁面將是以后永不使用的,或者是在最長時間內不再被訪問的頁面,這樣可以保證獲得最低的缺頁率。
但由于人們目前無法預知進程在內存下的若千頁面中哪個是未來最長時間內不再被訪問的,因而該算法無法實現,但最佳置換算法可以用來評價其他算法。
假定系統為某進程分配了三個物理塊,并考慮有以下頁面號引用串:
7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1
進程運行時,先將7, 0, 1三個頁面依次裝入內存。進程要訪問頁面2時,產生缺頁中斷,根據最佳置換算法,選擇第18次訪問才需調入的頁面7予以淘汰。然后,訪問頁面0時,因為已在內存中所以不必產生缺頁中斷。訪問頁面3時又會根據最佳置換算法將頁面1淘汰……依此類推。從圖中可以看出釆用最佳置換算法時的情況。
訪問頁面 | 7 | 0 | 1 | 2 | 0 | 3 | 0 | 4 | 2 | 3 | 0 | 3 | 2 | 1 | 2 | 0 | 1 | 7 | 0 | 1 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
物理塊1 | 7 | 7 | 7 | 2 | 2 | 2 | 2 | 2 | 7 | |||||||||||
物理塊2 | 0 | 0 | 0 | 0 | 4 | 0 | 0 | 0 | ||||||||||||
物理塊3 | 1 | 1 | 3 | 3 | 3 | 1 | 1 | |||||||||||||
缺頁否 | √ | √ | √ | √ | √ | √ | √ | √ |
可以看到,發生缺頁中斷的次數為9,頁面置換的次數為6。
3.2 先進先出(FIFO)頁面置換算法
優先淘汰最早進入內存的頁面,亦即在內存中駐留時間最久的頁面。
該算法實現簡單,只需把調入內存的頁面根據先后次序鏈接成隊列,設置一個指針總指向最早的頁面。但該算法與進程實際運行時的規律不適應,因為在進程中,有的頁面經常被訪問。
訪問頁面 | 7 | 0 | 1 | 2 | 0 | 3 | 0 | 4 | 2 | 3 | 0 | 3 | 2 | 1 | 2 | 0 | 1 | 7 | 0 | 1 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
物理塊1 | 7 | 7 | 7 | 2 | 2 | 2 | 4 | 4 | 4 | 0 | 0 | 0 | 7 | 7 | 7 | |||||
物理塊2 | 0 | 0 | 0 | 3 | 3 | 3 | 2 | 2 | 2 | 1 | 1 | 1 | 0 | 0 | ||||||
物理塊3 | 1 | 1 | 1 | 0 | 0 | 0 | 3 | 3 | 3 | 2 | 2 | 2 | 1 | |||||||
缺頁否 | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ |
利用FIFO算法時進行了 12 次頁面置換,比最佳置換算法正好多一倍。
FIFO算法還會產生當所分配的物理塊數增大而頁故障數不減反增的異常現象,這是由 Belady于1969年發現,故稱為Belady異常,如下表所示。
訪問頁面 | 1 | 2 | 3 | 4 | 1 | 2 | 5 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
物理塊1 | 1 | 1 | 1 | 4 | 4 | 4 | 5 | 5 | 5 | |||
物理塊2 | 2 | 2 | 2 | 1 | 1 | 1 | 3 | 3 | ||||
物理塊3 | 3 | 3 | 3 | 2 | 2 | 2 | 4 | |||||
缺頁否 | √ | √ | √ | √ | √ | √ | √ | √ | √ | |||
增加物理塊數后對比 | ||||||||||||
物理塊1* | 1 | 1 | 1 | 1 | 5 | 5 | 5 | 5 | 4 | 4 | ||
物理塊2* | 2 | 2 | 2 | 2 | 1 | 1 | 1 | 1 | 5 | |||
物理塊3* | 3 | 3 | 3 | 3 | 2 | 2 | 2 | 2 | ||||
物理塊4* | 4 | 4 | 4 | 4 | 3 | 3 | 3 | |||||
缺頁否 | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ |
只有FIFO算法可能出現Belady異常,而LRU和OPT算法永遠不會出現Belady異常。
3.3 最近最久未使用(LRU)置換算法
最近最久未使用(LRU,Least Recently Used)置換算法選擇最近最長時間未訪問過的頁面予以淘汰,它認為過去一段時間內未訪問過的頁面,在最近的將來可能也不會被訪問。
該算法為每個頁面設置一個訪問字段,來記錄頁面自上次被訪問以來所經歷的時間,淘汰頁面時選擇現有頁面中值最大的予以淘汰。
訪問頁面 | 7 | 0 | 1 | 2 | 0 | 3 | 0 | 4 | 2 | 3 | 0 | 3 | 2 | 1 | 2 | 0 | 1 | 7 | 0 | 1 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
物理塊1 | 7 | 7 | 7 | 2 | 2 | 4 | 4 | 4 | 0 | 1 | 1 | 1 | ||||||||
物理塊2 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 3 | 3 | 0 | 0 | |||||||||
物理塊3 | 1 | 1 | 3 | 3 | 2 | 2 | 2 | 2 | 2 | 7 | ||||||||||
缺頁否 | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ |
LRU性能較好,但需要寄存器和棧的硬件支持,開銷更大。
LRU是堆棧類的算法。理論上可以證明,堆棧類算法不可能出現Belady異常。FIFO算法基于隊列實現,不是堆棧類算法。
3.4 時鐘(CLOCK)置換算法
LRU算法的性能接近于OPT,但是實現起來比較困難,且開銷大;FIFO算法實現簡單,但性能差。所以操作系統的設計者嘗試了很多算法,試圖用比較小的開銷接近LRU的性能,這類算法都是CLOCK算法的變體。
簡單的CLOCK算法是給每一幀關聯一個附加位,稱為使用位。當某一頁首次裝入主存,以及后續被訪問時,使用位被置為1。
對于頁替換算法,用于替換的候選幀集合看做一個循環緩沖區,并且有一個指針與之相關聯。當某一頁被替換時,該指針被設置成指向緩沖區中的下一幀。
當需要替換一頁時,操作系統掃描緩沖區,以查找第一個使用位為0的一幀。每當遇到一個使用位為1的幀時,操作系統就將該位重新置為0;如果所有幀的使用位均為1,則指針在緩沖區中完整地循環一周,把所有使用位都置為0,并且停留在最初的位置上,替換該幀中的頁。由于該算法循環地檢查各頁面的情況,故稱為CLOCK算法,又稱為最近未用(Not Recently Used, NRU)算法。
CLOCK算法的性能比較接近LRU,而通過增加使用的位數目,可以使得CLOCK算法更加高效。在使用位used的基礎上再增加一個修改位modified,則得到改進型的CLOCK置換算法。
每一幀都處于以下四種情況之一:
最近未被訪問,也未被修改(u=0, m=0)。
最近被訪問,但未被修改(u=1, m=0)。
最近未被訪問,但被修改(u=0, m=1)。
最近被訪問,被修改(u=1, m=1)。
算法執行如下操作步驟:
從指針的當前位置開始,掃描幀緩沖區。在這次掃描過程中,對使用位不做任何修改。選擇遇到的第一個幀(u=0, m=0)用于替換。
如果第1步失敗,則重新掃描,查找(u=0, m=1)的幀。選擇遇到的第一個這樣的幀用于替換。在這個掃描過程中,對每個跳過的幀,把它的使用位設置成0。
如果第2步失敗,指針將回到它的最初位置,并且集合中所有幀的使用位均為0。重復第1步,并且如果有必要,重復第2步。這樣將可以找到供替換的幀。
改進型的CLOCK算法優于簡單CLOCK算法之處在于替換時首選沒有變化的頁。由于修改過的頁在被替換之前必須寫回,因而這樣做會節省時間。
4.1 駐留集大小
對于分頁式的虛擬內存,在準備執行時,不需要也不可能把一個進程的所有頁都讀取到主存,因此,操作系統必須決定讀取多少頁。也就是說,給特定的進程分配多大的主存空間,這需要考慮以下幾點:
分配給一個進程的存儲量越小,在任何時候駐留在主存中的進程數就越多,從而可以提高處理機的時間利用效率。
如果一個進程在主存中的頁數過少,盡管有局部性原理,頁錯誤率仍然會相對較高。
如果頁數過多,由于局部性原理,給特定的進程分配更多的主存空間對該進程的錯誤率沒有明顯的影響。
基于這些因素,現代操作系統通常釆用三種策略:
固定分配局部置換:它為每個進程分配一定數目的物理塊,在整個運行期間都不改變。若進程在運行中發生缺頁,則只能從該進程在內存中的頁面中選出一頁換出,然后再調入需要的頁面。實現這種策略難以確定為每個進程應分配的物理塊數目:太少會頻繁出現缺頁中斷,太多又會使CPU和其他資源利用率下降。
可變分配全局置換:這是最易于實現的物理塊分配和置換策略,為系統中的每個進程分配一定數目的物理塊,操作系統自身也保持一個空閑物理塊隊列。當某進程發生缺頁時,系統從空閑物理塊隊列中取出一個物理塊分配給該進程,并將欲調入的頁裝入其中。
可變分配局部置換:它為每個進程分配一定數目的物理塊,當某進程發生缺頁時,只允許從該進程在內存的頁面中選出一頁換出,這樣就不會影響其他進程的運行。如果進程在運行中頻繁地缺頁,系統再分配若干物理塊給該進程,直至該進程缺頁率趨于適當程度; 反之,若進程在運行中缺頁率特別低,則可適當減少分配給該進程的物理塊。
4.2 調入頁面的時機
為確定系統將進程運行時所缺的頁面調入內存的時機,可釆取以下兩種調頁策略:
預調頁策略:根據局部性原理,一次調入若干個相鄰的頁可能會比一次調入一頁更高效。但如果調入的一批頁面中大多數都未被訪問,則又是低效的。所以就需要釆用以預測為基礎的預調頁策略,將預計在不久之后便會被訪問的頁面預先調入內存。但目前預調頁的成功率僅約50%。故這種策略主要用于進程的首次調入時,由程序員指出應該先調入哪些頁。
請求調頁策略:進程在運行中需要訪問的頁面不在內存而提出請求,由系統將所需頁面調入內存。由這種策略調入的頁一定會被訪問,且這種策略比較易于實現,故在目前的虛擬存儲器中大多釆用此策略。它的缺點在于每次只調入一頁,調入調出頁面數多時會花費過多的I/O開銷。
4.3 從何處調入頁面
請求分頁系統中的外存分為兩部分:用于存放文件的文件區和用于存放對換頁面的對換區。對換區通常是釆用連續分配方式,而文件區釆用離散分配方式,故對換區的磁盤I/O速度比文件區的更快。這樣從何處調入頁面有三種情況:
系統擁有足夠的對換區空間:可以全部從對換區調入所需頁面,以提髙調頁速度。為此,在進程運行前,需將與該進程有關的文件從文件區復制到對換區。
系統缺少足夠的對換區空間:凡不會被修改的文件都直接從文件區調入(換出時不必寫回)。但對于那些可能被修改的部分,在將它們換出時須調到對換區,以后需要時再從對換區調入。
UNIX方式:與進程有關的文件都放在文件區,故未運行過的頁面,都應從文件區調入。曾經運行過但又被換出的頁面,由于是被放在對換區,因此下次調入時應從對換區調入。進程請求的共享頁面若被其他進程調入內存,則無需再從對換區調入。
5.1 頁面抖動(顛簸)
在頁面置換過程中的一種最糟糕的情形是,剛剛換出的頁面馬上又要換入主存,剛剛換入的頁面馬上就要換出主存,這種頻繁的頁面調度行為稱為抖動,或顛簸。如果一個進程在換頁上用的時間多于執行時間,那么這個進程就在顛簸。
頻繁的發生缺頁中斷(抖動),其主要原因是某個進程頻繁訪問的頁面數目高于可用的物理頁幀數目。虛擬內存技術可以在內存中保留更多的進程以提高系統效率。在穩定狀態,幾乎主存的所有空間都被進程塊占據,處理機和操作系統可以直接訪問到盡可能多的進程。但如果管理不當,處理機的大部分時間都將用于交換塊,即請求調入頁面的操作,而不是執行進程的指令,這就會大大降低系統效率。
5.2 工作集(駐留集)
工作集(或駐留集)是指在某段時間間隔內,進程要訪問的頁面集合。經常被使用的頁面需要在工作集中,而長期不被使用的頁面要從工作集中被丟棄。為了防止系統出現抖動現象,需要選擇合適的工作集大小。
工作集模型的原理是:讓操作系統跟蹤每個進程的工作集,并為進程分配大于其工作集的物理塊。如果還有空閑物理塊,則可以再調一個進程到內存以增加多道程序數。如果所有工作集之和增加以至于超過了可用物理塊的總數,那么操作系統會暫停一個進程,將其頁面調出并且將其物理塊分配給其他進程,防止出現抖動現象。
正確選擇工作集的大小,對存儲器的利用率和系統吞吐量的提高,都將產生重要影響。
分頁管理方式和分段管理方式在很多地方相似,比如內存中都是不連續的、都有地址變換機構來進行地址映射等。但兩者也存在著許多區別,表3-20列出了分頁管理方式和分段管理方式在各個方面的對比。
分頁 | 分段 | |
---|---|---|
目 的 | 頁是信息的物理單位,分頁是為實現離散分配方式,以消減內存的外零頭,提髙內存的利用率。或者說,分頁僅權是由于系統管理的需要而不是用戶的需要 | 是信息的邏輯單位,它含有一組其意義相對完整的信息。分段的目的是為了能更好地滿足用戶的需要 |
長 度 | 頁的大小固定且由系統決定,由系統把邏輯地址劃分為頁號和頁內地址兩部分,是由機器硬件實現的,因而在系統中只能有一種大小的頁面 | 段的長度不固定,決定于用戶所編寫的程序, 通常由編譯程序在對流程序進行編譯時,根據信息的性質來劃分 |
地址空間 | 作業地址空間是一維的,即單一的線性地址空間,程序員只需利用一個記憶符,即可表示 一個地址 | 作業地址空間是二維的,程序員在標識一個地址時,既需給出段名,又需給出段內地址 |
碎 片 | 有內部碎片,無外部碎片 | 有外部碎片,無內部碎片 |
”共享“和“動態鏈接” | 不容易實現 | 容易實現 |
以上就是“linux如何實現虛擬內存”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。