質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
mmap

mmapは、UNIXのOSのシステムコールです。ファイルやデバイスなどのOS上のリソースの一部もしくは全てを連続した仮想アドレス空間にマッピングします。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

2回答

2624閲覧

mmapでアドレスが意図した値にならない

YOshim

総合スコア1085

mmap

mmapは、UNIXのOSのシステムコールです。ファイルやデバイスなどのOS上のリソースの一部もしくは全てを連続した仮想アドレス空間にマッピングします。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

1クリップ

投稿2019/07/31 12:23

編集2019/07/31 12:25

Linuxの/dev/memをmmapを使って操作しようとしています。

#define BASE_BRIGDE 0xFF200000 #define BASE_LEDPIO 0xFF210040 #define DEVNAME "/dev/mem" int main(int argc, char** argv) { int fd; unsigned long from, num, port; unsigned char *iomap; printf("this is IOmemory test program\n"); fd = open(DEVNAME, O_RDWR); if(fd <= 0){ perror(DEVNAME); exit(1); } from = BASE_LEDPIO; num = 0x20; iomap = mmap(0, num, PROT_READ|PROT_WRITE, MAP_SHARED, fd, from); if(iomap < 0){ perror(DEVNAME); exit(1); } printf("IOmem mmaped at %p\n", iomap); //port = 0xFF210041; //*(iomap + port - from) &= 0x00; munmap(iomap, num); close(fd); return 0; }

結果

this is IOmemory test program IOmem mmaped at 0xffffffff

正常な場合にiomapがいくつになるかは不明なのですが、
恐らく0xffffffffではないはず。多分・・・。

何が間違っているのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Man Pageを見たら以下の記述がありましたが、失敗してませんか?

mmap() は成功するとマップされた領域へのポインターを返す。 失敗すると値 MAP_FAILED (つまり (void *) -1) を返し、 errno がエラーの内容にしたがってセットされる。

errnoを確認した方がいいかと。

投稿2019/08/01 02:38

FiroProchainezo

総合スコア2401

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YOshim

2019/08/02 01:31 編集

回答ありがとうございます。 ソースコードを修正し。 ``` if (iomap == MAP_FAILED) { printf("Error : mmap failed. Error:%d\n", errno); return -1; } ``` を追記したところ、仰る通りmmap failedとなっておりました。 エラー番号は22でInvalid argumentでした。 もう少し調査を進めてみます。
YOshim

2019/08/02 01:43

mmapの引数のfromを0にするとエラーは出ませんでした。 しかし4バイトのアドレス(0xff210040)を入れるとInvalid argumentのエラーが出ます。
YOshim

2019/08/02 01:47

4バイトのアドレスを0xff210000とするとエラーは出ませんでした。 mmapのベースとなるアドレスはPAGE_SIZE 単位の位置からしかマップできないという事でしょうか。
guest

0

自己解決

mmapのベースとなるアドレスは自由には選択できず、
PAGE_SIZE 単位のアドレスを記入する必要がある(と思われる)。

今回はベースとなるアドレスを
0xFF200000としたら無事マップができた。

投稿2019/08/02 01:49

YOshim

総合スコア1085

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問