PV Driver»ÅÍͳµÍ×
¡¡PV Driver¤Ï¡¢kvm-16¤Ç¤Ï¥½¡¼¥¹¸ø³«¤µ¤ì¤Æ¤¤¤Ê¤¤¡£¤¬¡¢PV Driver¤òºîÀ®¤¹¤ë¤¿¤á¤Îhypercall¤ò¸Æ¤Ó½Ð¤¹¤¿¤á¤Î»ÅÁȤߤϴޤޤì¤Æ¤¤¤ë¡£ ¥²¥¹¥ÈOS¤«¤éhypercall¤ò½Ð¤·¤¿¸å¤Ç¡¢hypervisor¤«¤é³ä¤ê¹þ¤ß¤¬¤¢¤¬¤ë¾ì¹ç¤¬¤¢¤ë¡£¤½¤Î³ä¤ê¹þ¤ß¤Î¤¿¤á¤Î¥Ç¥Ð¥¤¥¹¤Î¼ÂÁõ¤È¤·¤Æ¡¢kvm-16\driversÇÛ²¼¤Îhypercall.c¤¬¤¢¤ë¡£¤½¤Î¼ÂÁõ¤È¤Ê¤ë¡Ê¤È»×¤ï¤ì¤ë¡Ë¡£
¡¡¡Ý¥²¥¹¥ÈOS¾å¤ÎPCI¥Ð¥¹¤Ë²¾ÁۤΡÖhypercall device¡×¤òÍÑ°Õ
¡¡¡Ý¤½¤Î¥Ç¥Ð¥¤¥¹¤Ë³ä¤ê¹þ¤ß¥Ï¥ó¥É¥é¤òÀßÄê
³ä¤ê¹þ¤ß¥Ï¥ó¥É¥é¼«ÂΤϡ¢Io¥Ý¡¼¥È·Ðͳ¤Ç¥Ç¡¼¥¿¤òÆɤ߹þ¤à¤È¤³¤í¤Þ¤Ç¤·¤«¼ÂÁõ¤µ¤ì¤Æ¤¤¤Ê¤¤¡£¥Ç¥£¥¹¥¯¤ä¥Í¥Ã¥È¥ï¡¼¥¯¤Ê¤É¤Î¥É¥é¥¤¥Ð¤Î³ä¤ê¹þ¤ß¤È¤·¤Æ¥Ç¥£¥¹¥Ñ¥Ã¥Á¤µ¤ì¤ë½èÍý¤¬Äɲ䵤ì¤ë¡Ê¤È»×¤ï¤ì¤ë¡Ë¡£
hypercall device¤Î¥Ï¡¼¥É¥¦¥§¥¢¤È¤·¤Æ¤Î¤Õ¤ë¤Þ¤¤¤Ë¤Ä¤¤¤Æ¤Ï¡¢driver\qemu\hw\hypercall.c¤¬¤½¤Î¼ÂÁõ¤È¤Ê¤ë¡£
°Ê¹ß¡¢hypercall.c¤Î¼ÂÁõ¤Ë¤Ä¤¤¤Æ¤Î¼çÍ×Éôʬ¤Ë¤Ä¤¤¤Æ¼¨¤¹¡£¡Ê»²¹Í¡Ë
¡ô¸«¤Æ¤ÎÄ̤ꡢ¸½¾õ¤Ï¥¹¥±¥ë¥È¥ó¥É¥é¥¤¥Ð¤Ë¶á¤¤
¡¥É¥é¥¤¥Ð¤Î½é´ü²½
hypercall_init_module [hypercall.c](353)
¨§printk
¨¦pci_module_init
¡¡¡¦¼¡¤Î¥Ç¥£¥¹¥Ñ¥Ã¥Á¥ë¡¼¥Á¥ó¾ðÊó¤È¤È¤â¤Ë¥É¥é¥¤¥Ð¤ÎÅÐÏ¿¤ò¹Ô¤Ã¤Æ¤¤¤ë
static struct pci_driver hypercall_pci_driver = {
¡¡.name ¡¡¡¡¡¡¡¡= HYPERCALL_DRIVER_NAME,
¡¡.id_table ¡¡= hypercall_pci_tbl,
¡¡.probe = hypercall_init_one,¡¡<--- ¥×¥í¡¼¥Ö½èÍý»þ
¡¡.remove = __devexit_p(hypercall_remove_one),¡¡<--- ¥ê¥à¡¼¥Ö½èÍý»þ
#ifdef CONFIG_PM
¡¡.suspend¡¡¡¡¡¡¡¡¡¡ = hypercall_suspend, <--- ¥µ¥¹¥Ú¥ó¥É»þ
¡¡.resume ¡¡¡¡¡¡¡¡¡¡= hypercall_resume, <--- ¥ì¥¸¥å¡¼¥à»þ
#endif /* CONFIG_PM */
};
¢¥Ç¥Ð¥¤¥¹¥×¥í¡¼¥Ö½èÍý
hypercall_init_one [hypercall.c](163)
¨§pci_read_config_byte
¨§printk
¨§pci_name
¨§hypercall_init_board [hypercall.c](87)
¨¢¨§kzalloc
¨¢¨§printk
¨¢¨§pci_name
¨¢¨§pci_enable_device
¨¢¨§pci_resource_start
¨¢¨§pci_resource_end
¨¢¨§pci_resource_flags
¨¢¨§pci_resource_len
¨¢¨§DPRINTK
¨¢¨§pci_request_regions
¨¢¨§pci_iomap
¨¢¨§hypercall_cleanup_dev [hypercall.c](333)
¨¢¨¢¨§DPRINTK
¨¢¨¢¨§pci_release_regions
¨¢¨¢¨§pci_iounmap
¨¢¨¢¨§pci_set_drvdata
¨¢¨¢¨§kfree
¨¢¨¢¨¦__devexit_p
¨¢¨¦pci_disable_device
¨§spin_lock_init
¨§pci_set_drvdata
¨§hypercall_open [hypercall.c](286)
¨¢¨§request_irq
¨¢¨¦printk
¨¦hypercall_sysfs_add [hypercall.c](462)
¡¡¨§kobject_init
¡¡¨§kobject_set_name
¡¡¨§printk
¡¡¨§kobject_add
¡¡¨§sysfs_create_link
¡¡¨¦kobject_del
¡¡¡¦¥Ï¡¼¥É¥¦¥§¥¢¡Êhypercall device¡Ë¤Î¥ê¥½¡¼¥¹¾ðÊó¤ò¼èÆÀ¤·¡¢hypercall_open´Ø¿ô¤ÎÃæ¤Ç
¡¡¡¡³ä¤ê¹þ¤ß¥Ï¥ó¥É¥é¤È¤·¤Æ¡¢hypercall_interrupt´Ø¿ô¤òÅÐÏ¿
£³ä¤ê¹þ¤ß¥Ï¥ó¥É¥é
hypercall_interrupt [hypercall.c](233)
¨§DPRINTK
¨§spin_lock
¨§HIO_READ8
¨§unlikely
¨§HIO_WRITE8
¨§spin_unlock
¨¦hypercall_tx [hypercall.c](212)
¡¡¨§spin_lock
¡¡¨§HIO_WRITE8
¡¡¨¦spin_unlock
¡¡¡¦Io¥Ý¡¼¥È¤ò·Ðͳ¤·¤Æ¡¢¾ðÊó¤òÆɤ߹þ¤à
¡¡¡¡ËÜÍè¤Ê¤é¡¢É¬Íפʥǥ£¥¹¥Ñ¥Ã¥Á¥ë¡¼¥Á¥ó¤ò¸Æ¤Ó½Ð¤¹¤³¤È¤Ë¤Ê¤ë¤Î¤À¤í¤¦¤¬Ì¤¼ÂÁõ¡Ê¥Û¥¹¥È¤Ø¤Î¾ðÊó¤Î½ñ¤½Ð¤·³Îǧ¤Î¤¿¤á¡¢"hello host"¤ò½ñ¤½Ð¤·¤Æ¤¤¤ë¡Ë
¤¥Ç¥Ð¥¤¥¹¥ê¥à¡¼¥Ö»þ
hypercall_remove_one [hypercall.c](200)
¨§pci_get_drvdata
¨§hypercall_close [hypercall.c](302)
¨¢¨§synchronize_irq
¨¢¨¦free_irq
¨§hypercall_sysfs_remove [hypercall.c](490)
¨¢¨§sysfs_remove_link
¨¢¨¦kobject_del
¨§hypercall_cleanup_dev [hypercall.c](333)
¨¢¨§DPRINTK
¨¢¨§pci_release_regions
¨¢¨§pci_iounmap
¨¢¨§pci_set_drvdata
¨¢¨§kfree
¨¢¨¦__devexit_p
¨¦pci_disable_device
¡¡¡¦¥ê¥à¡¼¥Ö»þ¤ËɬÍפʸå½èÍý
¥¥É¥é¥¤¥Ðºï½ü»þ
hypercall_cleanup_module [hypercall.c](359)
¨¦pci_unregister_driver
¡¡¡¦¥É¥é¥¤¥Ðºï½ü»þ¤ËɬÍפʥ¯¥ê¥ó¥Ê¥Ã¥×½èÍý
¡¡¡Ý¥²¥¹¥ÈOS¾å¤ÎPCI¥Ð¥¹¤Ë²¾ÁۤΡÖhypercall device¡×¤òÍÑ°Õ
¡¡¡Ý¤½¤Î¥Ç¥Ð¥¤¥¹¤Ë³ä¤ê¹þ¤ß¥Ï¥ó¥É¥é¤òÀßÄê
³ä¤ê¹þ¤ß¥Ï¥ó¥É¥é¼«ÂΤϡ¢Io¥Ý¡¼¥È·Ðͳ¤Ç¥Ç¡¼¥¿¤òÆɤ߹þ¤à¤È¤³¤í¤Þ¤Ç¤·¤«¼ÂÁõ¤µ¤ì¤Æ¤¤¤Ê¤¤¡£¥Ç¥£¥¹¥¯¤ä¥Í¥Ã¥È¥ï¡¼¥¯¤Ê¤É¤Î¥É¥é¥¤¥Ð¤Î³ä¤ê¹þ¤ß¤È¤·¤Æ¥Ç¥£¥¹¥Ñ¥Ã¥Á¤µ¤ì¤ë½èÍý¤¬Äɲ䵤ì¤ë¡Ê¤È»×¤ï¤ì¤ë¡Ë¡£
hypercall device¤Î¥Ï¡¼¥É¥¦¥§¥¢¤È¤·¤Æ¤Î¤Õ¤ë¤Þ¤¤¤Ë¤Ä¤¤¤Æ¤Ï¡¢driver\qemu\hw\hypercall.c¤¬¤½¤Î¼ÂÁõ¤È¤Ê¤ë¡£
°Ê¹ß¡¢hypercall.c¤Î¼ÂÁõ¤Ë¤Ä¤¤¤Æ¤Î¼çÍ×Éôʬ¤Ë¤Ä¤¤¤Æ¼¨¤¹¡£¡Ê»²¹Í¡Ë
¡ô¸«¤Æ¤ÎÄ̤ꡢ¸½¾õ¤Ï¥¹¥±¥ë¥È¥ó¥É¥é¥¤¥Ð¤Ë¶á¤¤
¡¥É¥é¥¤¥Ð¤Î½é´ü²½
hypercall_init_module [hypercall.c](353)
¨§printk
¨¦pci_module_init
¡¡¡¦¼¡¤Î¥Ç¥£¥¹¥Ñ¥Ã¥Á¥ë¡¼¥Á¥ó¾ðÊó¤È¤È¤â¤Ë¥É¥é¥¤¥Ð¤ÎÅÐÏ¿¤ò¹Ô¤Ã¤Æ¤¤¤ë
static struct pci_driver hypercall_pci_driver = {
¡¡.name ¡¡¡¡¡¡¡¡= HYPERCALL_DRIVER_NAME,
¡¡.id_table ¡¡= hypercall_pci_tbl,
¡¡.probe = hypercall_init_one,¡¡<--- ¥×¥í¡¼¥Ö½èÍý»þ
¡¡.remove = __devexit_p(hypercall_remove_one),¡¡<--- ¥ê¥à¡¼¥Ö½èÍý»þ
#ifdef CONFIG_PM
¡¡.suspend¡¡¡¡¡¡¡¡¡¡ = hypercall_suspend, <--- ¥µ¥¹¥Ú¥ó¥É»þ
¡¡.resume ¡¡¡¡¡¡¡¡¡¡= hypercall_resume, <--- ¥ì¥¸¥å¡¼¥à»þ
#endif /* CONFIG_PM */
};
¢¥Ç¥Ð¥¤¥¹¥×¥í¡¼¥Ö½èÍý
hypercall_init_one [hypercall.c](163)
¨§pci_read_config_byte
¨§printk
¨§pci_name
¨§hypercall_init_board [hypercall.c](87)
¨¢¨§kzalloc
¨¢¨§printk
¨¢¨§pci_name
¨¢¨§pci_enable_device
¨¢¨§pci_resource_start
¨¢¨§pci_resource_end
¨¢¨§pci_resource_flags
¨¢¨§pci_resource_len
¨¢¨§DPRINTK
¨¢¨§pci_request_regions
¨¢¨§pci_iomap
¨¢¨§hypercall_cleanup_dev [hypercall.c](333)
¨¢¨¢¨§DPRINTK
¨¢¨¢¨§pci_release_regions
¨¢¨¢¨§pci_iounmap
¨¢¨¢¨§pci_set_drvdata
¨¢¨¢¨§kfree
¨¢¨¢¨¦__devexit_p
¨¢¨¦pci_disable_device
¨§spin_lock_init
¨§pci_set_drvdata
¨§hypercall_open [hypercall.c](286)
¨¢¨§request_irq
¨¢¨¦printk
¨¦hypercall_sysfs_add [hypercall.c](462)
¡¡¨§kobject_init
¡¡¨§kobject_set_name
¡¡¨§printk
¡¡¨§kobject_add
¡¡¨§sysfs_create_link
¡¡¨¦kobject_del
¡¡¡¦¥Ï¡¼¥É¥¦¥§¥¢¡Êhypercall device¡Ë¤Î¥ê¥½¡¼¥¹¾ðÊó¤ò¼èÆÀ¤·¡¢hypercall_open´Ø¿ô¤ÎÃæ¤Ç
¡¡¡¡³ä¤ê¹þ¤ß¥Ï¥ó¥É¥é¤È¤·¤Æ¡¢hypercall_interrupt´Ø¿ô¤òÅÐÏ¿
£³ä¤ê¹þ¤ß¥Ï¥ó¥É¥é
hypercall_interrupt [hypercall.c](233)
¨§DPRINTK
¨§spin_lock
¨§HIO_READ8
¨§unlikely
¨§HIO_WRITE8
¨§spin_unlock
¨¦hypercall_tx [hypercall.c](212)
¡¡¨§spin_lock
¡¡¨§HIO_WRITE8
¡¡¨¦spin_unlock
¡¡¡¦Io¥Ý¡¼¥È¤ò·Ðͳ¤·¤Æ¡¢¾ðÊó¤òÆɤ߹þ¤à
¡¡¡¡ËÜÍè¤Ê¤é¡¢É¬Íפʥǥ£¥¹¥Ñ¥Ã¥Á¥ë¡¼¥Á¥ó¤ò¸Æ¤Ó½Ð¤¹¤³¤È¤Ë¤Ê¤ë¤Î¤À¤í¤¦¤¬Ì¤¼ÂÁõ¡Ê¥Û¥¹¥È¤Ø¤Î¾ðÊó¤Î½ñ¤½Ð¤·³Îǧ¤Î¤¿¤á¡¢"hello host"¤ò½ñ¤½Ð¤·¤Æ¤¤¤ë¡Ë
¤¥Ç¥Ð¥¤¥¹¥ê¥à¡¼¥Ö»þ
hypercall_remove_one [hypercall.c](200)
¨§pci_get_drvdata
¨§hypercall_close [hypercall.c](302)
¨¢¨§synchronize_irq
¨¢¨¦free_irq
¨§hypercall_sysfs_remove [hypercall.c](490)
¨¢¨§sysfs_remove_link
¨¢¨¦kobject_del
¨§hypercall_cleanup_dev [hypercall.c](333)
¨¢¨§DPRINTK
¨¢¨§pci_release_regions
¨¢¨§pci_iounmap
¨¢¨§pci_set_drvdata
¨¢¨§kfree
¨¢¨¦__devexit_p
¨¦pci_disable_device
¡¡¡¦¥ê¥à¡¼¥Ö»þ¤ËɬÍפʸå½èÍý
¥¥É¥é¥¤¥Ðºï½ü»þ
hypercall_cleanup_module [hypercall.c](359)
¨¦pci_unregister_driver
¡¡¡¦¥É¥é¥¤¥Ðºï½ü»þ¤ËɬÍפʥ¯¥ê¥ó¥Ê¥Ã¥×½èÍý
2007ǯ03·î21Æü(¿å) 09:01:48 Modified by deku_nobo