日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Linux中獲取頁表偏移的方法(linux獲取頁表偏移)

在Linux操作系統(tǒng)中,頁表是一種非常重要的數(shù)據(jù)結(jié)構(gòu)。它被用來管理內(nèi)存的分配和釋放,同時也避免了內(nèi)存空間的重復(fù)使用。在許多情況下,我們需要獲得頁表的偏移量,以便進(jìn)行一些內(nèi)存管理操作。本文將會介紹如何在Linux中獲取頁表偏移量的方法。

目前創(chuàng)新互聯(lián)公司已為超過千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁空間、網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計、川匯網(wǎng)站維護(hù)等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

1. 什么是頁表

在介紹如何獲取頁表偏移量之前,首先需要了解什么是頁表?,F(xiàn)代電腦的內(nèi)存是由一系列固定大小的頁面組成的。而通常情況下,每個頁面都被安裝一個唯一的序列號,這個序列號被稱為頁幀號(PFN)。頁表是一種數(shù)據(jù)結(jié)構(gòu),用來維護(hù)虛擬地址和物理地址之間的映射關(guān)系。虛擬地址為每個頁面分配了一個唯一的索引,這個索引被稱為虛擬頁面號(VPN)。當(dāng)應(yīng)用程序嘗試訪問一個虛擬地址時,操作系統(tǒng)會通過頁表將該虛擬頁面號映射到一個物理頁面號,然后再將該物理頁映射到實(shí)際的物理內(nèi)存地址。

2. 頁表偏移量的定義

頁表偏移量指的是一個頁面開頭距離頁表頭的距離。在Linux中,頁表信息存儲在內(nèi)核空間的頁表數(shù)組中。數(shù)組的基地址是一個結(jié)構(gòu)體pt_head,它包含一個指向頁表數(shù)組頭部的指針。假設(shè)想要訪問第n個頁表項,那么我們需要找到其在頁表數(shù)組中的偏移量,即:

offset = n * sizeof(struct page) – PAGE_OFFSET

其中PAGE_OFFSET是內(nèi)核空間的起始地址,而struct page是一個包含關(guān)于虛擬內(nèi)存頁面的信息的結(jié)構(gòu)體。我們可以將其定義在“include/linux/mm_types.h”文件中。

了解了頁表偏移量的概念之后,我們接下來可以介紹如何在Linux中獲取頁表偏移量。

3. 使用pfn_to_page函數(shù)

在Linux中,我們可以使用pfn_to_page函數(shù)來獲取虛擬頁面號(VPN)在頁表數(shù)組中的偏移量。該函數(shù)定義在“include/linux/mm_types.h”文件中。

pfn_to_page接收一個頁面號作為參數(shù),并返回一個指向該頁面所在struct page結(jié)構(gòu)體的指針。 也就是說,pfn_to_page函數(shù)提供了一個從虛擬地址(或者PFN)到頁表數(shù)組索引的映射,因此它也是一個獲取頁表偏移量的重要函數(shù)。

下面給出一個示例程序,來說明如何使用pfn_to_page函數(shù)獲取頁表偏移量:

#include

int get_page_table_offset(unsigned long virt_addr) {

unsigned long pfn = virt_to_phys(virt_addr) >> PAGE_SHIFT;

struct page *page_ptr = pfn_to_page(pfn);

unsigned long offset = (unsigned long)page_ptr – (unsigned long)pt_head.page_table;

return offset / sizeof(struct page);

}

上述代碼中,get_page_table_offset函數(shù)接收一個虛擬地址,并通過virt_to_phys函數(shù)將其轉(zhuǎn)換為頁幀號。然后,它使用pfn_to_page函數(shù)獲取該頁面的struct page結(jié)構(gòu)體指針。它計算該頁面在頁表數(shù)組中的偏移量(以頁表項數(shù)量計算),并將其返回。

4. 結(jié)論

成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián),建站經(jīng)驗(yàn)豐富以策略為先導(dǎo)10多年以來專注數(shù)字化網(wǎng)站建設(shè),提供企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計,響應(yīng)式網(wǎng)站制作,設(shè)計師量身打造品牌風(fēng)格,熱線:028-86922220

linux內(nèi)核參與分頁嗎

參與吧!(答案非常不準(zhǔn)確,僅供參考)

頁式管理用以將線性地址轉(zhuǎn)化成物理地址,并對訪問權(quán)限進(jìn)行檢查。每個頁面都是一個大小為4KB的連續(xù)空間,并按4KB對齊。從80386開始,Intel處理器開始支持頁式管理,CR0寄存器的PG標(biāo)志位用來表示是否支持分頁。

1、標(biāo)準(zhǔn)分頁

i386采用二級分頁,其線性地址的結(jié)構(gòu)如下:

Dir

Page

Offset

其中,Dir有10位,表示頁表目錄項的下標(biāo),指向一個頁表;Page有10位,表示一個具體頁表中的目錄項的下標(biāo),指向一個物理頁面;Offset有12位,表示在物理頁面中的偏移量(單位為字節(jié))。

i386中,從線性地址到物理地址的映射過程為:

(1)從CR3寄存器中取得頁目錄(頁目錄中包含1024條記錄,每個記錄4字節(jié),正好為4KB,占用一個頁面)的基地址;

(2)以線性地址中的Dir為下標(biāo),從目錄中取出相應(yīng)頁表的基地址;

(3)以線性地址中的Page為下標(biāo),從頁表中取出相應(yīng)的頁面描述結(jié)構(gòu);

(4)將頁面描述符中的基地址與線性地址中的Offset偏移量相加,獲得實(shí)際的物理地址。

2、頁描述表項

在i386中,頁目錄和頁表的結(jié)構(gòu)相同,頁描述表項的結(jié)構(gòu)如下:

Address

Avail

G

PS

D

A

PCD

PWT

U/S

R/W

P

其中,Address有20位,表示對應(yīng)頁表或頁的物理地址的高20位(由于頁總是按4KB對其,故低12位恒為0);Avail有3位,供系統(tǒng)程序員使用;G只有1位,在頁目錄項中表示該頁是否為全局頁,在頁表項中忽略;PS只有1位,在頁表目錄項中為1表示為4MB的頁,為0表示為4KB的頁;D只有1位,在頁表目錄項中未使用,在頁表項中表示該頁是否氏盯讓山已被更改;A只有1位,表示該頁是否已被訪問過;PCD只有一位,表示該項是否禁止被緩存;PWT只有一位,為1表示使用write-through緩存策略,0表示使用write-back緩存策略;U/S只有一位,為1表示訪問該頁是否可以在用戶態(tài)下訪問;R/W只有一位,表示該項是否可寫;P只有1位,表示該項是否在內(nèi)存中。

如果要使用4MB的擴(kuò)展分頁,則要求CR4寄存器中的PSE標(biāo)志被置1。此時,系統(tǒng)僅采用一級分頁策略,線性地址前10位為頁表項,后22位為偏移量,且頁按4MB對齊,頁描述表項中Address僅有高10位有效。

3、物理地址擴(kuò)展(PAE)分頁機(jī)制

從Pentium Pro開始,Intel處理器的地址總線寬度增加到了36位,共支持訪問64GB的內(nèi)存。同時,Intel提供了PAE和頁大小擴(kuò)展(PSE-36)兩種機(jī)制用以將32位的線性地址轉(zhuǎn)化成36位的物理地址。其中,后者從Pentium III開始提供,且未在Linux內(nèi)核中使用。

要啟用PAE機(jī)制必須將CR4寄存器中的PAE標(biāo)志置位。PAE啟用后,處理器會對分頁機(jī)制做如下更改:

(1)將64GB的內(nèi)存空間劃分成2^24個不同頁面,頁表項的體積擴(kuò)展為64位,物理地址域擴(kuò)展為24位;

(2)引入新的更高一級頁表,稱為頁目錄指針表(PDPT),其中包含4個64位的項;

(3)CR3寄存器中包含27位的PDPT的高位地址(其低5位地址為0);

(4)當(dāng)將線性地址映射到4KB的頁面時,CR3由高位到低位依次為2位PDPT索引,Array位頁目錄索引,Array位頁表索引,12位頁內(nèi)偏移;當(dāng)將線性地址映射到4KB的頁面時,CR3由高位到低位依次為2位PDPT索引,Array位頁目錄索引,21位頁內(nèi)偏移。

但是,PAE機(jī)制并未增大單個進(jìn)程能夠訪問的地址空間,僅僅將內(nèi)核能夠訪問的地址空間增加到了64GB。

4、Linux內(nèi)核中的分頁

Linux內(nèi)核對分頁機(jī)制的依賴性很強(qiáng),其使用一種適合32位和64位結(jié)構(gòu)的通用分頁模型,該模型使用四級分頁,即頁全局目錄、頁上層目錄、頁中層目錄和頁表。

對于不同的體系結(jié)構(gòu),Linux采用的四級頁表目錄的大小有所不同:對于i386而言,僅采用二級頁表,即頁上層目錄和頁中層目錄長度為0;對于啟用PAE的i386,采用了三級頁表,即頁上層目錄長度為0;對于64位體系結(jié)構(gòu),可以采用三級或四級頁表,具體選擇由硬件決殲滑和定。

linux內(nèi)核中沒有分頁內(nèi)存嗎?是的,沒有,那么windows的內(nèi)核為何就有呢?畢竟不是一個家族不好做全方位的評判,我的結(jié)論就是linux上的任何的程序只將內(nèi)核作為一個平臺而不依賴內(nèi)核。這個事實(shí)的結(jié)果就是在linux內(nèi)核中不能分配過大的內(nèi)存,linux內(nèi)核中唯一可以分配大內(nèi)存的地方就是vmalloc區(qū)域,僅僅放松了對物理內(nèi)存連續(xù)的限制,在vmalloc中分配內(nèi)存只要求虛擬內(nèi)存連續(xù),并且事實(shí)上最多只能分配128M的內(nèi)存,這是linux內(nèi)核中最寬松的限制了。

在linux中,一切功能都可以由用戶空間應(yīng)用程序來解決,就連殺毒程序也不例外,這是因?yàn)閘inux有強(qiáng)大的安全機(jī)制,單點(diǎn)驗(yàn)證機(jī)制,只要linux保證任何用戶不能隨意su到root權(quán)限就可以了,這事實(shí)上就是一個消除一切漏洞的行為,只要操作系統(tǒng)安全機(jī)制沒有漏洞,只要內(nèi)核沒有漏洞,那么一切惡意程序的得逞完全歸結(jié)于該惡意程序所利用的用戶空間應(yīng)用程序設(shè)計的不足,而且這件事在linux看來,內(nèi)核完全沒有必要過問,正如一個國家的機(jī)關(guān)只認(rèn)百姓的請求以及該請求的代理權(quán)限,只要認(rèn)證通過就給與服務(wù)而不再對別的情況加以過問,linux只是一個服務(wù)者罷了,它不喜歡任何額外的機(jī)制要靠內(nèi)核來完成,也就是說任何用戶都不要隨意動不動就用內(nèi)核實(shí)現(xiàn)一個機(jī)制,只要在用戶空間實(shí)現(xiàn)就好了。

看看windows下的殺毒程序這一簡單的使用內(nèi)核來完成的程序,正是由于windows不能保證復(fù)雜但是薄弱的用戶空間機(jī)制都是安全的,才會動用內(nèi)核來實(shí)現(xiàn)更高級別的安全管理,它沒有l(wèi)inux的那種簡單但是可以信賴的單點(diǎn)驗(yàn)證機(jī)制。正如微軟建議的那樣,在沒有別的辦法的時候請實(shí)現(xiàn)一個驅(qū)動程序,在DriverEntry中完成一切。既然微軟會建議程序員編寫內(nèi)核驅(qū)動,那么微軟的操作系統(tǒng)當(dāng)然也把內(nèi)核空間的開發(fā)開放給了程序員,于是DDK成了很大一部分人最后的救命稻草,既然將內(nèi)核驅(qū)動的開發(fā)開放給了程序員,那么如何使用內(nèi)存就不應(yīng)該有任何限制,再者windows希望用一種簡單一致的機(jī)制管理所有的不管是用戶空間還是內(nèi)核空間的內(nèi)存,于是內(nèi)核空間的內(nèi)存管理和用戶空間的內(nèi)存管理大體上沒有區(qū)別,都可以使用分頁內(nèi)存,說一句可能讓windows的粉絲不愿意聽的話:我們windows實(shí)現(xiàn)的不是很安全,所以你們可以用內(nèi)核這個更高級別的執(zhí)行緒以權(quán)勢壓人。反觀linux,開源的linux難道沒有將內(nèi)核開放給程序員嗎?不,絕對的開放,看看lkml的熱鬧程度吧!但是不同的是,linux下開發(fā)內(nèi)核是完全為了內(nèi)核本身的機(jī)制擴(kuò)展而不涉及任何用戶策略,linux的內(nèi)核和用戶應(yīng)用分得比較開,不信你去內(nèi)核郵件列表去問一個應(yīng)用的問題,看看有沒有人罵。

關(guān)于linux 獲取頁表偏移的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。

成都網(wǎng)站建設(shè)選創(chuàng)新互聯(lián)(?:028-86922220),專業(yè)從事成都網(wǎng)站制作設(shè)計,高端小程序APP定制開發(fā),成都網(wǎng)絡(luò)營銷推廣等一站式服務(wù)。


標(biāo)題名稱:Linux中獲取頁表偏移的方法(linux獲取頁表偏移)
網(wǎng)站路徑:http://www.dlmjj.cn/article/dpjjegp.html