千家信息网

Linux DRM内核模块怎么定义

发表于:2024-11-24 作者:千家信息网编辑
千家信息网最后更新 2024年11月24日,本篇内容主要讲解"Linux DRM内核模块怎么定义",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Linux DRM内核模块怎么定义"吧!一、模块定义列举
千家信息网最后更新 2024年11月24日Linux DRM内核模块怎么定义

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

一、模块定义

列举DRM驱动中的模块定义如下:

module_platform_driver(dw_hdmi_rockchip_pltfm_driver); ## dw_hdmi-rockchip.cmodule_platform_driver(vop_platform_driver);           ## rockchip_vop_reg.cmodule_platform_driver(rockchip_drm_platform_driver);  ## rockchip_drm_drv.c

module_platform_driver宏展开如下:

module_init(dw_hdmi_rockchip_pltfm_driver_init);module_init(vop_platform_driver_init);module_init(rockchip_drm_platform_driver_init);

其中module_init定义为device_initcall(fn),代码如下:

#define module_init(x)  __initcall(x);#define __initcall(fn) device_initcall(fn)#define device_initcall(fn)     __define_initcall(fn, 6)

继续展开,最终定义为:

#1.static initcall_t __initcall_dw_hdmi_rockchip_pltfm_driver_init6 __used \    __attribute__((__section__(".initcall" #id ".init"))) = dw_hdmi_rockchip_pltfm_driver_init; \#2.static initcall_t __initcall_vop_platform_driver_init6 __used \    __attribute__((__section__(".initcall" #id ".init"))) = vop_platform_driver_init; \#3.static initcall_t __initcall_rockchip_drm_platform_driver_init6 __used \    __attribute__((__section__(".initcall" #id ".init"))) = rockchip_drm_platform_driver_init; \

请留意上面定义的函数指针和函数名,下面会介绍其对应的地址和加载顺序。

二、链接位置

使用RockPI 4A Linux内核对应的交叉工具链中的objdump命令获取vmliux中所有段的头信息,命令如下:

/usr/local/gcc-linaro-7.3.1-2018.05-x86_64_aarch74-linux-gnu/bin/aarch74-linux-gnu-objdump -x vmlinux > 1.txt

1.txt文件中,可以查找到上面三个函数(位于.init.text段)和函数指针(位于.init.data段)的位置,细节如下:

ffffff8009149828 l     F .init.text 0000000000000020 dw_hdmi_rockchip_pltfm_driver_initffffff80091498e8 l     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内核模块怎么定义"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

内核 模块 顺序 位置 函数 文件 三个 地址 工具 编译 从小到大 从小 内容 命令 指针 链接 交叉 学习 实用 更深 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 以下哪个术语指的是数据库 电子信息工程技术和网络技术 试分析网络安全与网络发展的关系 英特尔服务器和普通cpu 计算机系统维护与软件开发岗位 山西惠普服务器虚拟化价格 迪庆服务器上门回收公司 wincc 向数据库些数据 软件开发系统架构有哪些 杭州应用软件开发教程 轻量云服务器 一键网络重装系统 江西运营软件开发价格 自学软件开发需要多长时间 新建数据库怎样保存 oa和服务器时间不一致 石柱租房网络安全 金山网络安全手抄报 mono数据库异步处理 联想服务器加硬盘不能识别 大专生可以考数据库吗 学校官网科学研究数据库 福建服务器机房现货 空管生产网 网络安全 长沙软件开发驻场正规平台 信用卡被报上信息数据库怎么办 威联通服务器如何用手机登录 银行开展网络安全周活动 庚顿数据库的安全配置 nebula图数据库官网 洋紫荆油墨数据库
0