Linux DRM内核模块怎么定义

技术Linux DRM内核模块怎么定义本篇内容主要讲解“Linux DRM内核模块怎么定义”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux DRM内核模块怎么定义”吧

本篇内容主要讲解“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

(0)

相关推荐

  • 立方米和立方分米的换算,1立方分米等于多少立方分米

    技术立方米和立方分米的换算,1立方分米等于多少立方分米1立方厘米=0.001立方分米,立方厘米与立方分米之间的进率是1000,立方分米,容量计量单位,符号为dm3,1dm3的容量相当于一个长、宽、高都等于1分米的立方体的

    生活 2021年10月28日
  • 鸡你太美是什么意思,你看哔哩哔哩的原因是什么

    技术鸡你太美是什么意思,你看哔哩哔哩的原因是什么我前一年多迷上了中医,从最基础的《中医基础理论》学起,就想到了网上的视频,搜到中医老师潘毅的课,讲得那叫一个好鸡你太美是什么意思。完完整整学了一遍。就是在b站看的。b站上还

    生活 2021年11月1日
  • 如何解决Visual Studio 2005插件功能问题

    技术如何解决Visual Studio 2005插件功能问题这篇文章主要介绍了如何解决Visual Studio 2005插件功能问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让

    攻略 2021年12月3日
  • k8s service实现原理(k8s调度工作原理)

    技术k8s的原理分析是怎样的这篇文章给大家介绍k8s的原理分析是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。k8s是一个开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护

    攻略 2021年12月15日
  • Python如何实现我的世界游戏

    技术Python如何实现我的世界游戏这篇文章主要介绍Python如何实现我的世界游戏,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.准备开始之前,你要确保Python和pip已经成功安装在电脑上

    攻略 2021年11月9日
  • ETL架构中的子系统有哪些

    技术ETL架构中的子系统有哪些这篇文章主要讲解了“ETL架构中的子系统有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ETL架构中的子系统有哪些”吧!三个简单的字母,

    攻略 2021年11月9日