国产成人v爽在线免播放观看,日韩欧美色,久久99国产精品久久99软件,亚洲综合色网站,国产欧美日韩中文久久,色99在线,亚洲伦理一区二区

學(xué)習(xí)啦>學(xué)習(xí)電腦>網(wǎng)絡(luò)知識(shí)>網(wǎng)絡(luò)基礎(chǔ)知識(shí)>

物理地址空間是什么

時(shí)間: 春健736 分享

  地址空間(address space)表示任何一個(gè)計(jì)算機(jī)實(shí)體所占用的內(nèi)存大小。比如外設(shè)、文件、服務(wù)器或者一個(gè)網(wǎng)絡(luò)計(jì)算機(jī)。地址空間包括物理空間以及虛擬空間。今天學(xué)習(xí)啦小編給大家介紹一下物理地址空間的相關(guān)知識(shí)。供大家參考!

  物理地址空間參考如下

  物理存儲(chǔ)器和存儲(chǔ)地址空間是兩個(gè)不同的概念。但是由于這兩者有十分密切的關(guān)系,而且兩者都用B、KB、MB、GB來度量其容量大小,因此容易產(chǎn)生認(rèn)識(shí)上的混淆,弄清這兩個(gè)不同的概念,有助于進(jìn)一步認(rèn)識(shí)主存儲(chǔ)器和用好主存儲(chǔ)器。

  物理存儲(chǔ)器是指實(shí)際存在的具體存儲(chǔ)器芯片。如主板上裝插的主存條和裝載有系統(tǒng)的BIOS的ROM芯片,顯示卡上的顯示RAM芯片和裝載顯示BIOS的ROM芯片,以及各種適配卡上的RAM芯片和ROM芯片都是物理存儲(chǔ)器。

  存儲(chǔ)地址空間是指對存儲(chǔ)器編碼(編碼地址)的范圍。所謂編碼就是對每一個(gè)物理存儲(chǔ)單元(一個(gè)字節(jié))分配一個(gè)號(hào)碼,通常叫作“編址”。分配一個(gè)號(hào)碼給一個(gè)存儲(chǔ)單元的目的是為了便于找到它,完成數(shù)據(jù)的讀寫,這就是所謂的“尋址”(所以,有人也把地址空間稱為尋址空間)。

  CPU在操控物理存儲(chǔ)器的時(shí)候,把物理存儲(chǔ)器都當(dāng)作內(nèi)存來對待,把它們總的看作一個(gè)由若干存儲(chǔ)單元組成的邏輯存儲(chǔ)器,這個(gè)邏輯存儲(chǔ)器就是我們所說的內(nèi)存地址空間。

  有的物理存儲(chǔ)器被看作一個(gè)由若干存儲(chǔ)單元組成的邏輯存儲(chǔ)器,每個(gè)物理存儲(chǔ)器在這個(gè)邏輯存儲(chǔ)器中占有一個(gè)地址段,即一段地址空間。CPU在這段地址空間中讀寫數(shù)據(jù),實(shí)際上就是在相對應(yīng)的物理存儲(chǔ)器中讀寫數(shù)據(jù)。

  地址空間的大小和物理存儲(chǔ)器的大小并不一定相等。舉個(gè)例子來說明這個(gè)問題:某層樓共有17個(gè)房間,其編號(hào)為801~817。這17個(gè)房間是物理的,而其地址空間采用了三位編碼,其范圍是800~899共100個(gè)地址,可見地址空間是大于實(shí)際房間數(shù)量的。

  對于386以上檔次的微機(jī),其地址總線為32位,因此地址空間可達(dá)2的32次方,即4GB。但實(shí)際上我們所配置的物理存儲(chǔ)器通常只有1MB、2MB、4MB、8MB、16MB、32MB等,遠(yuǎn)小于地址空間所允許的范圍。

  Linux用戶空間訪問物理地址

  有時(shí)候因?yàn)轫?xiàng)目需要,需要在Linux userspace 讀寫訪問實(shí)際物理地址。

  一)用戶空間可以直接通過打開 /dev/mem 設(shè)備文件,然后mmap() 影射進(jìn)行訪問

  [cpp] view plain?

  static int read_type()

  {

  void * map_base;

  FILE *f;

  int type,fd;

  #define READ_REG32(reg) ( *((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 = mmap(0, ALLOC_SIZE, PROT_READ, MAP_PRIVATE, fd, 0x35004000);

  type = READ_REG32(map_base + 0x20);

  close(fd);

  munmap(map_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,通過內(nèi)核建立一個(gè)虛擬地址到物理地址的映射,然后通過這一虛擬地址就可以在用戶空間訪問真實(shí)的物理地址了

  mmap() 其中有幾個(gè)參數(shù)需要說明:

  PROT_READ 區(qū)域可讀;

  PROT_WRITE 區(qū)域可寫;

  MAP_SHARED 對映射區(qū)域的寫入數(shù)據(jù)會(huì)復(fù)制回文件內(nèi), 而且允許其他映射該文件的進(jìn)程共享。

  在Android 4.4上實(shí)際運(yùn)行的結(jié)果:

  編譯生成的用戶空間可執(zhí)行程序,需要root user權(quán)限才能運(yùn)行。即使程序本身已經(jīng)是 rwx-rwx-rwx權(quán)限。

  mmap()中映射的緩沖區(qū)必須是 PAGE size 的整數(shù)倍。 如果不是,會(huì)產(chǎn)生segmentation fault。

  實(shí)際訪問的物理地址如果不是恰好是PAGE size 的整數(shù)倍,必須要對mmap()返回的映射基地址加上對應(yīng)的偏移量,得到最終的影射后地址。

  二)用戶空間驅(qū)動(dòng)程序

  如果用戶空間可以訪問實(shí)際物理地址,則可以更進(jìn)一步實(shí)現(xiàn)用戶空間的硬件驅(qū)動(dòng)程序。

  用戶空間驅(qū)動(dòng)的優(yōu)點(diǎn):

  完整的 C 庫可以連接. 驅(qū)動(dòng)可以進(jìn)行許多奇怪的任務(wù), 不用依靠外面的程序(實(shí)現(xiàn)使用策略的工具程序, 常常隨著驅(qū)動(dòng)自身發(fā)布).

  程序員可以在驅(qū)動(dòng)代碼上運(yùn)行常用的調(diào)試器, 而不必走調(diào)試一個(gè)運(yùn)行中的內(nèi)核的彎路.

  如果一個(gè)用戶空間驅(qū)動(dòng)掛起了, 你可簡單地殺掉它. 驅(qū)動(dòng)的問題不可能掛起整個(gè)系統(tǒng), 除非被控制的硬件真的瘋掉了.

  用戶內(nèi)存是可交換的, 不象內(nèi)核內(nèi)存. 一個(gè)不常使用的卻有很大一個(gè)驅(qū)動(dòng)的設(shè)備不會(huì)占據(jù)別的程序可以用到的 RAM, 除了在它實(shí)際在用時(shí).

  一個(gè)精心設(shè)計(jì)的驅(qū)動(dòng)程序仍然可以, 如同內(nèi)核空間驅(qū)動(dòng), 允許對設(shè)備的并行存取.

  如果你必須編寫一個(gè)封閉源碼的驅(qū)動(dòng), 用戶空間的選項(xiàng)使你容易避免不明朗的許可的情況和改變的內(nèi)核接口帶來的問題.

  用戶空間的設(shè)備驅(qū)動(dòng)的方法有幾個(gè)主要缺點(diǎn):

  中斷在用戶空間無法用. 在某些平臺(tái)上有對這個(gè)限制的解決方法, 例如在 IA32 體系上的 vm86 系統(tǒng)調(diào)用.

  只可能通過內(nèi)存映射 /dev/mem 來使用 DMA, 而且只有特權(quán)用戶可以這樣做.

  存取 I/O 端口只能在調(diào)用 ioperm 或者 iopl 之后. 此外, 不是所有的平臺(tái)支持這些系統(tǒng)調(diào)用, 而存取/dev/port可能太慢而無效率. 這些系統(tǒng)調(diào)用和設(shè)備文件都要求特權(quán)用戶.

  響應(yīng)時(shí)間慢, 因?yàn)樾枰舷挛那袚Q在客戶和硬件之間傳遞信息或動(dòng)作.

  更不好的是,

  如果驅(qū)動(dòng)已被交換到硬盤, 響應(yīng)時(shí)間會(huì)長到不可接受. 使用 mlock 系統(tǒng)調(diào)用可能會(huì)有幫助, 但是常常的你將需要鎖住許多內(nèi)存頁, 因?yàn)橐粋€(gè)用戶空間程序依賴大量的庫代碼. mlock, 也, 限制在授權(quán)用戶上.

  最重要的設(shè)備不能在用戶空間處理, 包括但不限于, 網(wǎng)絡(luò)接口和塊設(shè)備.

  如你所見, 用戶空間驅(qū)動(dòng)不能做的事情畢竟太多. 感興趣的應(yīng)用程序還是存在: 例如, 對 SCSI 掃描器設(shè)備的支持( 由 SANE 包實(shí)現(xiàn) )和 CD 刻錄器 ( 由 cdrecord 和別的工具實(shí)現(xiàn) ). 在兩種情況下, 用戶級別的設(shè)備情況依賴 "SCSI gneric" 內(nèi)核驅(qū)動(dòng), 它輸出了低層的 SCSI 功能給用戶程序, 因此它們可以驅(qū)動(dòng)它們自己的硬件.

  一種在用戶空間工作的情況可能是有意義的, 當(dāng)你開始處理新的沒有用過的硬件時(shí). 這樣你可以學(xué)習(xí)去管理你的硬件, 不必?fù)?dān)心掛起整個(gè)系統(tǒng). 一旦你完成了, 在一個(gè)內(nèi)核模塊中封裝軟件就會(huì)是一個(gè)簡單操作了.

  學(xué)習(xí)啦小編介紹了物理地址空間的相關(guān)知識(shí),希望你喜歡。

579780