タダノキロク

日々の考えたことの記録 主に無駄なこと

詳細Linuxカーネル 19章 プロセッサ間通信 4/10

詳細Linuxカーネル 19章 プロセッサ間通信 4/10

kernelreading.doorkeeper.jp

ユーザモードプロセッサ間の同期及びデータ交換の方法を学ぶ。
簡単にやろうとすれば、ファイルシステムのロック機能を用いた同期、
共有ファイルによるデータ共有があるが、面倒。
なので、ファイルシステム無しでの同期/共有のシステムコールが用意されている。

  • パイプとFIFO
  • セマフォ
  • メッセージ
  • 共有メモリリージョン
  • ソケット

巨大なメモリ空間を共有するのに便利そうなIPC共有メモリ当たりを見てみることにする。 (19.3.5章)

19.3章 SystemVのIPC

IPCはプロセス間通信の略(InterProcess Communication)
プロセスから以下のことを行うための仕組み
* プロセス間の同期(セマフォを使用)
* メッセージ送受信
* メモリ領域を他のプロセスと共有

IPC資源は動的に作成されて、複数の資源を同時に使用可能になっている。
同時使用のために、カーネルはIPC識別子をプロセスが決めたIPCキーから作成。

19.3.5 IPC共有メモリ

複数のプロセスから共有データ構造にアクセスする方法。

とりあえず提供されているシステムコール

  1. shmget()
    IPC共有メモリ向けのIPC識別子を取得
  2. shmat()
    共有メモリリージョンをプロセルのアドレス空間に関連付ける
  3. shmdt()
    共有メモリリージョンをプロセスのアドレス空間の関連付から取り除く

共有メモリの割当管理に関して興味があるのでshmat()を見てみる。

shmat()の引数

システムコールなので、実体はdo_shmatっぽい。 引数は * shmid :IPC識別子
* shmaddr :共有メモリリージョンに割り当てたいアドレス
(通常はNULLで勝手にマップしてもらう。) * shmflag :IPC共有メモリ向けのモード設定

47 /* mode for attach */  
48 #define SHM_RDONLY  010000  /* read-only access */  
49 #define SHM_RND   020000  /* round attach address to SHMLBA boundary */  
50 #define SHM_REMAP 040000  /* take-over region on attach */  
51 #define SHM_EXEC  0100000 /* execution access */  

shmat()の処理

  1. 引数の確認
    shmidが正でなければエラー
    shmaddrにあればページサイズにマスク
    shmflagに合わせてページの属性設定
  2. ips_ns を取得
  3. shm_obtain_object_check

なんでもいいからここまで。