文章目录
Why:为什么会出现“Unknown Symbol”
当你insmod加载一个ko模块时,它总需要依赖一些其他模块。比如在linux上display驱动会依赖drm、drm_kms_helper等。如果被依赖的模块还未加载,而直接加载目标ko,则会出现“Unknown Symbol
”的情况,即“未知符号
”,也即“找不到模块依赖的xxx函数接口
”。
如下:
xxgpu: Unknown symbol drm_dp_clock_recovery_ok (err -2)
Where:怎么查找所在模块
可以根据日志查看缺少的函数接口,从函数名出发,定位所在ko库。
- 查找驱动文件
drm_dp_clock_recovery_ok
在drivers/gpu/drm/display/drm_dp_helper.c
文件中定义。// drivers/gpu/drm/display/drm_dp_helper.c bool drm_dp_clock_recovery_ok(const u8 link_status[DP_LINK_STATUS_SIZE], int lane_count) { int lane; u8 lane_status; for (lane = 0; lane < lane_count; lane++) { lane_status = dp_get_lane_status(link_status, lane); if ((lane_status & DP_LANE_CR_DONE) == 0) return false; } return true; } EXPORT_SYMBOL(drm_dp_clock_recovery_ok);
- 查找库
drm_dp_helper.c
在drivers/gpu/drm/display/Makefile
位置被编译,打包到drm_display_helper
库,同时受CONFIG宏CONFIG_DRM_DISPLAY_DP_HELPER
控制。// drivers/gpu/drm/display/Makefile drm_display_helper-$(CONFIG_DRM_DISPLAY_DP_HELPER) += \ drm_dp_dual_mode_helper.o \ drm_dp_helper.o \ drm_dp_mst_topology.o \ drm_dsc_helper.o
How:如何加载这个模块
- 首先确认系统中是否包含这个库。
可以使用find
命令查找这个库文件:
一般会在find / -name drm_display_helper.ko
/usr/lib/modules/$(uname -r)/kernel/drivers/gpu/drm/display/drm_display_helper.ko
。 - 如果有这个库文件,则可以直接加载
sudo insmod $(path)/drm_display_helper.ko
- 如果没有这个库文件,则需要确认是否开启了
CONFIG_DRM_DISPLAY_DP_HELPER
修改config文件:
待系统中包含了make menuconfig
drm_display_helper.ko
之后,再执行加载命令:sudo insmod $(path)/drm_display_helper.ko
Done:加载目标库
drm_display_helper
库加载之后,Unknown symbol
的问题就解决了,接下来就可以加载目标库文件。
sudo insmod xxxgpu.ko
Display依赖的几个库
缺少drm_display_helper库(linux6.6)
/usr/lib/modules/$(uname -r)/kernel/drivers/gpu/drm/display/drm_display_helper.ko
xxgpu: Unknown symbol drm_dp_clock_recovery_ok (err -2)
xxgpu: Unknown symbol drm_dsc_compute_rc_parameters (err -2)
xxgpu: Unknown symbol drm_dp_get_adjust_request_voltage (err -2)
xxgpu: Unknown symbol drm_dp_channel_eq_ok (err -2)
xxgpu: Unknown symbol drm_dp_bw_code_to_link_rate (err -2)
xxgpu: Unknown symbol drm_dp_aux_unregister (err -2)
xxgpu: Unknown symbol drm_dp_psr_setup_time (err -2)
xxgpu: Unknown symbol drm_dp_dpcd_write (err -2)
xxgpu: Unknown symbol drm_dp_dpcd_read (err -2)
xxgpu: Unknown symbol drm_dp_link_train_channel_eq_delay (err -2)
xxgpu: Unknown symbol drm_scdc_write (err -2)
xxgpu: Unknown symbol drm_scdc_read (err -2)
xxgpu: Unknown symbol drm_dp_aux_register (err -2)
xxgpu: Unknown symbol drm_scdc_set_scrambling (err -2)
xxgpu: Unknown symbol drm_dsc_pps_payload_pack (err -2)
xxgpu: Unknown symbol drm_scdc_set_high_tmds_clock_ratio (err -2)
xxgpu: Unknown symbol drm_dp_dpcd_read_link_status (err -2)
xxgpu: Unknown symbol drm_dp_get_adjust_request_pre_emphasis (err -2)
xxgpu: Unknown symbol drm_dp_link_train_clock_recovery_delay (err -2)
缺少drm_kms_helper库(linux5.4)
/usr/lib/modules/$(uname -r)/kernel/drivers/gpu/drm/drm_kms_helper.ko
xxgpu: Unknown symbol drm_dp_channel_eq_ok (err -2)
xxgpu: Unknown symbol drm_atomic_helper_crtc_reset (err -2)
xxgpu: Unknown symbol drm_atomic_helper_update_plane (err -2)
xxgpu: Unknown symbol drm_atomic_helper_plane_duplicate_state (err -2)
xxgpu: Unknown symbol drm_mode_config_helper_suspend (err -2)
xxgpu: Unknown symbol drm_scdc_read (err -2)
xxgpu: Unknown symbol drm_atomic_helper_update_legacy_modeset_state (err -2)
xxgpu: Unknown symbol drm_atomic_helper_connector_destroy_state (err -2)
xxgpu: Unknown symbol drm_dp_clock_recovery_ok (err -2)
xxgpu: Unknown symbol drm_dp_get_adjust_request_pre_emphasis (err -2)
xxgpu: Unknown symbol drm_dp_get_adjust_request_voltage (err -2)
xxgpu: Unknown symbol drm_atomic_helper_crtc_duplicate_state (err -2)
xxgpu: Unknown symbol drm_atomic_helper_connector_duplicate_state (err -2)
xxgpu: Unknown symbol drm_atomic_helper_connector_reset (err -2)
xxgpu: Unknown symbol drm_scdc_set_scrambling (err -2)
xxgpu: Unknown symbol drm_atomic_helper_disable_plane (err -2)
xxgpu: Unknown symbol drm_dp_bw_code_to_link_rate (err -2)
xxgpu: Unknown symbol drm_dp_dpcd_read_link_status (err -2)
xxgpu: Unknown symbol drm_atomic_helper_crtc_destroy_state (err -2)
xxgpu: Unknown symbol drm_dsc_pps_payload_pack (err -2)
xxgpu: Unknown symbol drm_dp_link_train_clock_recovery_delay (err -2)
xxgpu: Unknown symbol drm_atomic_helper_page_flip (err -2)
xxgpu: Unknown symbol drm_atomic_helper_check_planes (err -2)
xxgpu: Unknown symbol drm_dp_aux_register (err -2)
xxgpu: Unknown symbol drm_atomic_helper_cleanup_planes (err -2)
xxgpu: Unknown symbol drm_helper_probe_single_connector_modes (err -2)
xxgpu: Unknown symbol drm_mode_config_helper_resume (err -2)
xxgpu: Unknown symbol drm_atomic_helper_shutdown (err -2)
xxgpu: Unknown symbol drm_gem_fb_create (err -2)
xxgpu: Unknown symbol drm_kms_helper_poll_init (err -2)
xxgpu: Unknown symbol drm_atomic_helper_check_modeset (err -2)
xxgpu: Unknown symbol drm_dp_psr_setup_time (err -2)
xxgpu: Unknown symbol drm_atomic_helper_commit_modeset_enables (err -2)
xxgpu: Unknown symbol drm_scdc_write (err -2)
xxgpu: Unknown symbol drm_helper_probe_detect (err -2)
xxgpu: Unknown symbol drm_dp_dpcd_write (err -2)
xxgpu: Unknown symbol drm_atomic_helper_fake_vblank (err -2)
xxgpu: Unknown symbol drm_dp_dpcd_read (err -2)
xxgpu: Unknown symbol drm_atomic_helper_commit_hw_done (err -2)
xxgpu: Unknown symbol drm_dp_aux_unregister (err -2)
xxgpu: Unknown symbol drm_atomic_helper_commit_modeset_disables (err -2)
xxgpu: Unknown symbol drm_atomic_helper_plane_destroy_state (err -2)
xxgpu: Unknown symbol drm_dsc_compute_rc_parameters (err -2)
xxgpu: Unknown symbol drm_fbdev_generic_setup (err -2)
xxgpu: Unknown symbol drm_atomic_helper_commit_planes (err -2)
xxgpu: Unknown symbol drm_atomic_helper_commit (err -2)
xxgpu: Unknown symbol drm_scdc_set_high_tmds_clock_ratio (err -2)
xxgpu: Unknown symbol drm_atomic_helper_set_config (err -2)
xxgpu: Unknown symbol drm_self_refresh_helper_alter_state (err -2)
xxgpu: Unknown symbol drm_gem_fb_get_obj (err -2)
xxgpu: Unknown symbol drm_kms_helper_poll_fini (err -2)
xxgpu: Unknown symbol drm_kms_helper_hotplug_event (err -2)
xxgpu: Unknown symbol drm_atomic_helper_plane_reset (err -2)
xxgpu: Unknown symbol drm_dp_link_train_channel_eq_delay (err -2)
缺少gpu_sched库(linux5.4)
/usr/lib/modules/$(uname -r)/kernel/drivers/gpu/drm/scheduler/gpu-sched.ko
xxgpu: Unknown symbol drm_sched_entity_push_job (err -2)
xxgpu: Unknown symbol drm_sched_init (err -2)
xxgpu: Unknown symbol drm_sched_job_init (err -2)
xxgpu: Unknown symbol drm_sched_entity_init (err -2)
xxgpu: Unknown symbol drm_sched_stop (err -2)
xxgpu: Unknown symbol drm_sched_job_cleanup (err -2)
xxgpu: Unknown symbol drm_sched_resubmit_jobs (err -2)
xxgpu: Unknown symbol drm_sched_start (err -2)
xxgpu: Unknown symbol drm_sched_entity_destroy (err -2)
xxgpu: Unknown symbol drm_sched_fini (err -2)
xxgpu: Unknown symbol drm_sched_increase_karma (err -2)
insmod 与 modprobe
modprobe命令相对于insmod来讲,会更加方便。
insmod:
insmod命令用于载入指定模块。
只载入当前指定的模块,不会载入相依的模块。
modprobe:
modprobe可载入指定的个别模块,或是载入一组相依的模块。
modprobe会根据depmod所产生的相依关系,决定要载入哪些模块。
若在载入过程中发生错误,在modprobe会卸载整组的模块。
即sudo modprobe xxx
来加载xxx.ko,并会自动加载xxx.ko所依赖的库。
insmod
使用insmod加载xxxgpu.ko,需要挨个手动加载。先加载被依赖库,再加载目标库,顺序不能乱,否则会出现“Unknown symbol”。
$ lsmod | grep drm
# drm
$ sudo insmod /lib/modules/5.4.0-42-generic/kernel/drivers/gpu/drm/drm.ko
$ lsmod | grep drm
drm 491520 0
# sysfillrect, syscopyarea, sysimgblt
$ sudo insmod /lib/modules/5.4.0-42-generic/kernel/drivers/video/fbdev/core/sysfillrect.ko
$ sudo insmod /lib/modules/5.4.0-42-generic/kernel/drivers/video/fbdev/core/syscopyarea.ko
$ sudo insmod /lib/modules/5.4.0-42-generic/kernel/drivers/video/fbdev/core/sysimgblt.ko
$ lsmod | grep -E drm\|fb\|sys
sysimgblt 16384 0
syscopyarea 16384 0
sysfillrect 16384 0
drm 491520 0
# fb_sys_fops
$ sudo insmod /lib/modules/5.4.0-42-generic/kernel/drivers/video/fbdev/core/fb_sys_fops.ko
$ lsmod | grep -E drm\|fb\|sys
fb_sys_fops 16384 0
sysimgblt 16384 0
syscopyarea 16384 0
sysfillrect 16384 0
drm 491520 0
# drm_kms_helper
$ sudo insmod /lib/modules/5.4.0-42-generic/kernel/drivers/gpu/drm/drm_kms_helper.ko
$ lsmod | grep -E drm\|fb\|sys
drm_kms_helper 184320 0
fb_sys_fops 16384 1 drm_kms_helper
sysimgblt 16384 1 drm_kms_helper
syscopyarea 16384 1 drm_kms_helper
sysfillrect 16384 1 drm_kms_helper
drm 491520 1 drm_kms_helper
# drm_display_helper, gpu-sched
$ sudo insmod /lib/modules/$(uname -r)/kernel/drivers/gpu/drm/display/drm_display_helper.ko # kernel6.6
$ sudo insmod /lib/modules/5.4.0-42-generic/kernel/drivers/gpu/drm/scheduler/gpu-sched.ko
# xxgpu.ko
$ sudo insmod $(path)/xxgpu.ko
modprobe
$ lsmod | grep drm # 此时没有drm相关的库被加载
$ sudo modprobe xxgpu
$ lsmod | grep -E drm\|fb\|sys\|gpu # 自动加载了依赖的库
Module Size Used by
xxgpu 3313664 0
gpu_sched 32768 1 xxgpu
drm_kms_helper 184320 3 xxgpu
drm 491520 4 gpu_sched,xxgpu,drm_kms_helper
fb_sys_fops 16384 1 drm_kms_helper
syscopyarea 16384 1 drm_kms_helper
sysfillrect 16384 1 drm_kms_helper
sysimgblt 16384 1 drm_kms_helper
$ sudo modprobe -r xxgpu # 自动卸载依赖相关的库
$ lsmod | grep -E drm\|fb\|sys\|gpu # 空空如也