[BitVisor-devel:123] Re: BitVisor の AHCI ドライバにつきまして

Manabu HIRANO hirano @ toyota-ct.ac.jp
2020年 12月 14日 (月) 19:29:58 JST


榮樂様、

早速のご回答有り難う御座います。Intel の AHCI仕様書を見ながら ahci.c のソース
コードを読んでみました。AHCI仕様書の Physical Region Descriptor Table が
ahci.c の prdtbl 構造体に対応していて、AHCI 仕様書の Data Byte Count が 構造体
のメンバ dbc (22 bit幅)で定義されていることを確認できました。仕様上、dbc
には 4MiB 以上を入れられない仕様になっていることも確認できました。

実際に Windows 7 と Windows 10 でブート時に 4MiB を超えるリクエストがどれくら
い発生しているのか実験してみたところ、以下のようになりました:

Windows7 はブート時に 4MiB を超える読み込みが3回あり(具体的には
9,533,440 Byte の読み込みが3回)、そこで止まっていました。ASSERT をコメント
アウトすれば Windows 7 は起動はするのですが、ご指摘のように read が wrap
しているとすると処理がおかしくなっているかもしれません。ただ、Windows7 の
ブート後は(十分な時間をかけて検証していませんが)4MiB を超えるアクセスは
発生していないようで、とりあえずの状態ではありますが動作しています。

Windows10 はブート時に 4MiB を超える読み込みが3回あり(具体的には
9,684,480 Byte の読み込みが3回)、そこで止まっていました。こちらは ASSERT
をコメントアウトしても起動しなかったことから、この読み込みが原因で起動
に必要なファイルの読み込みに失敗しているようです。

ahci.c のソースコードを読んでいるのですが、ご指摘いただいた点は ahci.c の

```
struct command_table {
	union cmdfis cfis;	/* Command FIS */
	u8 acmd[16];		/* ATAPI Command */
	u8 reserved[48];
	struct prdtbl prdt[1];	/* Physical Region Descriptor Table */
} __attribute__ ((packed));
```

で command_table 構造体のメンバに struct prdtbl 構造体 が今は 1個だけ定義
されていますが、4MiB を超えるリクエストに対応させるために数を 2個以上にして、
そこを適切に読み書きするように改造すれば 4MiB 以上のリクエストに対応できる
かもしれないと考えていますが、何分にも理解が追いついていないところがありま
すので、間違いやお気づきの点があればご教示いただけましたら幸いです。

度々すみませんが、よろしくお願い申し上げます。

平野


>> 一時的な回避策として ahci.c の975行目の ASSERT をコメントアウト(して
>> いいか
>> わかりませんが...)すると Windows7 は動作しました。しかし、Windows 10
>> は起動
>> しませんでした。  ## Windows7, 10 ともに AHCI ドライバは MS標準でした
> 
> AHCI の仕様書を見て頂きたいのですが、バッファーを Physical Region
> Descriptor Table (struct prdtbl) に複数渡して scatter/gather できるよ
> うになっていて、そのひとつのエントリの限界サイズが 4MiB です。(プログ
> ラム上も構造体の dbc メンバーが 22 ビットになっている部分がそれです。)
> BitVisor の実装はゲスト側が複数使うことは想定していますが、VMM 側は複
> 数になることを想定していませんので、単純に assertion を消せば、VMM 側
> 転送に指定するバッファーのサイズが wrap し変な転送がされて、書き込みコ
> マンドではファイルシステムが壊れることも考えられますのでご注意ください。
> 
>> ちなみに BitVisor で使えるヒープを増やすには単純に core/mm.c の
>>   VMMSIZE_ALL を増やせば大丈夫でしょうか...?
> 
> それはそうです。上述のように struct prdtbl に複数書き込むようにするの
> は必須で、ヒープについては、暗号化の関数仕様に合わせて連続アドレスのま
> まにするのであれば、だいぶ余裕を持った値にしておく必要があると思います。





BitVisor-devel メーリングリストの案内