Opencoreでも、Cloverでも、必須となった、OcQuirks(今ではそれ自体各ブートローダにビルドインされています。)。KASLRがあるので、マザーボードのせいで、メモリマップ上、カーネルのロードができない場合、slide値を固定していました。しかし、OcQuirksでは、非推奨です。その代わり、DevirtualiseMmioをtrueにする事を筆頭に、一連の設定を試すようになりました。
Opencoreのマニュアルでも、ちょっと意味が解りません。
バーチャライズすれば、リアロケーション出来ると思うのが普通です。
リアロケーション出来れば、カーネル領域を確保出来るはずです。なのに、DevirtualiseMmioとは、ちょっと不思議です。デベロッパーに聴いてみました。
私が質問したのは概ねこういうことです。
メモリを仮想化すれば、混んできたときに再配置(リアロケーション)することで、メモリを空けられるのが、仮想化の1つの利点、だとすると、MMIO(メモリマップドI/O)も仮想化してリアロケーションしても仮想アドレスから使えるのなら、Devirtualise(仮想化しない)のは混乱します。
答えは以下です。
@Alpha999 “Virtualisation” here is not about CPU virtualisation (VT-x, VT-d) but memory virtualisation (page table stuff). Yes, one of the advantages is you can physically move memory and still keep the addresses the same. MMIO virtualisation makes little to no sense (MMIO cannot be relocated with just virtualisation, so no, it does not make anything more difficult, and afaik nobody does this anyway). The issue is Apple reserves memory for virtualised memory whether it is moved by boot.efi or not, so useless (literally unused) virtualised MMIO space increases the initial kernel memory.
中で言ってることの、話では、「MMIOの仮想化はほとんど意味がありません(MMIOは仮想化だけでは再配置できないため、これ以上難しいことはありません。とにかく誰もこれを行いません)」つまり・<仮想化に意味はなく、仮想化をともめても、だれもそのリアロケーションをしないので、カーネルから(ナノカーネルならユーザ領域に含まれてる権限もあるかも)利用自体に支障をきたすことがほぼない機能>なのです。
そして、仮想化MMIOにするために更に(実際は仮想化は使われていないのに・・・ここでは文字どおりunused)仮想化用のメモリが利用されているため、仮想化をやめることで、カーネルをロードできるメモリを増やすことができるということです。
そのあと、「上の理解で正しいですか?」に加え、
「非仮想化を行うと動かない部分についてWhiteLitstを使うんですね」
で、情報元からLikeがついたので、これで間違いないと思います。
以上ではわかりづらいので、できるだけ、解説をしてみました。
Couldn’t allocate runtime areaエラーと、デバイス、メモリ管理のこと
を理解の参考にしてみてください。
コメント