linux記憶體保護機制及程序間通訊原理

2021-05-24 11:47:08 字數 1018 閱讀 9259

linux的虛擬儲存器使得每個程序有著統一的、一致的4g位址空間。能支援該功能的主要本質是因為當頁面不在物理記憶體時,由於缺頁異常,將導致異常處理程式從交換空間中把資料換入物理記憶體,然後重新執行導致該異常的指令,而此時就可以正常的訪問,程序本身完全不用去關心該過程。

程序位址空間的低

3g是使用者空間即使用者態,所需的

cpu許可權為

3;而高

1g即為核心態,所需的

cpu許可權為1。

linux

通過這兩個許可權值來達到隔離使用者態與核心態目的。而兩者的通訊方式只能通過得到系統確認的系統呼叫方式來進行通訊,即當要訪問核心態的資料的時候,必須通過系統呼叫來訪問,而系統呼叫的最主要的乙個過程就是修改乙個暫存器的狀態標誌——

cpu特權值,此時就可以訪問核心態下的資料了。

linux

的記憶體保護除了有兩個不同的態外,還有就是每個程序是相互隔離的,即不同程序之間是看不到對方的空間的,每個程序有著自己的位址空間,並且任何時候只有乙個程序位址空間有效,這也是為什麼任何時候只有乙個程序在執行(單

cpu)。當程序進行切換的時候會相應的修改頁表基位址暫存器,通過修改該暫存器來達到位址空間的切換。這也是為什麼程序訪問不到其它程序位址空間的原因——當它在執行的時候使用的頁表基位址暫存器一定是它的,那麼對映出來的位址也絕對是屬於它自己的,這樣就可以防止它破壞別的程序。而程序間的通訊,其本質大多數是利用在核心態裡開闢一些空間,通過這些空間來進行資料傳輸(多次拷貝,將核心態緩衝區的資料拷貝到使用者態緩衝區copy_to_user)。而通常常見的如

mmap

及共享記憶體則是通過另外兩種不同的方式進行的;其中共享記憶體是通過在乙個程序的位址空間中建立乙個新的段(共享記憶體區域),然後把該區域掛載到另乙個程序(要與之通訊的程序),此時兩者的虛擬位址不一定一樣,但是它們的實體地址卻是一樣的,所以它們在記憶體中只儲存乙份,他們的訪問直接通過掛載後的虛擬位址進行訪問,不再需要核心空間的copy,這也是為什麼共享記憶體是程序間通訊最快的原因。而

mmap

則是利用檔案來做為中轉站,達到資料通訊的目的,其本質與共享記憶體有點相似。

linux 程序間共享記憶體

可以採用sysv的shmget shmat 實現。但是我更喜歡shm open mmap 更簡單。writer.c include include include include include include include include struct ofs stat int main voi...

使用記憶體共享機制程序間通訊

前一篇中簡單介紹了程序間通訊的機制之一 訊息機制。本篇中我簡要的描述一下程序間通訊的另一種機制 記憶體共享機制。windows中要使用記憶體共享的方式在程序間通訊需要採用dll方式。由於win32把dll裝入全域性記憶體並把dll對映到每個程式的位址空間。所有載入dll的應用程式只能共享程式 不能共...

程序間通訊機制詳解(4) 共享記憶體

共享記憶體就是允許兩個或多個程序共享一定的儲存區,共享記憶體對映能夠最大限度的降低核心空間和使用者空間之間的資料拷貝,當核心空間和使用者空間存在大量資料互動時,這些程序的資料傳輸不再涉及核心,從而大大提高系統的效能,是最快的ipc形式。當乙個程式載入進記憶體後,它被分成叫作頁的塊。每個程序都有屬於自...