11/26 宮ケ瀬湖と湘南に行ってきた
山にいって海にもいってのフルコース
続きを読むkvm のソースを読んでたら kvm_kvzalloc() なる関数が出てきた
/* * Avoid using vmalloc for a small buffer. * Should not be used when the size is statically known. */ void *kvm_kvzalloc(unsigned long size) { if (size > PAGE_SIZE) return vzalloc(size); else return kzalloc(size, GFP_KERNEL); }
割り当てたいサイズによって vzalloc() と kzalloc() を使い分ける。 kzalloc() は下記のような感じ
/** * kzalloc - allocate memory. The memory is set to zero. * @size: how many bytes of memory are required. * @flags: the type of memory to allocate (see kmalloc). */ static inline void *kzalloc(size_t size, gfp_t flags) { return kmalloc(size, flags | __GFP_ZERO);
__GFP_ZERO を指定すると 割り当てた領域は 0
で初期化済みで返してくれる。
#define __GFP_ZERO ((__force gfp_t)___GFP_ZERO) /* Return zeroed page on success */
ここんところの実装がどうなってるかを追ってみた
といっても memset() しているだけだった。ちょっと面白みがないので下記のような検証を加えた
続きを読む定数を返すだけの非常にシンプルな API。ユーザランド側でどう扱うかが疑問になったので、qemu のソースも一緒に読んだ
KVM_GET_API_VERSION といった定数は qemu でも同名で定義されているので、
として、ユーザランドから見る KVM のインタフェースとカーネルでの KVM の実装を筋立ててソースを読んでいける ( a, b, c の順序は問わない )
加えて、他の API と組み合わせて KVM を操作していく術について、骨格を掴むには lwn.net の過去記事を読むとよい
Linux カーネルのソースコードはちょいちょい読んできていたが、KVM 周辺は全くふれていなかったので、ソースを追いかけている
O'Reilly の『詳解 Linux カーネル』 のような 凶器 書籍が無いので、Web 上のあれこれや Linux カーネルのドキュメントをエントリポイントにして読んでいる。なお「解説」を目指したものではなく、メモ書きが飛散している程度で第三者の閲覧に耐えうる感じでは書けていない。ご勘弁を
KVM の API を把握するにあたって https://kernel.org/doc/Documentation/virtual/kvm/api.txt をとっかかりとした。 1章と2章を読んで ioctl(2) で /dev/kvm
, struct kvm, struct kvm_vcpu をどう扱うかを整理すると、ソースを読む道筋を立てやすいと思う
アーキテクチャ依存のコードが強敵。syuu1228 さんの「ハイパーバイザの作り方」シリーズを眺めると Intel VT-x の全体像をつかみやすい
さらに Intel のマニュアル読んで更に詳細を追っている ( システム・プログラミング・ガイド の 23章あたり )
まだまだ序盤なので、せっせと読んでいく