尝试回答两个问题:
1. Module如何解决kernel的函数调用问题
2. Module如何解决使用到其它module的函数调用问题
*.ko是个ELF文件,本质上与跑在user space的APP一样. 从Module编译结果看起:
执行指令: readelf -a usb_wwan.ko,摘录部分与本主题有关系:
00002104 0001801c R_ARM_CALL 00000000 printk
0000210c 00018b1c R_ARM_CALL 00001014 usb_serial_get_by_inde
与printk不一样, usb_serial_get_by_inde来自于usbserial.ko,但是二者在usb_wwan.ko并无值得关注的差别,也就是说此刻,usb_wwan.ko并没区分它所调用的函数来自于何方
那加载usb_wwan.ko的时候,kernel做了些什么事情呢?
load_module干的活太多,我们还是只关注relocation相关细节, simplify_symbols()完成了symbols的处理,看具体细节
load_module() --> simplify_symbols()
case SHN_UNDEF:
ksym = resolve_symbol_wait(mod, info, name);
SHN_UNDEF处理了kernel及其他模块的符号,go on...
simplify_symbols() -->resolve_symbol_wait()-->resolve_symbol() -->find_symbol()-