Study KVM internal 1
ในตัวอย่างนี้ใช้ qemu-kvm-0.12.4
Study the file “vl.c”
- ศึกษาไฟล์ vl.c เมื่อมีการเรียก -hda
- ตัวแปรที่เกี่ยวกับ -hda option คือ hda_opts เป็น pointer to QemuOpts (ประกาศบรรทัดที่ 4921)
4921 QemuOpts *hda_opts = NULL, *opts;
- QemuOpts เป็น struct มีการประกาศในไฟล์ qemu-option.c
483 struct QemuOpts {
484 char *id;
485 QemuOptsList *list;
486 QTAILQ_HEAD(QemuOptHead, QemuOpt) head;
487 QTAILQ_ENTRY(QemuOpts) next;
488 };
- QemuOptsList ศึกษาเพิ่มเติมได้ที่ qemu-option.h
- QTAILQ_HEAD และ QTAILQ_ENTRY ศึกษาเพิ่มเติมได้ที่ qemu-queue.h
- เมื่อมีการเรียก -hda จะมีการเรียกใช้ฟังก์ชัน drive_add() ในไฟล์ vl.c
1985 QemuOpts *drive_add(const char *file, const char *fmt, ...)
1986 {
1987 va_list ap;
1988 char optstr[1024];
1989 QemuOpts *opts;
1990
1991 va_start(ap, fmt);
1992 vsnprintf(optstr, sizeof(optstr), fmt, ap);
1993 va_end(ap);
1994
1995 opts = qemu_opts_parse(&qemu_drive_opts, optstr, NULL);
1996 if (!opts) {
1997 fprintf(stderr, "%s: huh? duplicate? (%s)\n",
1998 __FUNCTION__, optstr);
1999 return NULL;
2000 }
2001 if (file)
2002 qemu_opt_set(opts, "file", file);
2003 return opts;
2004 }
- ศึกษา main(), main_loop(), main_loop_wait()
...
4207 static void main_loop(void)
4208 {
4209 int r;
4210
4211 if (kvm_enabled()) {
4212 kvm_main_loop();
4213 cpu_disable_ticks();
4214 return;
4215 }
4216
...
...
3954 void main_loop_wait(int timeout)
3955 {
3956 IOHandlerRecord *ioh;
3957 fd_set rfds, wfds, xfds;
3958 int ret, nfds;
3959 struct timeval tv;
3960
...
- main() เรียกใช้งาน main_loop()
- main_loop() เรียกใช้งาน main_loop_wait()
- ข้อสังเกต หาก Hardware รองรับ KVM ฟังก์ชัน main_loop() จะไปเรียก kvm_main_loop()
Study the “bdrv_open()”
- เปิดไฟล์ block.c
- ทำการตรวจสอบฟังก์ชัน bdrv_open() แล้ว พบว่า มีการเรียกใช้ bdrv_open2()
- ทำการแก้ไข bdrv_open2() โดยเพิ่ม printf เข้าไปในส่วนต้นและท้ายของฟังก์ชัน โดยแสดงค่า Sequence และ Filename สำหรับแยกแยะความแตกต่าง
- ในภาพเป็นการแทรก printf ในส่วนต้นของฟังก์ชัน (บรรทัดที่ 359-362)

- ในภาพเป็นการแทรก printf ในส่วนท้ายของฟังก์ชัน (บรรทัดที่ 509-511)

- จากนั้นทำการ Compile และติดตั้ง เหมือนกับการบ้านที่ผ่านมา
$ ./configure --prefix=/opt/kvm-ex5
$ make
$ sudo make install
- เมื่อเรียกใช้ KVM โดยใช้ Disk centos_base.img พบว่ามีการเรียกฟังก์ชัน bdrv_open2() จำนวน 3 ครั้ง เป็นการอ่าน centos_base.img ทั้ง 3 ครั้ง
- เมื่อเรียกใช้ KVM โดยใช้ Disk centos_ovl2.img พบว่ามีการเรียกฟังก์ชัน bdrv_open2() จำนวน 6 ครั้ง โดยอ่าน centos_base.img และ centos_ovl2.img อย่างละ 3 ครั้ง

- จากภาพ สังเกตเลข Sequence พบว่าเมื่อใช้ centos_base.img มีลำดับการเรียกฟังก์ชันดังนี้
bdrv_open2(centos_base.img)
`-bdrv_open2(centos_base.img)
`-bdrv_open2(centos_base.img)
- และเมื่อใช้ centos_ovl2.img มีลำดับการเรียกใช้ฟังก์ชันดังนี้
bdrv_open2(centos_ovl2.img)
`-bdrv_open2(centos_ovl2.img)
`-bdrv_open2(centos_ovl2.img)
`-bdrv_open2(centos_base.img)
`-bdrv_open2(centos_base.img)
`-bdrv_open2(centos_base.img)
Mirror Site
- http://phithak.com/study-kvm-internal-1
- http://phithak.wordpress.com/2010/08/21/study-kvm-internal-1/
(ที่มา: การบ้าน หัวข้อ CS797 Exercise 5 – Study KVM internal 1 วิชา CS797 Advanced Topics in Computer Science – Introduction to Computer Virtualization ภาคเรียนที่ 1/2553 อาจารย์ผู้สอน ดร.กษิดิศ ชาญเชี่ยว ภาควิชาวิทยาการคอมพิวเตอร์ คณะวิทยาศาสตร์และเทคโนโลยี มหาวิทยาลัยธรรมศาสตร์)