實體地址空間是什麼

  地址空間address space表示任何一個計算機實體所佔用的記憶體大小。比如外設、檔案、伺服器或者一個網路計算機。地址空間包括物理空間以及虛擬空間。今天小編給大家介紹一下實體地址空間的相關知識。供大家參考!

  實體地址空間參考如下

  物理儲存器和儲存地址空間是兩個不同的概念。但是由於這兩者有十分密切的關係,而且兩者都用B、KB、MB、GB來度量其容量大小,因此容易產生認識上的混淆,弄清這兩個不同的概念,有助於進一步認識主儲存器和用好主儲存器。

  物理儲存器是指實際存在的具體儲存器晶片。如主機板上裝插的主存條和裝載有系統的BIOS的ROM晶片,顯示卡上的顯示RAM晶片和裝載顯示BIOS的ROM晶片,以及各種適配卡上的RAM晶片和ROM晶片都是物理儲存器。

  儲存地址空間是指對儲存器編碼編碼地址的範圍。所謂編碼就是對每一個物理儲存單元一個位元組分配一個號碼,通常叫作“編址”。分配一個號碼給一個儲存單元的目的是為了便於找到它,完成資料的讀寫,這就是所謂的“定址”所以,有人也把地址空間稱為定址空間。

  CPU在操控物理儲存器的時候,把物理儲存器都當作記憶體來對待,把它們總的看作一個由若干儲存單元組成的邏輯儲存器,這個邏輯儲存器就是我們所說的記憶體地址空間。

  有的物理儲存器被看作一個由若干儲存單元組成的邏輯儲存器,每個物理儲存器在這個邏輯儲存器中佔有一個地址段,即一段地址空間。CPU在這段地址空間中讀寫資料,實際上就是在相對應的物理儲存器中讀寫資料。

  地址空間的大小和物理儲存器的大小並不一定相等。舉個例子來說明這個問題:某層樓共有17個房間,其編號為801~817。這17個房間是物理的,而其地址空間採用了三位編碼,其範圍是800~899共100個地址,可見地址空間是大於實際房間數量的。

  對於386以上檔次的微機,其地址匯流排為32位,因此地址空間可達2的32次方,即4GB。但實際上我們所配置的物理儲存器通常只有1MB、2MB、4MB、8MB、16MB、32MB等,遠小於地址空間所允許的範圍。

  Linux使用者空間訪問實體地址

  有時候因為專案需要,需要在Linux userspace 讀寫訪問實際實體地址。

  一使用者空間可以直接通過開啟 /dev/mem 裝置檔案,然後mmap 影射進行訪問

  [cpp] view plain?

  static int read_type

  {

  void * map_base;

  FILE *f;

  int type,fd;

  #define READ_REG32reg *volatile int * reg

  #define ALLOC_SIZE 1024

  fd = open"/dev/mem", O_RDWR | O_SYNC;

  if fd {

  printf"Success to open /dev/mem fd=%08x\n", fd;

  }

  else {

  printf"Fail to open /dev/mem fd=%08x\n", fd;

  }

  map_base = mmap0, ALLOC_SIZE, PROT_READ, MAP_PRIVATE, fd, 0x35004000;

  type = READ_REG32map_base + 0x20;

  closefd;

  munmapmap_base, ALLOC_SIZE;

  printf"reg32[%08x] = value[%08x] \n", map_base, type;

  type = type & 1 << 27 >> 27 ;

  printf"reg32[%08x] = value[%08x] \n", map_base, type;

  return type;

  }

  mmap,通過核心建立一個虛擬地址到實體地址的對映,然後通過這一虛擬地址就可以在使用者空間訪問真實的實體地址了

  mmap 其中有幾個引數需要說明:

  PROT_READ 區域可讀;

  PROT_WRITE 區域可寫;

  MAP_SHARED 對對映區域的寫入資料會複製迴文件內, 而且允許其他對映該檔案的程序共享。

  在Android 4.4上實際執行的結果:

  編譯生成的使用者空間可執行程式,需要root user許可權才能執行。即使程式本身已經是 rwx-rwx-rwx許可權。

  mmap中對映的緩衝區必須是 PAGE size 的整數倍。 如果不是,會產生segmentation fault。

  實際訪問的實體地址如果不是恰好是PAGE size 的整數倍,必須要對mmap返回的對映基地址加上對應的偏移量,得到最終的影射後地址。

  二使用者空間驅動程式

  如果使用者空間可以訪問實際實體地址,則可以更進一步實現使用者空間的硬體驅動程式。

  使用者空間驅動的優點:

  完整的 C 庫可以連線. 驅動可以進行許多奇怪的任務, 不用依靠外面的程式實現使用策略的工具程式, 常常隨著驅動自身釋出.

  程式設計師可以在驅動程式碼上執行常用的偵錯程式, 而不必走除錯一個執行中的核心的彎路.

  如果一個使用者空間驅動掛起了, 你可簡單地殺掉它. 驅動的問題不可能掛起整個系統, 除非被控制的硬體真的瘋掉了.

  使用者記憶體是可交換的, 不象核心記憶體. 一個不常使用的卻有很大一個驅動的裝置不會佔據別的程式可以用到的 RAM, 除了在它實際在用時.

  一個精心設計的驅動程式仍然可以, 如同核心空間驅動, 允許對裝置的並行存取.

  如果你必須編寫一個封閉原始碼的驅動, 使用者空間的選項使你容易避免不明朗的許可的情況和改變的核心介面帶來的問題.

  使用者空間的裝置驅動的方法有幾個主要缺點:

  中斷在使用者空間無法用. 在某些平臺上有對這個限制的解決方法, 例如在 IA32 體系上的 vm86 系統呼叫.

  只可能通過記憶體對映 /dev/mem 來使用 DMA, 而且只有特權使用者可以這樣做.

  存取 I/O 埠只能在呼叫 ioperm 或者 iopl 之後. 此外, 不是所有的平臺支援這些系統呼叫, 而存取/dev/port可能太慢而無效率. 這些系統呼叫和裝置檔案都要求特權使用者.

  響應時間慢, 因為需要上下文切換在客戶和硬體之間傳遞資訊或動作.

  更不好的是,

  如果驅動已被交換到硬碟, 響應時間會長到不可接受. 使用 mlock 系統呼叫可能會有幫助, 但是常常的你將需要鎖住許多記憶體頁, 因為一個使用者空間程式依賴大量的庫程式碼. mlock, 也, 限制在授權使用者上.

  最重要的裝置不能在使用者空間處理, 包括但不限於, 網路介面和塊裝置.

  如你所見, 使用者空間驅動不能做的事情畢竟太多. 感興趣的應用程式還是存在: 例如, 對 SCSI 掃描器裝置的支援 由 SANE 包實現 和 CD 燒錄器 由 cdrecord 和別的工具實現 . 在兩種情況下, 使用者級別的裝置情況依賴 "SCSI gneric" 核心驅動, 它輸出了低層的 SCSI 功能給使用者程式, 因此它們可以驅動它們自己的硬體.

  一種在使用者空間工作的情況可能是有意義的, 當你開始處理新的沒有用過的硬體時. 這樣你可以學習去管理你的硬體, 不必擔心掛起整個系統. 一旦你完成了, 在一個核心模組中封裝軟體就會是一個簡單操作了.

  小編介紹了實體地址空間的相關知識,希望你喜歡。