2016-08-19 2 views
2

私は物理アドレス、具体的には0x000000368d76c0が与えられました。私はmmap私のプログラムにそれをしようとしている。私が使用しているコードはmmapが失敗するのはなぜですか?

void *mmap64; 
off_t offset = 0x000000368d76c0; 
int memFd = open("/dev/mem", O_RDWR); 
if (-1 == memFd) 
    perror("Error "); 

mmap64 = mmap(0, sizeof(uint64_t), PROT_WRITE | PROT_READ, MAP_SHARED, memFd, offset); 
if (MAP_FAILED == mmap64) { 
    perror("Error "); 
    return -1; 
} 

私はmmap上の失敗を取得し、このコードを実行するいくつかの理由です。特にそれはError Invalid argumentと言います。私はそれがoffsetの値のためにあると確信していますが、何が間違っているのか分かりません。

私はそれに助けていただきありがとうございます。

+0

'mmap()'の引数に 'adddress'によって' address'を意味しますか? – MikeCAT

+0

@MikeCAT私は 'offset'引数を意味します。 – flashburn

+7

[mmap(2) - Linuxのマニュアルページ](http://man7.org/linux/man-pages/man2/mmap.2.html)は、 "offset"は、返されたページサイズの倍数でなければならない'sysconf(_SC_PAGE_SIZE)' "あなたのシステムの価値は何ですか?リファレンス:[sysconf(3) - Linuxのマニュアルページ](http://man7.org/linux/man-pages/man3/sysconf.3.html) – MikeCAT

答えて

3

mmap(2) - Linux manual pageによると、

offsetsysconf(_SC_PAGE_SIZE)によって返さ としてページサイズの倍数でなければなりません。

ページサイズが4096(x86 CPUで使用されるページサイズ)の場合、0x000000368d76c0は4096の倍数ではなく、無効と見なされます。

このため、オフセットを調整する必要があります。

関連する問題