詳細Linuxカーネル 19章 プロセッサ間通信 4/10
詳細Linuxカーネル 19章 プロセッサ間通信 4/10
ユーザモードプロセッサ間の同期及びデータ交換の方法を学ぶ。
簡単にやろうとすれば、ファイルシステムのロック機能を用いた同期、
共有ファイルによるデータ共有があるが、面倒。
なので、ファイルシステム無しでの同期/共有のシステムコールが用意されている。
巨大なメモリ空間を共有するのに便利そうなIPC共有メモリ当たりを見てみることにする。 (19.3.5章)
19.3章 SystemVのIPC
IPCはプロセス間通信の略(InterProcess Communication)
プロセスから以下のことを行うための仕組み
* プロセス間の同期(セマフォを使用)
* メッセージ送受信
* メモリ領域を他のプロセスと共有
IPC資源は動的に作成されて、複数の資源を同時に使用可能になっている。
同時使用のために、カーネルはIPC識別子をプロセスが決めたIPCキーから作成。
19.3.5 IPC共有メモリ
複数のプロセスから共有データ構造にアクセスする方法。
とりあえず提供されているシステムコール。
shmget()
IPC共有メモリ向けのIPC識別子を取得shmat()
共有メモリリージョンをプロセルのアドレス空間に関連付ける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 */
raddr
:システムコールへの戻り値shmlba
:ページサイズ(システム固定)
shmat()
の処理
- 引数の確認
shmid
が正でなければエラー
shmaddr
にあればページサイズにマスク
shmflag
に合わせてページの属性設定 ips_ns
を取得shm_obtain_object_check
なんでもいいからここまで。