IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置:首頁操作系統(tǒng)LINUX → linux讀寫物理內(nèi)存

linux讀寫物理內(nèi)存

時間:2015/6/28來源:IT貓撲網(wǎng)作者:網(wǎng)管聯(lián)盟我要評論(0)

  一、基礎(chǔ)知識:

  1. 設(shè)備文件:

  mem是一個字符設(shè)備文件,是計算機主存的一個影象。通常只有root用戶對其有讀寫權(quán)限。因此只有root用戶能進行這些操作。

  如果要打開設(shè)備文件/dev/mem,需要系統(tǒng)調(diào)用open()函數(shù),作用是打開一個文件或設(shè)備,其函數(shù)原型 為:

  #include <fcntl.h>

  #include <stat,h>

  int open(const char *path, int flags);

  open 函數(shù)定義在/usr/include/fcntl.h中;如果操作成功則返回一個文件描述符,否則返回-1;其中path是被打開文件的路徑即文件名描 述;flags是文件的訪問模式描述,可常用的選項見下表:

  flags的取值及其含義 flags  含義

  O_RDONLY    只讀方式

  O_WRONLY   只寫方式

  O_RDWR  可讀寫方式

  2.內(nèi)存映像:

  內(nèi)存映像其實在內(nèi)存中創(chuàng)建一個與外存中文件完全相同的映像。用戶可以將整個文件映射到內(nèi)存中,也可以將文件的一部分映射到內(nèi)存中。使用操作內(nèi)存的方法對文 件進行操作。系統(tǒng)會將內(nèi)存映像文件所做的改動反映到真實文件中去。

  在內(nèi)存映像I/O的實現(xiàn)過程中需要用到一些系統(tǒng)調(diào)用:

  首先是創(chuàng)建內(nèi)存映像文件的系統(tǒng)調(diào)用mmap()函數(shù),其函數(shù)原型為:

  #include <sys/types.h>

  #include <sys/mman.h>

  void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offset);   mmap函數(shù)定義在/usr/include/sys/mman.h中;

  此函數(shù)用于將一個文件或它的一部分映射到內(nèi)存中。參數(shù)start是一個void指針,表示希望將文件映射到此指針指向的位置,通常為NULL;參數(shù) length定義內(nèi)存映像文件所占用的內(nèi)存空間大小,以字節(jié)計;參數(shù)prot表示內(nèi)存映像文件的安全屬性,它的可使用的選項見表1,注意和open函數(shù)中 的flags屬性保持一致;參數(shù)flags是內(nèi)存映像的標(biāo)志,相關(guān)的標(biāo)志見表2;參數(shù)fd是要映射的文件的描述符;參數(shù)offset表示所映射的數(shù)據(jù)內(nèi)容 距離文件頭的偏移量。

  當(dāng)調(diào)用成功時,返回值為指向內(nèi)存映像起始地址的指針;當(dāng)調(diào)用失敗時,返回值為-1。

  表1 prot的取值及其含義

  prot     含義

  PROT_EXEC 被映像內(nèi)存可能含義機器碼,可被執(zhí)行

  PROT_NONE 映像內(nèi)存不允許訪問

  PROT_READ 映像內(nèi)存可讀

  PROT_WRITE 映像內(nèi)存可寫

  表2 flags的取值及其含義

  Flags 含義

  MAP_FIXED      若無法在指定位置建立內(nèi)存映像文件,則出錯返回

  MAP_PRIVATE 對內(nèi)存映像文件所做操作不反映到外存文件中

  MAP_SHARED 對內(nèi)存映像文件所做操作都將被保存到外存文件中

  另外我們使用完內(nèi)存映像文件后,要用系統(tǒng)調(diào)用函數(shù)munmap()函數(shù)來撤銷,其函數(shù)原型為:

  #include <sys/types.h>

  #include <sys/mman.h>

  int munmap(void *start,size_t length);

  參數(shù)start表示要撤銷的內(nèi)存映像文件的起始地址;參數(shù)length表示要撤銷的內(nèi)存映像文件的大小。調(diào)用成功時,返回值為0;調(diào)用失敗時返回值為 -1,并將errno設(shè)置為相應(yīng)值。

  最后,如果我們要將內(nèi)存映像的改動保存到外存中,還需要系統(tǒng)調(diào)用msync()函數(shù),其函數(shù)原型為:

  #include <sys/types.h>

  #include <sys/mman.h>

  int msync(const void *start,size_t length,int flags);

  參數(shù)start表示要保存到外存的那些源文件的起始地址;參數(shù)length表示內(nèi)存映像文件的大;參數(shù)flags設(shè)置了函數(shù)的相應(yīng)操作,其具體選項見表 3。

  表3 flags的取值及其含義

  flags  含義

  MS_ASYNC   調(diào)用一個寫操作并返回

  MS_INVALIDATE      映像到相同文件的內(nèi)存映像數(shù)據(jù)更新

  MS_SYNC      完成寫操作后函數(shù)返回

  通過/dev/mem設(shè)備文件和mmap系統(tǒng)調(diào)用,可以將線性地址描述的物理內(nèi)存映射到進程的地址空間,然后就可以直 接訪問這段內(nèi)存了。

  二、應(yīng)用實例:

  1.   源代碼:

  /*

  file: read.c

  function: Read the the first 5 bytes of the memory and then Write it with "HELLO"

  */

  #include <stdio.h>

  #include <unistd.h>

  #include <sys/mman.h>

  #include <sys/types.h>

  #include <sys/stat.h>

  #include <fcntl.h>

  int main (int args, char* arg[])

  {

  int i;

  int fd;

  char* mem;

  char *buff = "HELLO";

  //open /dev/mem with read and write mode

  if ((fd = open ("/dev/mem", O_RDWR)) < 0)

  {

  perror ("open error");

  return -1;

  }

  //map physical memory 0-10 bytes

  mem = mmap (0, 10, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

  if (mem == MAP_FAILED) {

  perror ("mmap error:");

  return 1;

  }

  //Read old value

  for (i = 0; i < 5; i++)

  {

  printf("\nold mem[%d]:%d", i, mem[i]);

  }

  //write memory

  memcpy(mem, buff, 5);

  //Read new value

  for (i = 0; i<5 ; i++)

  {

  printf("\nnew mem[%d]:%c", i, mem[i]);

  }

  printf("\n";

  munmap (mem, 10); //destroy map memory

  close (fd);   //close file

  return 0;

  }

  2.編譯、運行:

  #gcc -o read read.c

關(guān)鍵詞標(biāo)簽:linux,物理內(nèi)存

相關(guān)閱讀

文章評論
發(fā)表評論

熱門文章 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程使用screen管理你的遠(yuǎn)程會話使用screen管理你的遠(yuǎn)程會話GNU/Linux安裝vmwareGNU/Linux安裝vmware如何登錄linux vps圖形界面 Linux遠(yuǎn)程桌面連如何登錄linux vps圖形界面 Linux遠(yuǎn)程桌面連

相關(guān)下載

人氣排行 Linux下獲取CPUID、硬盤序列號與MAC地址linux tc實現(xiàn)ip流量限制dmidecode命令查看內(nèi)存型號linux下解壓rar文件安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程Ubuntu linux 關(guān)機、重啟、注銷 命令lcx.exe、nc.exe、sc.exe入侵中的使用方法查看linux服務(wù)器硬盤IO讀寫負(fù)載