応用情報技術者仮想記憶・キャッシュ・デバイスI/Oオリジナル・公式資料照合難易度★★★★★
Linuxドライバーがdma_alloc_coherentで確保したdescriptorをデバイスと共有する。CPUが内容を書き、最後に整列した所有権フラグをDEVICE_OWNへ変更する。デバイスはそのフラグを確認してから内容を読む。フラグの読書きは不可分とし、CPU側ではWRITE_ONCEを使う。内容が先、所有権の移譲が後に見えるようにする操作はどれか。本問にMMIOのdoorbell通知はない。
A
coherentメモリなので、コンパイラ・CPUの順序について何も考える必要はない
coherentは可視性の整合を提供しても、CPUの書込みの順序が不要になるという意味ではありません。
B
最初にDEVICE_OWNを書き、その後に内容を少しずつ更新する
デバイスが所有権を得たと判断した時点で内容が未完成となり、古い値や途中の値を読むおそれがあります。
C
descriptorへの書込みの前にdma_rmb()を一度呼べば、後の書込み同士も必ず正しく並ぶ
必要なのは先行する内容の書込みと後続するフラグ書込みの順序です。前に置いた読取りバリアでは代替できません。
D
内容への書込み後、所有権フラグへの書込み前にdma_wmb()を入れる★ 正解
dma_wmbはdescriptorの内容の書込みを、デバイスが所有権の更新を観測するより前に見せるために使います。
解説
DMA coherentでも書込み順序は別に保証します。内容を書いてdma_wmbを挟み、所有権を移します。dma_*バリアはMMIOアクセスの順序保証ではないため、doorbellがある実装ではI/Oアクセサー等も別途確認します。
根拠資料・確認情報
対応範囲:2026年度 応用情報技術者試験
資料確認日:2026-10-28
同じレッスンの問題
問題 1
Linuxのforkによるcopy-on-writeを簡単化して考える。親は常駐する通常ページ16枚の私有・書込み可能領域を持ち、fork直後は親子が同じ16枚をCOWで共有する。子だけがそのうち異なる3ページへ書き込み、各ページで1枚ずつ複製される。親は書き込まず、解放・回収・共有メモリ・巨大ページはない。ページテーブル等の管理領域を除く、この領域の物理ページ数は幾つか。
問題 2
理想的なLRUページ置換を行う仮想記憶モデルを考える。ページ枠は3枚で初めは空、参照列は1,2,3,1,4,2,5である。最も長く参照されていないページを追い出し、初回読込みもページフォールトに数える。フォールト回数は幾つか。実際のLinuxがこの厳密なLRUをそのまま実装するという前提ではない。
問題 3
アドレス変換を保持するTLBに512エントリーがある簡単化モデルを考える。各エントリーは1ページを表し、全エントリーで同じページサイズを使える。競合・予約領域・別サイズ用TLBの差は無視する。ページサイズが4KiBの場合と2MiBの場合、それぞれ一度に保持できる変換対象の最大範囲はどれか。1KiB=2^10バイト、1MiB=2^20バイト、1GiB=2^30バイトとする。
問題 4
キャッシュラインが64バイトのSMP機で、CPU AとBがそれぞれ別の8バイトカウンターを頻繁に更新する。二つのカウンターは同じ64バイトライン内にあり、更新自体は正しく同期されているが、キャッシュ間の無効化・転送が多い。false sharingを減らす配置はどれか。