時間:2015-06-28 00:00:00 來源: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
#include
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
#include
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)存映像的標志,相關(guān)的標志見表2;參數(shù)fd是要映射的文件的描述符;參數(shù)offset表示所映射的數(shù)據(jù)內(nèi)容 距離文件頭的偏移量。
當調(diào)用成功時,返回值為指向內(nèi)存映像起始地址的指針;當調(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
#include
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
#include
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
#include
#include
#include
#include
#include
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)鍵詞標簽:linux,物理內(nèi)存
相關(guān)閱讀
熱門文章 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 Tomcat9.0如何安裝_Tomcat9.0環(huán)境變量配置方法 多種操作系統(tǒng)NTP客戶端配置 Linux操作系統(tǒng)修改IP
人氣排行 Linux下獲取CPUID、硬盤序列號與MAC地址 dmidecode命令查看內(nèi)存型號 linux tc實現(xiàn)ip流量限制 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 linux下解壓rar文件 lcx.exe、nc.exe、sc.exe入侵中的使用方法 Ubuntu linux 關(guān)機、重啟、注銷 命令 查看linux服務(wù)器硬盤IO讀寫負載