目次
virtinput_probe 呼び出しの完全なバックトレース
kernel_init から do_one_initcall へ
virtio_input_driver_init がバスを介してデバイスとドライバーを照合するプロセス
virtinput_probe 呼び出しの完全なバックトレース
以下は、呼び出される virinput_probe プロセスの完全なバックトレースです (virinput_probe 関数に WARN_ON() を追加することで、この情報をカーネル ログに出力できます)。
virtinput_probe+0xfc/0xaec
virtio_dev_probe+0x1a8/0x474
really_probe+0x1cc/0x78c
driver_probe_device+0xb4/0x13c
device_driver_attach+0x6c/0xac
__driver_attach+0xd4/0x22c
bus_for_each_dev+0x9c/0x108
driver_attach+0x24/0x30
bus_add_driver+0x124/0x204
driver_register+0x78/0x114
register_virtio_driver+0x2c/0x3c
virtio_input_driver_init+0x18/0x24
do_one_initcall+0x198/0x368
do_initcall_level+0x188/0x1b0
do_basic_setup+0x30/0x4c
kernel_init_freeable+0xc0/0x140
kernel_init+0x18/0x2b4
このバックトレースは、大きく 3 つの部分に分かれています。
1、kernel_init から do_one_initcall
2. virtio_input_driver_init がバスを介してデバイスとドライバーを照合するプロセス
3,virtinput_probe
kernel_init から do_one_initcall へ
このプロセスは比較的明確です。簡単に言うと、kernel_init カーネル スレッドは do_initcall_level を呼び出し、各レベルのドライバー モジュールを順番にロードします。これらのドライバー モジュールは多くのレベルに分割されており、各レベルのロード優先順位は異なります。これらのドライバー モジュールは、カーネルがコンパイルされたときに対応するレベルに従ってカーネル イメージ内にすでに存在しており、最終的に do_one_initcall によってさまざまなオフセットを介して関数のエントリに呼び出されます。
virtio_input_driver_init がバスを介してデバイスとドライバーを照合するプロセス
前述のように、do_one_initcall はドライバーのロードを完了するために各 fn を呼び出します。これらの fn はカーネル イメージでコンパイルされ、リンク プロセス中に対応するセクションに配置されます。カーネルがコンパイルされると、カーネル構成を通じてどのモジュールをコンパイルする必要があるかがわかります。
現在の virtio-input ドライバー関数を例にとると、do_one_initcall 関数の fn 関数は virtio_input_driver_init です。
int __init_or_module do_one_initcall(initcall_t fn)
{
int count = preempt_count();
char msgbuf[64];
int ret;
if (initcall_blacklisted(fn))
return -EPERM;
do_trace_initcall_start(fn);
ret = fn();
do_trace_initcall_finish(fn, ret);
この関数は通常、マクロ定義関数であるため、カーネル ソース コード内で直接検索することはできません。分析ソースコードファイル: drivers/virtio/virtio_input.c
module_virtio_driver(virtio_input_driver);
MODULE_DEVICE_TABLE(virtio, id_table);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Virtio input device driver");
MODULE_AUTHOR("Gerd Hoffmann <[email protected]>")
module_virtio_driver はファイル include/linux/virtio.h で定義されています
/* module_virtio_driver() - Helper macro for drivers that don't do
* anything special in module init/exit. This eliminates a lot of
* boilerplate. Each module may only use this macro once, and
* calling it replaces module_init() and module_exit()
*/
#define module_virtio_driver(__virtio_driver) \
module_driver(__virtio_driver, register_virtio_driver, \
unregister_virtio_driver)
#endif /* _LINUX_VIRTIO_H */
module_driver の定義はファイル include/linux/device.h にあります。
#define module_driver(__driver, __register, __unregister, ...) \
static int __init __driver##_init(void) \
{ \
return __register(&(__driver) , ##__VA_ARGS__); \
} \
module_init(__driver##_init); \
static void __exit __driver##_exit(void) \
{ \
__unregister(&(__driver) , ##__VA_ARGS__); \
} \
module_exit(__driver##_exit);
これを見ると、virtio_input_driver_init 関数定義が virtio_input_driver + _init で構成されていることがわかります。最後に、カーネルの module_init マクロ定義がカーネルに登録されます。カーネルが do_one_initcall を呼び出して対応する init 関数を 1 つずつ呼び出すと、最終的に上記マクロ定義内の __register 関数が呼び出されます。この関数は実際には register_virtio_driver (module_ 内) です。ドライバーマクロ定義の 2 番目のマクロ引数)。
register_virtio_driver は、driver_register を呼び出して標準 Linux デバイス ドライバー モデル プロセスに従い、最後に virinput_probe を呼び出します。
really_probe+0x1cc/0x78c
driver_probe_device+0xb4/0x13c
device_driver_attach+0x6c/0xac
__driver_attach+0xd4/0x22c
bus_for_each_dev+0x9c/0x108
driver_attach+0x24/0x30
bus_add_driver+0x124/0x204
driver_register+0x78/0x114
標準の Linux デバイス ドライバー モデルには、バス、ドライバー、デバイスという 3 つの概念が含まれることがわかっています。
バス: virtio はコア レベルのドライバーおよびバス ドライバーです。ソース コード ファイルは drivers/virtio/virtio.c です。他の virtio デバイス (virtio-i2c/virtio-blk など) もこのバスに基づいています。
static struct bus_type virtio_bus = {
.name = "virtio",
.match = virtio_dev_match,
.dev_groups = virtio_dev_groups,
.uevent = virtio_uevent,
.probe = virtio_dev_probe,
.remove = virtio_dev_remove,
};
...skip...
static void __exit virtio_exit(void)
{
bus_unregister(&virtio_bus);
ida_destroy(&virtio_index_ida);
}
core_initcall(virtio_init);
module_exit(virtio_exit);
ドライバー: ここに virtio_input_driver があります
device: まだ見つかりません 通常、デバイスのノード情報は dts 解析後に取得されることが多いですが、使用されている dts ファイルを検索したところ、virtio-input に関連するノードは見つかりませんでした。
しかし、それは問題ではありません。virtio_input_driver_init 関数から分析して、実際にプローブ関数をどのように呼び出しているかを確認してみましょう。
register_virtio_driver
先ほど、virtio_input_driver_init が登録時に実際に register_virtio_driver 関数を呼び出すと述べました。
int register_virtio_driver(struct virtio_driver *driver)
{
/* Catch this early. */
BUG_ON(driver->feature_table_size && !driver->feature_table);
driver->driver.bus = &virtio_bus;
return driver_register(&driver->driver);
}
この関数の実装は非常に簡単で、まずドライバー内の feature_table_size と feature_table が正常に割り当てられているかどうかを判断し、ドライバーをバスにリンクします。
ドライバー_登録
...skip....
other = driver_find(drv->name, drv->bus);
if (other) {
printk(KERN_ERR "Error: Driver '%s' is already registered, "
"aborting...\n", drv->name);
return -EBUSY;
}
ret = bus_add_driver(drv);
if (ret)
return ret;
ret = driver_add_groups(drv, drv->groups);
if (ret) {
bus_remove_driver(drv);
return ret;
}
kobject_uevent(&drv->p->kobj, KOBJ_ADD);
この関数は、ドライバーがバスにロードされているかどうかの判断など、いくつかの判断を開始します。その中で最も重要なものは、bus_add_driver 関数です。
__driver_attach
一連の呼び出しの後、この関数は最終的に __driver_attach 関数を呼び出します。この関数で最も重要な呼び出しは次のとおりです。
このコード行は、ドライバーとデバイスが実際に一致する場所です。
この関数コードの実装も非常に簡単で、バスに独自の match 関数がある場合はバス独自の match インターフェイスを呼び出し、そうでない場合は直接 1 を返します。
static inline int driver_match_device(struct device_driver *drv,
struct device *dev)
{
return drv->bus->match ? drv->bus->match(dev, drv) : 1;
}
virtioバスのmatch関数は以下のように実装されています。
static inline int virtio_id_match(const struct virtio_device *dev,
const struct virtio_device_id *id)
{
if (id->device != dev->id.device && id->device != VIRTIO_DEV_ANY_ID)
return 0;
return id->vendor == VIRTIO_DEV_ANY_ID || id->vendor == dev->id.vendor;
}
/* This looks through all the IDs a driver claims to support. If any of them
* match, we return 1 and the kernel will call virtio_dev_probe(). */
static int virtio_dev_match(struct device *_dv, struct device_driver *_dr)
{
unsigned int i;
struct virtio_device *dev = dev_to_virtio(_dv);
const struct virtio_device_id *ids;
ids = drv_to_virtio(_dr)->id_table;
for (i = 0; ids[i].device; i++)
if (virtio_id_match(dev, &ids[i]))
return 1;
return 0;
}
ドライバーとデバイスが一致するかどうかは、条件 id->vendor == VIRTIO_DEV_ANY_ID || id->vendor == dev→id.vendor によって決定されることがわかります。ドライバー drivers/virtio/virtio_input.c:
static struct virtio_device_id id_table[] = {
{ VIRTIO_ID_INPUT, VIRTIO_DEV_ANY_ID },
{ 0 },
};
まとめ
virtio 入力読み込みプロセス全体は、大きく 3 つの部分に分かれています。
1、kernel_init から do_one_initcall
このプロセスは比較的明確です
2. virtio_input_driver_init がバスを介してデバイスとドライバーを照合するプロセス
このプロセスは、標準の Linux デバイス ドライバー モデルに従い、デバイスとドライバーの照合プロセス中に、バスによって定義された match 関数が呼び出され、ドライバーとデバイスが照合されます。virtio-input ドライバーでは、id_table を使用してドライバーとデバイスを照合します。
3,virtinput_probe
一般的に、デバイスは gpio/レジスタ アドレスなどのハードウェア リソース情報を提供する責任があることはわかっていますが、これまでのところ、virtio-input デバイスによって提供されるハードウェア リソース情報は見つかりませんでした。
失われたデバイス構成情報の謎
カーネルの dts およびドライバーのソース コードに virtio-touch 構成情報が見つからなかったと前述しましたが、実際には、virtio-touch ドライバーは問題なくロードされ、動作します。これは非常に奇妙なことです。
理論的には、virtio-touch はいずれにしても Linux プラットフォームのデバイス ドライバー モデルに従う必要があり、バス ドライバー デバイスが不可欠であるためです。
virtio-mmio にデバッグ ログを追加する
Virtio-mmio は、カーネル内の virtio からの最も古い virtio モジュールです。このモジュールのプローブ関数に、ログを追加します。
printk("デバッグ用 virtio_mmio_probe pdev->name:%s\n", pdev→name);
このときログを出力しても既にpdev->name が割り当てられていることが分かり、mmio ドライバ全体を見るとそれらの場所には qnx 通信用のインターフェースがないようです。
この実験は上記の推測が当てはまらない可能性を示しているので、これはさらに奇妙ですが、カーネルが dtb をデバイス ノードに変換する最初の場所を見つけて、そこにログを追加する必要があります。
デバッグログをbus_for_each_devに追加
この関数にログを追加すると、カーネル内のすべてのデバイス ノードの名前が出力されます。ログを追加すると、カーネルの最初の段階でも virtio-touch ノードがすでに存在していることがわかります。
カーネルが取得したdtbデータはdtsノードに追加されたデータなのでしょうか?
fdtファイルを翻訳する
カーネル内のmsmnile_gvmq:/sys/firmware /fdt ファイルがカーネル dtb ファイルであることがわかっているので、このファイルを dts に変換し、virtio-input ノードが含まれているかどうかを確認できます。
コマンド dtc -I dtb -o sa8295p-vm.dts fdt を使用して dts ファイルを変換します。その中には次のものがあります。
これは、カーネルによって取得された dtb データに virtio-input ノードが実際に追加されていることを示しています。
dts データを変更したのは誰ですか?
la が起動するたびにログ ファイル la_gvm.txt を観察すると、数行のログがあることがわかります。
これらのログ行が dts を追加および変更する場所であると思われます。linux-la.config を変更しようとした後、vdev vdev-virtio-input.soノードが削除されると、次のログ行の出力も減少することがわかりました。たとえば、次のログは 2 つの vdev vdev-virtio-input.so ノード (元々は 3つありました)を削除しました。
ここから始めてみます。
register_for_ssr_events 関数
QNX で register_for_ssr_events を検索すると、ファイル AMSS/platform/vm/vdev/vdev-glink-ssr/vdev.c +683 関数 register_for_ssr_events が見つかります。これには dts の操作があります。
static int register_for_ssr_events(glink_ssr_virt_dev_t *dev)
{
uint64_t client_magic = 0;
uint32_t event_mask = 0;
char * client_name = "vdev_glink_ssr";
void *handle;
const void *fdt;
int offset;
int ret = EOK;
QVM_LOG(GLINK_SSRVIRTLOG_ERROR, "%s ++", __func__);
printf("%s ++\r\n", __func__);
fdt = fdt_get_root();
if (!fdt) {
QVM_LOG(GLINK_SSRVIRTLOG_ERROR, "/glink-ssr fdt_get_root failed");
return -1;
}
しかし、綿密な調査の結果、実際の virtio register_for_ssr_events 関数はこのモジュールでは呼び出されないことがわかりましたが、上記のモジュールは virtio-input ライブラリでの使用例を示しています (このライブラリはオープンソースではありません)。
ただし、objdump を使用して内部関数を確認できます。
root@ubuntu$ ~/SDP/./host/linux/x86_64/usr/bin/ntoaarch64-objdump -x ./qnx_bins/prebuilt_QNX700/target/qnx7/x86_64/lib/dll/vdev-virtio-input.so
./qnx_bins/prebuilt_QNX700/target/qnx7/x86_64/lib/dll/vdev-virtio-input.so: file format elf64-little
./qnx_bins/prebuilt_QNX700/target/qnx7/x86_64/lib/dll/vdev-virtio-input.so
architecture: UNKNOWN!, flags 0x00000150:
HAS_SYMS, DYNAMIC, D_PAGED
start address 0x0000000000001dc0
Program Header:
LOAD off 0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**21
filesz 0x0000000000024a34 memsz 0x0000000000024a34 flags r-x
LOAD off 0x0000000000024b20 vaddr 0x0000000000224b20 paddr 0x0000000000224b20 align 2**21
filesz 0x0000000000000558 memsz 0x00000000000005b0 flags rw-
DYNAMIC off 0x0000000000024b88 vaddr 0x0000000000224b88 paddr 0x0000000000224b88 align 2**3
filesz 0x00000000000001e0 memsz 0x00000000000001e0 flags rw-
NOTE off 0x00000000000001c8 vaddr 0x00000000000001c8 paddr 0x00000000000001c8 align 2**2
filesz 0x0000000000000020 memsz 0x0000000000000020 flags r--
NOTE off 0x0000000000024a1c vaddr 0x0000000000024a1c paddr 0x0000000000024a1c align 2**2
filesz 0x0000000000000018 memsz 0x0000000000000018 flags r--
EH_FRAME off 0x0000000000024408 vaddr 0x0000000000024408 paddr 0x0000000000024408 align 2**2
filesz 0x00000000000000bc memsz 0x00000000000000bc flags r--
RELRO off 0x0000000000024b20 vaddr 0x0000000000224b20 paddr 0x0000000000224b20 align 2**0
filesz 0x00000000000004e0 memsz 0x00000000000004e0 flags r--
Dynamic Section:
NEEDED libscreen.so.1
NEEDED libc.so.4
SONAME vdev-virtio-input.so
SYMBOLIC 0x0000000000000000
INIT 0x0000000000001930
FINI 0x000000000000585a
INIT_ARRAY 0x0000000000224b20
INIT_ARRAYSZ 0x0000000000000010
FINI_ARRAY 0x0000000000224b30
FINI_ARRAYSZ 0x0000000000000008
GNU_HASH 0x00000000000001e8
STRTAB 0x0000000000000a40
SYMTAB 0x0000000000000230
STRSZ 0x0000000000000607
SYMENT 0x0000000000000018
PLTGOT 0x0000000000224d68
PLTRELSZ 0x00000000000006a8
PLTREL 0x0000000000000007
JMPREL 0x0000000000001288
RELA 0x0000000000001048
RELASZ 0x0000000000000240
RELAENT 0x0000000000000018
BIND_NOW 0x0000000000000000
FLAGS_1 0x0000000000000001
RELACOUNT 0x0000000000000011
Sections:
Idx Name Size VMA LMA File off Algn
0 .note.gnu.build-id 00000020 00000000000001c8 00000000000001c8 000001c8 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
1 .gnu.hash 00000048 00000000000001e8 00000000000001e8 000001e8 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .dynsym 00000810 0000000000000230 0000000000000230 00000230 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
3 .dynstr 00000607 0000000000000a40 0000000000000a40 00000a40 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .rela.dyn 00000240 0000000000001048 0000000000001048 00001048 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
5 .rela.plt 000006a8 0000000000001288 0000000000001288 00001288 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
6 .init 00000009 0000000000001930 0000000000001930 00001930 2**0
CONTENTS, ALLOC, LOAD, READONLY, CODE
7 .plt 00000480 0000000000001940 0000000000001940 00001940 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
8 .text 00003a9a 0000000000001dc0 0000000000001dc0 00001dc0 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
9 .fini 00000009 000000000000585a 000000000000585a 0000585a 2**0
CONTENTS, ALLOC, LOAD, READONLY, CODE
10 .rodata 0001eb88 0000000000005880 0000000000005880 00005880 2**5
CONTENTS, ALLOC, LOAD, READONLY, DATA
11 .eh_frame_hdr 000000bc 0000000000024408 0000000000024408 00024408 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
12 .eh_frame 00000554 00000000000244c8 00000000000244c8 000244c8 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
13 .note 00000018 0000000000024a1c 0000000000024a1c 00024a1c 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
14 .init_array 00000010 0000000000224b20 0000000000224b20 00024b20 2**3
CONTENTS, ALLOC, LOAD, DATA
15 .fini_array 00000008 0000000000224b30 0000000000224b30 00024b30 2**3
CONTENTS, ALLOC, LOAD, DATA
16 .jcr 00000008 0000000000224b38 0000000000224b38 00024b38 2**3
CONTENTS, ALLOC, LOAD, DATA
17 .data.rel.ro 00000048 0000000000224b40 0000000000224b40 00024b40 2**5
CONTENTS, ALLOC, LOAD, DATA
18 .dynamic 000001e0 0000000000224b88 0000000000224b88 00024b88 2**3
CONTENTS, ALLOC, LOAD, DATA
19 .got 00000288 0000000000224d68 0000000000224d68 00024d68 2**3
CONTENTS, ALLOC, LOAD, DATA
20 .data 00000078 0000000000225000 0000000000225000 00025000 2**5
CONTENTS, ALLOC, LOAD, DATA
21 .bss 00000050 0000000000225080 0000000000225080 00025078 2**5
ALLOC
22 .comment 0000003e 0000000000000000 0000000000000000 00025078 2**0
CONTENTS, READONLY
23 QNX_usage 00000cc4 0000000000000000 0000000000000000 000250b6 2**0
CONTENTS, READONLY
24 .gnu_debuglink 00000020 0000000000000000 0000000000000000 00025d7a 2**0
CONTENTS, READONLY
25 QNX_info 000000ed 0000000000000000 0000000000000000 00025d9a 2**0
CONTENTS, READONLY
SYMBOL TABLE:
0000000000000001 l *ABS* 0000000000000000 __pic__
0000000000000001 l *ABS* 0000000000000000 __PIC__
0000000000000001 l *ABS* 0000000000000000 __pic__
0000000000000001 l *ABS* 0000000000000000 __PIC__
0000000000024508 l O .eh_frame 0000000000000000 __EH_FRAME_BEGIN__
0000000000224b38 l O .jcr 0000000000000000 __JCR_LIST__
0000000000001de0 l F .text 0000000000000000 deregister_tm_clones
0000000000001e20 l F .text 0000000000000000 register_tm_clones
0000000000001e70 l F .text 0000000000000000 __do_global_dtors_aux
0000000000225080 l O .bss 0000000000000001 completed.6154
0000000000224b30 l O .fini_array 0000000000000000 __do_global_dtors_aux_fini_array_entry
0000000000001ec0 l F .text 0000000000000000 frame_dummy
00000000002250a0 l O .bss 0000000000000030 object.6159
0000000000224b20 l O .init_array 0000000000000000 __frame_dummy_init_array_entry
0000000000000001 l *ABS* 0000000000000000 __pic__
0000000000000001 l *ABS* 0000000000000000 __PIC__
0000000000001f10 l F .text 0000000000000033 vdinput_pulse
0000000000001f50 l F .text 000000000000022b vi_event_transfer
0000000000002180 l F .text 00000000000000a9 vdinput_vread
0000000000002230 l F .text 0000000000000132 vi_device_lookup
0000000000002370 l F .text 000000000000004c vi_device_touches
00000000000023c0 l F .text 0000000000000081 vi_device_coords
0000000000002450 l F .text 000000000000008c vi_device_moved
00000000000024e0 l F .text 0000000000000077 vi_config_insert.isra.9
0000000000002560 l F .text 00000000000002f3 abs_dimensions
0000000000002860 l F .text 000000000000007d vi_config_merge
00000000000028e0 l F .text 000000000000069b screen_device_insertion
0000000000005d80 l O .rodata 000000000001e4ce keyboard_map_keys
0000000000005d68 l O .rodata 000000000000000a touch_map_taps
0000000000005d78 l O .rodata 0000000000000008 pointer_map_buttons
0000000000002f80 l F .text 0000000000001559 event_via_screen
0000000000005d50 l O .rodata 0000000000000011 __func__.10353
0000000000005d20 l O .rodata 0000000000000008 overflow.10144
0000000000005d30 l O .rodata 0000000000000017 __func__.10307
00000000000044e0 l F .text 00000000000000a3 vi_state_reset
0000000000004590 l F .text 00000000000002b3 vdinput_vwrite
0000000000004850 l F .text 000000000000007a vdinput_pulse_thread
0000000000004a20 l F .text 00000000000005cf vi_screen_setup
0000000000004ff0 l F .text 000000000000077b vdinput_control
0000000000024260 l O .rodata 0000000000000020 input_description
0000000000001dc0 l F .text 0000000000000011 vdinput_register
0000000000225020 l O .data 0000000000000058 vdinput_factory.10591
0000000000224b40 l O .data.rel.ro 0000000000000048 vdinput_options.10590
0000000000000001 l *ABS* 0000000000000000 __pic__
0000000000000001 l *ABS* 0000000000000000 __PIC__
0000000000000001 l *ABS* 0000000000000000 __pic__
0000000000000001 l *ABS* 0000000000000000 __PIC__
0000000000024a18 l O .eh_frame 0000000000000000 __FRAME_END__
0000000000224b38 l O .jcr 0000000000000000 __JCR_END__
0000000000224b88 l O .dynamic 0000000000000000 _DYNAMIC
0000000000225078 l O .data 0000000000000000 __TMC_END__
0000000000225000 l O .data 0000000000000000 __dso_handle
0000000000224d68 l O .got 0000000000000000 _GLOBAL_OFFSET_TABLE_
00000000000001c8 l d .note.gnu.build-id 0000000000000000 .note.gnu.build-id
00000000000001e8 l d .gnu.hash 0000000000000000 .gnu.hash
0000000000000230 l d .dynsym 0000000000000000 .dynsym
0000000000000a40 l d .dynstr 0000000000000000 .dynstr
0000000000001048 l d .rela.dyn 0000000000000000 .rela.dyn
0000000000001288 l d .rela.plt 0000000000000000 .rela.plt
0000000000001930 l d .init 0000000000000000 .init
0000000000001940 l d .plt 0000000000000000 .plt
0000000000001dc0 l d .text 0000000000000000 .text
000000000000585a l d .fini 0000000000000000 .fini
0000000000005880 l d .rodata 0000000000000000 .rodata
0000000000024408 l d .eh_frame_hdr 0000000000000000 .eh_frame_hdr
00000000000244c8 l d .eh_frame 0000000000000000 .eh_frame
0000000000024a1c l d .note 0000000000000000 .note
0000000000224b20 l d .init_array 0000000000000000 .init_array
0000000000224b30 l d .fini_array 0000000000000000 .fini_array
0000000000224b38 l d .jcr 0000000000000000 .jcr
0000000000224b40 l d .data.rel.ro 0000000000000000 .data.rel.ro
0000000000224b88 l d .dynamic 0000000000000000 .dynamic
0000000000224d68 l d .got 0000000000000000 .got
0000000000225000 l d .data 0000000000000000 .data
0000000000225080 l d .bss 0000000000000000 .bss
0000000000000000 l d .comment 0000000000000000 .comment
0000000000000000 l d QNX_usage 0000000000000000 QNX_usage
0000000000000000 l d .gnu_debuglink 0000000000000000 .gnu_debuglink
0000000000000000 l d QNX_info 0000000000000000 QNX_info
0000000000000000 *UND* 0000000000000000 vio_setup_queues
0000000000005770 g F .text 0000000000000033 virtq_avail_get
0000000000000000 *UND* 0000000000000000 guest_cpu_read
0000000000000000 F *UND* 0000000000000000 pthread_cond_signal
0000000000000000 F *UND* 0000000000000000 screen_get_window_property_pv
0000000000000000 F *UND* 0000000000000000 strerror
0000000000000000 *UND* 0000000000000000 gfdt_update_prop_string
00000000000057b0 g F .text 00000000000000aa virtq_used_put_notify
0000000000000000 F *UND* 0000000000000000 screen_set_window_property_pv
0000000000000000 F *UND* 0000000000000000 snprintf
0000000000000000 F *UND* 0000000000000000 screen_get_device_property_iv
00000000000048d0 g F .text 0000000000000141 set_display
0000000000000000 *UND* 0000000000000000 vio_ctrl_pci_bars
0000000000000000 O *UND* 0000000000000000 __stack_chk_guard
0000000000000000 *UND* 0000000000000000 qvm_outf
0000000000000000 F *UND* 0000000000000000 screen_create_window_buffers
0000000000000000 F *UND* 0000000000000000 getpid
0000000000000000 F *UND* 0000000000000000 screen_destroy_event
0000000000000000 F *UND* 0000000000000000 screen_flush_context
0000000000000000 F *UND* 0000000000000000 pthread_cancel
0000000000000000 F *UND* 0000000000000000 screen_create_window_type
0000000000000000 *UND* 0000000000000000 gasp_unmap
0000000000000000 w F *UND* 0000000000000000 __cxa_finalize
0000000000000000 F *UND* 0000000000000000 screen_set_session_property_pv
0000000000000000 F *UND* 0000000000000000 malloc
0000000000000000 F *UND* 0000000000000000 screen_destroy_session
0000000000000000 *UND* 0000000000000000 vio_init_queue
0000000000000000 F *UND* 0000000000000000 screen_destroy_window
0000000000000000 F *UND* 0000000000000000 screen_set_session_property_iv
0000000000000000 *UND* 0000000000000000 qvm_outff
0000000000000000 F *UND* 0000000000000000 __stack_chk_fail
0000000000001930 g F .init 0000000000000000 _init
0000000000000000 F *UND* 0000000000000000 screen_create_event
0000000000000000 F *UND* 0000000000000000 screen_set_window_property_iv
0000000000000000 F *UND* 0000000000000000 screen_get_event
0000000000000000 F *UND* 0000000000000000 calloc
0000000000000000 F *UND* 0000000000000000 screen_get_event_property_pv
0000000000000000 F *UND* 0000000000000000 screen_notify
0000000000000000 w *UND* 0000000000000000 __deregister_frame_info
0000000000000000 *UND* 0000000000000000 vio_read
0000000000000000 w *UND* 0000000000000000 _ITM_registerTMCloneTable
0000000000000000 *UND* 0000000000000000 guest_cpu_write
0000000000000000 F *UND* 0000000000000000 __get_errno_ptr
0000000000000000 *UND* 0000000000000000 gfdt_update_reg
0000000000000000 *UND* 0000000000000000 gfdt_update_node
0000000000000000 *UND* 0000000000000000 vdev_register_factory
0000000000000000 F *UND* 0000000000000000 screen_create_session_type
0000000000000000 F *UND* 0000000000000000 strlcpy
0000000000000000 F *UND* 0000000000000000 strncmp
0000000000000000 F *UND* 0000000000000000 pthread_cond_init
0000000000000000 F *UND* 0000000000000000 sscanf
0000000000001dc0 g .text 0000000000000000 _btext
0000000000000000 F *UND* 0000000000000000 screen_set_window_property_cv
0000000000000000 w *UND* 0000000000000000 _ITM_deregisterTMCloneTable
0000000000225078 g .bss 0000000000000000 __bss_start
0000000000000000 F *UND* 0000000000000000 memset
0000000000000000 *UND* 0000000000000000 qvm_parse_num
0000000000000000 F *UND* 0000000000000000 screen_get_window_property_cv
0000000000000000 F *UND* 0000000000000000 strcmp
0000000000000000 F *UND* 0000000000000000 pthread_mutex_unlock
0000000000000000 *UND* 0000000000000000 vio_write
000000000000585a g F .fini 0000000000000000 _fini
0000000000000000 F *UND* 0000000000000000 screen_get_window_property_iv
0000000000000000 F *UND* 0000000000000000 screen_get_event_property_iv
0000000000000000 *UND* 0000000000000000 vio_init
0000000000000000 F *UND* 0000000000000000 screen_create_context
0000000000225078 g .data 0000000000000000 _edata
00000000002250d0 g .bss 0000000000000000 _end
0000000000000000 F *UND* 0000000000000000 pthread_mutex_lock
0000000000000000 F *UND* 0000000000000000 pthread_cond_wait
0000000000000000 *UND* 0000000000000000 vio_reset
0000000000000000 F *UND* 0000000000000000 pthread_cond_destroy
0000000000000000 *UND* 0000000000000000 gfdt_update_interrupts
0000000000000000 F *UND* 0000000000000000 screen_get_context_property_pv
0000000000000000 F *UND* 0000000000000000 screen_get_display_property_iv
0000000000000000 *UND* 0000000000000000 vdev_pulse
0000000000000000 F *UND* 0000000000000000 screen_destroy_context
0000000000000000 *UND* 0000000000000000 gasp_map_vdma
0000000000000000 w *UND* 0000000000000000 _Jv_RegisterClasses
0000000000000000 F *UND* 0000000000000000 pthread_join
0000000000000000 w *UND* 0000000000000000 __register_frame_info
0000000000000000 *UND* 0000000000000000 vdev_thread_create
0000000000000000 F *UND* 0000000000000000 screen_get_context_property_iv
0000000000000000 F *UND* 0000000000000000 free
virtio と特定のデバイス間の対応:
msmnile_gvmq:/ # cat /proc/interrupts | grep virt
5: 206598 0 0 0 0 0 0 GICv3 80 Level virtio0-1c200000.virtio_clock
6: 6 0 0 0 0 0 0 GICv3 81 Level virtio1-1c300000.virtio_clock
7: 139 0 0 0 0 0 0 GICv3 74 Level virtio2-1c700000.virtio_regulator
8: 0 0 0 0 0 0 0 GICv3 77 Level virtio3-1c800000.virtio-spmi
159: 8 0 0 0 0 0 0 GICv3 40 Level virtio4-1c450000.virtio_blk, virtio8-1c0b0000.virtio_blk
160: 5 0 0 0 0 0 0 GICv3 43 Level virtio5-1c460000.virtio_blk
161: 5 0 0 0 0 0 0 GICv3 44 Level virtio6-1c470000.virtio_blk
162: 115140 0 0 0 0 0 0 GICv3 45 Level virtio7-1c480000.virtio_blk
163: 2 0 0 0 0 0 0 GICv3 48 Level virtio9-1c140000.virtio_blk
164: 1 0 0 0 0 0 0 GICv3 49 Level virtio10-1c0f0000.virtio_blk
165: 0 0 0 0 0 0 0 GICv3 46 Level virtio11-1c380000.virtio_input_mtouch
166: 0 0 0 0 0 0 0 GICv3 42 Level virtio12-1c0d0000.virtio_input_mtouch
167: 0 0 0 0 0 0 0 GICv3 82 Level virtio13-1c900000.virtio_fastrpc
168: 33871 0 0 0 0 0 0 GICv3 76 Level virtio14-1c1c0000.virtio_net
169: 19030 0 0 0 0 0 0 GICv3 41 Level virtio15-1c0c0000.virtio_net
195: 643 0 0 0 0 0 0 GICv3 37 Level virtio16-1c090000.virtio_console
197: 0 0 0 0 0 0 0 GICv3 47 Level virtio17-1c150000.virtio_input_keyboard