雜記記憶體對映mmap

2022-08-01 19:24:14 字數 1239 閱讀 1524

前面有講過資料的流動是必須得經過作業系統的,但是有一種基於vm物件的方式可以讓資料不經過作業系統而直接到檔案,提高效率。

具體描述如下:

在講述檔案對映的概念時, 不可避免的要牽涉到虛存(svr 4的vm). 實際上, 檔案對映是虛存的中心概念, 檔案對映一方面給使用者提供了一組措施, 使用者將檔案對映到自己位址空間的某個部分, 使用簡單的記憶體訪問指令讀寫檔案;另一方面, 它也可以用於核心的基本組織模式, 在這種模式種, 核心將整個位址空間視為諸如檔案之類的一組不同物件的對映中的傳統檔案訪問方式是, 首先用open系統呼叫開啟檔案, 然後使用read, write以及lseek等呼叫進行順序或者隨即的i/o. 這種方式是非常低效的, 每一次i/o操作都需要一次系統呼叫. 另外, 如果若干個程序訪問同乙個檔案, 每個程序都要在自己的位址空間維護乙個副本, 浪費了記憶體空間. 而如果能夠通過一定的機制將頁面對映到程序的位址空間中, 也就是說首先通過簡單的產生某些記憶體管理資料結構完成對映的建立. 當程序訪問頁面時產生乙個缺頁中斷, 核心將頁面讀入記憶體並且更新頁表指向該頁面. 而且這種方式非常方便於同一副本的共享.

vm是物件導向的方法設計的, 這裡的物件是指記憶體物件: 記憶體物件是乙個軟體抽象的概念, 它描述記憶體區與後備儲存之間的對映. 系統可以使用多種型別的後備儲存, 比如交換空間, 本地或者遠端檔案以及幀快取等等. vm系統對它們統一處理, 採用同一操作集操作, 比如讀取頁面或者回寫頁面等. 每種不同的後備儲存都可以用不同的方法實現這些操作. 這樣, 系統定義了一套統一的介面, 每種後備儲存給出自己的實現方法. 這樣, 程序的位址空間就被視為一組對映到不同資料物件上的的對映組成. 所有的有效位址就是那些對映到資料物件上的位址. 這些物件為對映它的頁面提供了永續性的後備儲存. 對映使得使用者可以直接定址這些物件.

值得提出的是, vm體系結構獨立於unix系統, 所有的unix系統語義, 如正文, 資料及堆疊區都可以建構在基本vm系統之上. 同時, vm體系結構也是獨立於儲存管理的, 儲存管理是由作業系統實施的, 如: 究竟採取什麼樣的對換和請求調頁演算法, 究竟是採取分段還是分頁機制進行儲存管理, 究竟是如何將虛擬位址轉換成為實體地址等等(linux中是一種叫three level page table的機制), 這些都與記憶體物件的概念無關.

看了這麼多知道了,mmap是linux下用來給特定的驅動檔案分配乙個虛擬記憶體頁的操作,其目的和以前沒什麼兩樣,就是來把底層的資料讀到使用者空間來。而以前是用read和write等操作,現在是先用mmap分配乙個虛擬記憶體頁並返回乙個起始位址,然後再對該虛擬記憶體位址操作就相當於對檔案操作了。這樣做只是為了提高資料傳輸速率和規模。

mmap記憶體對映

記憶體對映是個很有用,也很有意思的思想。我們都知道作業系統分為使用者態和核心態,使用者態是不能直接和物理裝置打交道的,如果想把硬碟的一塊區域讀到使用者態,則需要兩次拷貝 硬碟 核心 使用者 但是記憶體對映的設計只需要發生一次的拷貝,大大的提高了讀取資料的效率。那麼記憶體對映的原理和核心是如何實現的呢...

記憶體對映mmap

應用與裝置驅動之間資料互動,很多時候都使用copy to user與copy from user。但如果在追求高效能的驅動上,這種拷貝顯然不是最佳的做法。linux核心提供了一種記憶體對映的機制,它主要完成將裝置的位址空間對映到使用者空間或者直接使用使用者空間中的位址,這樣做的目的顯然是為了提公升系...

mmap記憶體對映

記憶體對映是個很有用,也很有意思的思想。我們都知道作業系統分為使用者態和核心態,使用者態是不能直接和物理裝置打交道的,如果想把硬碟的一塊區域讀到使用者態,則需要兩次拷貝 硬碟 核心 使用者 但是記憶體對映的設計只需要發生一次的拷貝,大大的提高了讀取資料的效率。那麼記憶體對映的原理和核心是如何實現的呢...