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 อาจารย์ผู้สอน ดร.กษิดิศ ชาญเชี่ยว ภาควิชาวิทยาการคอมพิวเตอร์ คณะวิทยาศาสตร์และเทคโนโลยี มหาวิทยาลัยธรรมศาสตร์)

Advertisement

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.