本篇内容主要讲解“Linux数字版权管理内核模块怎么定义",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux数字版权管理内核模块怎么定义"吧!
一、模块定义
列举数字版权管理驱动中的模块定义如下:
module _ platform _ driver(dw _ HDMI _ rock chip _ pltfm _ driver);# # dw _ HDMI-摇滚芯片。cmodule _ platform _ driver(VOP _ platform _ driver);# rock chip _ VOP _ reg。cmodule _ platform _ driver(rock chip _ DRM _ platform _ driver);# #摇滚芯片_ DRM _ drv。cmodule _ platform _ driver宏展开如下:
module _ init(dw _ HDMI _ rock chip _ pltfm _ driver _ init);模块初始化(VOP平台驱动初始化);module _ init(rock chip _ DRM _ platform _ driver _ init);其中模块_初始化定义为device_initcall(fn),代码如下:
#定义module _ init(x)_ init调用(x);# define _ _ init call(fn)device _ init call(fn)# define device _ init call(fn)_ define _ init call(fn,6)继续展开,最终定义为:
# 1 .静态init call _ t _ _ init call _ dw _ HDMI _ rock chip _ pltfm _ driver _ init _ 6 _ _ used \u attribute _ _(_ _ section _ _).initcall'#id ' .init’)))=dw _ HDMI _ rock _ chip _ pltfm _ driver _ init;\ # 2 .静态初始化调用_ t _ _初始化调用_ VOP _平台_驱动程序_初始化_ 6 _ _使用了\ _ _属性_ _(_ _ section _ _).initcall'#id ' .init’)))=VOP _平台_驱动_ init\ # 3 .静态init call _ t _ init call _ rock chip _ DRM _ platform _ driver _ init _ 6 _ used \u attribute _ _(_ _ section _ _).initcall'#id ' .init’)))=rock chip _ DRM _ platform _ driver _ init;\请留意上面定义的函数指针和函数名,下面会介绍其对应的地址和加载顺序。
二、链接位置
使用4A Linux内核对应的交叉工具链中的二进制文件分析命令获取vmliux中所有段的头信息,命令如下:
/usr/local/gcc-linaro-7。3 .1-2018.05-x86 _ 64 _ AAR ch 74-Linux-GNU/bin/AAR ch 74-Linux-GNU-obj dump-xvmlinux 1。文本文件(textfile)在1.txt文件中,可以查找到上面三个函数(位于。初始化. text段)和函数指针(位于。init.data段)的位置,细节如下:
8009149828左前。初始化。文本000000000000000020 dw _ HDMI _ rock chip _ pltfm _ driver _ initffffff 80091498 E8 l
nbsp;F .init.text 0000000000000020 vop_platform_driver_initffffff8009149908 l F .init.text 0000000000000024 rockchip_drm_platform_driver_initffffff800920f498 l O .init.data 0000000000000008 __initcall_dw_hdmi_rockchip_pltfm_driver_init6ffffff800920f4c8 l O .init.data 0000000000000008 __initcall_vop_platform_driver_init6ffffff800920f4d0 l O .init.data 0000000000000008 __initcall_rockchip_drm_platform_driver_init6
上面是按地址从小到大的顺序排列,也可以在System.map
文件中查看链接顺序。
注:交叉编译工具链里除objdump
外,还有很多好用的工具,后续会专门介绍。
三、加载顺序
如果使用同一个宏定义内核模块,Linux内核将按.init.data
段中地址从小到大的顺序加载内核模块,即运行对应的.init.text
中对应的函数。因此,本文三个内核模块的加载顺序为:
1.dw_hdmi_rockchip_pltfm_driver_init2.vop_platform_driver_init3.rockchip_drm_platform_driver_init
同一等级的内核模块在.init.data
段中的位置与Makefile中文件的位置有关。
上面三个文件在drivers/gpu/drm/rockchip/Makefile
里的位置如下:
rockchipdrm-y := rockchip_drm_drv.o rockchip_drm_fb.o ## rockchip_drm_drv.c ...obj-$(CONFIG_ROCKCHIP_DW_HDMI) += dw_hdmi-rockchip.o ## dw_hdmi-rockchip.c...obj-$(CONFIG_DRM_ROCKCHIP) += rockchip_vop_reg.o rockchipdrm.o ## rockchip_vop_reg.c
内核编译时,rockchipdrm.o
会替换为rockchip_drm_drv.o rockchip_drm_fb.o
。因此这三个文件的编译顺序如下:
root@ubuntu:/home/run/code/rockchip-bsp# ./build/mk-kernel.sh rockpi4a Building kernel for rockpi4a board!4.4.154 CHK include/config/kernel.release CHK include/generated/uapi/linux/version.h CHK scripts/mod/devicetable-offsets.h CHK include/generated/utsrelease.h CHK include/generated/timeconst.h CHK include/generated/bounds.h CHK include/generated/asm-offsets.h CALL scripts/checksyscalls.shmake[1]: 'include/generated/vdso-offsets.h' is up to date. CHK include/generated/compile.h CHK kernel/config_data.h CC drivers/gpu/drm/rockchip/dw_hdmi-rockchip.o ## dw_hdmi-rockchip.c CC drivers/gpu/drm/rockchip/rockchip_vop_reg.o ## rockchip_vop_reg.c CC drivers/gpu/drm/rockchip/rockchip_drm_drv.o ## rockchip_drm_drv.c LD drivers/gpu/drm/rockchip/rockchipdrm.o LD drivers/gpu/drm/rockchip/built-in.o LD drivers/gpu/drm/built-in.o LD drivers/gpu/built-in.o LD drivers/built-in.o LINK vmlinu
到此,相信大家对“Linux DRM内核模块怎么定义”有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/113133.html