当前位置: 首页 > wzjs >正文

中国建设协会网站首页电子印章的制作方法

中国建设协会网站首页,电子印章的制作方法,青岛网站建设维护,自己做网站用买域名吗在分析openharmony的hdf框架的设备驱动加载器(IDriverLoader)时发现在创建实例时会首先判断一下是否完成了驱动入口的构建(HdfDriverEntryConstruct),如果没有构建会重新构建,这与我开始以为的不一致(我一直以为是采用的linux内核方式,只是由…

在分析openharmony的hdf框架的设备驱动加载器(IDriverLoader)时发现在创建实例时会首先判断一下是否完成了驱动入口的构建(HdfDriverEntryConstruct),如果没有构建会重新构建,这与我开始以为的不一致(我一直以为是采用的linux内核方式,只是由hdf来将驱动注册进去),oh将这部分由hdf框架接管了。下面我便将这部分实现驱动程序的动态加载和管理的技术细节进行分析。

实现驱动程序的动态加载和管理主要过程如下:

  • 驱动注册通过 HDF_DRIVER_INIT 宏将驱动入口点注册.hdf.driver 段。
  • 驱动加载:由设备管理器解析配置文件并调用驱动的 BindInit 函数
  • 服务发布与订阅:通过 HdfDeviceNodePublishServiceHdfDeviceSubscribeService 实现。
  • 驱动卸载:通过 Release 函数释放驱动资源

在使用前首先看下驱动是如何应用的(有个大概的使用思路)

struct HdfDriverEntry g_i2cManagerEntry = {//驱动程序的入口信息.moduleVersion = 1,//驱动模块的版本号.Bind = I2cManagerBind,//用于将驱动与设备对象关联.Init = I2cManagerInit,//用于完成驱动的初始化操作.Release = I2cManagerRelease,//用于释放驱动占用的资源.moduleName = "HDF_PLATFORM_I2C_MANAGER", //必须与 device_info.hcs 文件中的设备名称一致
};
HDF_INIT(g_i2cManagerEntry);//用于将驱动程序的入口结构注册到 HDF 框架中

下面分别介绍动态加载和管理的四个主要过程。

驱动注册

在 OpenHarmony 中,驱动程序通过 HDF_INIT宏注册到 .hdf.driver 段中。这个宏将驱动程序的入口点信息存储到特定的内存段,供运行时加载

在hdf_core\interfaces\inner_api\host\shared\hdf_device_desc.h文件中我们可以看到实际HDF_INIT宏实际调用的为HDF_DRIVER_INIT。

#define HDF_INIT(module)  HDF_DRIVER_INIT(module)
  • HDF_DRIVER_INIT说明

结合hdf_core\framework\core\common\include\host\hdf_device_section.h代码的宏定义

//这用于确保驱动程序的入口点不会被编译器优化掉
#define USED_ATTR __attribute__((used))//用于将变量或函数放置到指定的内存段(section)中
//将驱动程序的入口点信息存储到 .hdf.driver 段中
//这个段在运行时会被 HDF 框架扫描,以获取驱动程序的入口点
#define HDF_SECTION __attribute__((section(".hdf.driver")))

可得注册一个驱动程序模块

#define HDF_DRIVER_INIT(module) \const size_t USED_ATTR module##HdfEntry HDF_SECTION = (size_t)(&(module))

定义一个全局变量(module##HdfEntry),其名称由驱动模块名(module)拼接而成。使用 USED_ATTR 确保该变量不会被优化掉。使用 HDF_SECTION 将该变量放置到 .hdf.driver 段中。将该变量的值设置为驱动模块的地址(&(module))。这样,驱动程序的入口点信息就会被存储到 .hdf.driver 段中,供运行时扫描和加载。

此时便有个疑问,我们只知道驱动程序的入口点信息就会被存储到 .hdf.driver 段中,那我们如何访问或使用它呢?

答案就在hdf_core\framework\core\common\include\host\hdf_device_section.h文件中的以下两个函数中

/*** 这个宏定义用于获取指定变量的地址。* 声明一个外部变量(extern type name)。* 返回该变量的地址(&(name))。* 这个宏主要用于定义 _hdf_drivers_start 和 _hdf_drivers_end,标记驱动程序入口点的范围。*/
#define HDF_DRIVER_SEC_NAME(type, name) \({extern type name;            \&(name);                       \})/**通过 HDF_DRIVER_SEC_NAME 宏,获取 _hdf_drivers_start 和 _hdf_drivers_end 的地址。
这些地址在运行时被 HDF 框架用来遍历 .hdf.driver 段中的驱动程序入口点。
HDF 框架可以通过 _hdf_drivers_start 和 _hdf_drivers_end 之间的范围,动态加载所有注册的驱动程序。
*/
#define HDF_DRIVER_BEGIN() HDF_DRIVER_SEC_NAME(size_t, _hdf_drivers_start)
#define HDF_DRIVER_END() HDF_DRIVER_SEC_NAME(size_t, _hdf_drivers_end)

经过对上述代码的理解我们知道如何来使用了,但是此时还有一个疑问没有解决,**那就是_hdf_drivers_start和_hdf_drivers_end变量在哪定义的呢?它在哪被赋值了呢?**通过对代码的搜索可以看到在链接器脚本(vmlinux.lds.S)中有相关定义。如下图所示:

在这里插入图片描述

这段代码的作用是:

  1. 定义一个名为 .init.hdf_table 的段
  2. 该段的起始位置设置 _hdf_drivers_start 符号
  3. 所有标记为 .hdf.driver 的数据(即驱动程序入口点)放入该段。
  4. 在该段的结束位置设置 _hdf_drivers_end 符号

这部分的内容有点绕为了更好的总结在这儿弄了个使用demo,可以供参考理解:

// 定义一个驱动程序模块
struct HdfDriverEntry MyDriver;// 注册驱动程序模块
HDF_DRIVER_INIT(MyDriver);// 在代码中使用 HDF_DRIVER_BEGIN 和 HDF_DRIVER_END 获取驱动程序范围
size_t *start = HDF_DRIVER_BEGIN();
size_t *end = HDF_DRIVER_END();// 遍历驱动程序入口点
for (size_t *ptr = start; ptr < end; ptr++) {struct HdfDriverEntry *driver = (struct HdfDriverEntry *)(*ptr);// 加载驱动程序
}

驱动加载

驱动加载过程由 HDF 框架的设备管理器(Device Manager)和设备主机(Device Host)协同完成,这部分详细的过程比较复杂(本周应该能写完这篇汇总的),此处只列出核心点

  • 设备管理器初始化

    static int __init DeviceManagerInit(void)
    {int ret = DeviceManagerStart();if (ret < 0) {HDF_LOGE("%s start failed %d", __func__, ret);} else {HDF_LOGD("%s start success", __func__);}return ret;
    }
    late_initcall(DeviceManagerInit);
    

    设备管理器在系统启动时通过 late_initcall 初始化,并开始加载驱动。

  • 驱动加载流程

    1. 设备管理器解析配置文件(device_info.hcs),获取设备和驱动的映射关系
    2. 根据配置文件中的 preload 字段,决定驱动是按需加载还是按序加载
    3. 遍历 .hdf.driver 段,获取驱动程序的入口地址
    4. 调用驱动的 BindInit 函数完成初始化

代码调用过程如下:
在这里插入图片描述

int HdfDeviceLaunchNode(struct HdfDeviceNode *devNode)
{const struct HdfDriverEntry *driverEntry = devNode->driver->entry;int ret = DeviceDriverBind(devNode);if (ret != HDF_SUCCESS) {return ret;}ret = driverEntry->Init(&devNode->deviceObject);if (ret != HDF_SUCCESS) {return HDF_DEV_ERR_DEV_INIT_FAIL;}ret = HdfDeviceNodePublishService(devNode);if (ret != HDF_SUCCESS) {return HDF_DEV_ERR_PUBLISH_FAIL;}return ret;
}

服务发布与订阅

HDF 框架支持服务发布和订阅机制,允许驱动程序在初始化后发布服务接口,供其他模块使用

  • 服务发布

    int HdfDeviceNodePublishService(struct HdfDeviceNode *devNode);
    
  • 服务订阅

其他模块可以通过 HdfDeviceSubscribeService 订阅驱动服务。当驱动加载完成后,框架会将服务接口发布给订阅者

int HdfDeviceSubscribeService(struct HdfDeviceObject *deviceObject, const char *serviceName, struct SubscriberCallback callback);

对此部分内容需要详细了解的可以参考

驱动卸载

和驱动加载相对应的卸载驱动的函数为HdfDeviceUnlaunchNode,当驱动被卸载或初始化失败时,HDF 框架会调用驱动的 Release 函数释放资源:

static void HdfDeviceUnlaunchNode(struct HdfDeviceNode *devNode)
{....if (devNode->driver != NULL) {driverEntry = devNode->driver->entry;//从设备节点中获取驱动程序对象(devNode->driver)}if (driverEntry != NULL && driverEntry->Release != NULL) {driverEntry->Release(&devNode->deviceObject);//如果驱动程序的入口结构和 Release 函数指针都有效,调用 Release 函数释放驱动占用的资源,即驱动中传入的release函数}....
}

文章转载自:

http://M71tLjTk.qrcLz.cn
http://qEpS2YJg.qrcLz.cn
http://c0f6OHkZ.qrcLz.cn
http://e31TXW4x.qrcLz.cn
http://fEVazKzi.qrcLz.cn
http://3G1MpAWF.qrcLz.cn
http://fEXaf9FT.qrcLz.cn
http://S69bHSQe.qrcLz.cn
http://ZsVT3l64.qrcLz.cn
http://TmlusZqM.qrcLz.cn
http://bFrIrFmr.qrcLz.cn
http://AkyYUFCA.qrcLz.cn
http://OB4FiGLN.qrcLz.cn
http://jQP4J4xW.qrcLz.cn
http://qWVI9O44.qrcLz.cn
http://Fmbmbe4T.qrcLz.cn
http://Eb6lv44U.qrcLz.cn
http://oNc7KN1M.qrcLz.cn
http://5BW3daIL.qrcLz.cn
http://hZMuLrN1.qrcLz.cn
http://Yume9HJO.qrcLz.cn
http://NE4w0LjN.qrcLz.cn
http://97tOtU1a.qrcLz.cn
http://fDf5jWdM.qrcLz.cn
http://GAD9BAW3.qrcLz.cn
http://leOO3Ppn.qrcLz.cn
http://BBxbH4yf.qrcLz.cn
http://nC2SKsu0.qrcLz.cn
http://0ozd2Tgq.qrcLz.cn
http://yjqleUqT.qrcLz.cn
http://www.dtcms.com/wzjs/779113.html

相关文章:

  • 网站备案照片 多少钱不用写代码可以做网站的软件
  • 外贸网站租用外国服务器好还是自己装一个服务器好快速推广
  • 文字直播网站怎么做的网站建设客户需要提供什么科目
  • 泉州那几个公司网站建设比较好wordpress 文章消失
  • 福建中江建设公司网站如何优化网站图片大小
  • 小微企业做网站网站发展趋势和前景
  • 个人免费网站创建入口整站网站优化推荐
  • 网站的栏目是什么网站建设的培训心得
  • 互动型网站手机端网站开发
  • 关于网站开发市问卷调查app开发需要多少费用介绍
  • 深圳市住房和建设局网站->认租申请原神网页设计作业
  • 软件技术 网站建设教程网页制作流程步骤
  • 公司网站排名牙医工具网站建设课程设计报告
  • 平面图网站百度抓取网站
  • 济南最好的网站开发千万别学交互设计
  • 做软装有什么网站找图片小学生抄写新闻20字
  • 网站制作培训机构百度广告代运营
  • 网站建设的技术方案wordpress前台登录主题
  • 网站站内搜索代码建设网站有什么作用是什么
  • 先备案还是先做网站世界局势最新消息军事
  • html5 社团网站模板 代码下载制作一个网站多少钱啊
  • 做微信公众平台的网站吗南京经济经济技术开发总公司
  • 酒店网站设计模板网站产品展示方案
  • 学习php网站建设嘉峪关seo
  • 企业 网站 制作2021建站
  • php和网站开发sem网络推广是什么
  • 衡水公司做网站茶叶网站源码 下载
  • 网站建设费用请示做门户网站建设多少钱
  • 广西建设部网站一个人能开发app吗
  • 17做网站郑州免费制作海报