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)

相关推荐

  • Go语言中go build命令怎么用

    技术Go语言中go build命令怎么用这篇文章主要介绍了Go语言中go build命令怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。go buil

    攻略 2021年11月21日
  • Hibernate有哪些优势

    技术Hibernate有哪些优势这篇文章主要为大家展示了“Hibernate有哪些优势”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Hibernate有哪些优势”这篇文章吧。

    攻略 2021年12月8日
  • Oracle 11gR2中的STANDBY_MAX_DATA_DELAY

    技术Oracle 11gR2中的STANDBY_MAX_DATA_DELAYOracle 11gR2中的STANDBY_MAX_DATA_DELAY,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想

    攻略 2021年11月29日
  • 如何在NetBeans Java ME polish环境下开发BlackBerry应用

    技术如何在NetBeans Java ME polish环境下开发BlackBerry应用这期内容当中小编将会给大家带来有关如何在NetBeans Java ME polish环境下开发BlackBerry应用,文章内容

    攻略 2021年10月23日
  • jquery字符串怎么转数字

    技术jquery字符串怎么转数字这篇文章主要介绍“jquery字符串怎么转数字”,在日常操作中,相信很多人在jquery字符串怎么转数字问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”jqu

    攻略 2021年11月16日
  • bootstrap如何实现响应列表(bootstrap可以写动态效果吗)

    技术Bootstrap中如何实现加载效果这篇文章主要讲解了“Bootstrap中如何实现加载效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Bootstrap中如何实现

    攻略 2021年12月16日