18183游戏网 - 专注分享最好的电脑系统软件!免费安全下载 18183游戏网首页 | Win7激活工具 | 热门专题
18183游戏网> > 系统教程 > 系统安装教程 >

HarmonyOS工具链 HarmonyOS驱动加载过程分析

更新时间:2026-08-23 11:51:53 | 编辑:悦缘 | 信息来源:互联网

  HDF(Hardware Driver Foundation)驱动框架,为驱动开发者提供驱动框架能力,包括驱动加载、驱动服务管理和驱动消息机制。旨在构建统一的驱动架构平台,为驱动开发者提供更精准、更高效的开发环境,力求做到一次开发,多系统部署。

  一、HarmonyOS驱动概述

  HarmonyOS驱动框架采用C语言面向对象编程模型构建,通过平台解耦、内核解耦,来达到兼容不同内核,统一平台底座的目的,从而帮助开发者实现驱动的“一次开发,多系统部署”。

  为了达成这个目标, HarmonyOS驱动框架提供了:

  1、操作系统适配层(OSAL,operating system abstraction layer):提供内核操作相关接口进行统一封装,屏蔽不同系统操作接口。

  2、平台驱动接口:提供Board部分驱动(例如:I2C/SPI/UART总线等平台资源)支持,同时对Board硬件操作接口进行统一的适配抽象,开发者只需开发新硬件抽象接口,即可获得新增Board部分驱动支持。

  3、驱动模型:面向器件驱动,提供常见的驱动抽象模型,主要达成两个目的:

  ● 提供标准化的器件驱动,开发者无需独立开发,通过配置即可完成驱动的部署。

  ● 提供驱动模型抽象,屏蔽驱动与不同系统组件间的交互,使得驱动更具备通用性。

  为了进一步简化HarmonyOS驱动开发,HarmonyOS驱动框架支持多种驱动加载方式:

  ● 支持驱动动态加载和静态加载,解除驱动代码和框架间的直接代码依赖,使得驱动程序可以独立编译和部署;

  ● 支持按需动态加载方式,避免设备驱动全量加载,可有效降低系统资源的占用。

  本文主要分析HarmonyOS驱动加载过程,在正式介绍之前,首先了解HarmonyOS驱动架构的组成、工作原理和机制,从而了解驱动加载的细节。

  官网相关介绍:https://device.harmonyos.com/cn/docs/develop/drive/oem_drive_hdfdev-0000001051715456

  二、HarmonyOS驱动架构介绍

  2.1 HarmonyOS驱动架构组成

  图1 HarmonyOS驱动架构

  HarmonyOS驱动架构主要由HDF驱动框架、驱动程序、驱动配置文件和驱动接口四个部分组成。

  1)HDF驱动框架提供统一的硬件资源管理,驱动加载管理以及设备节点管理等功能。

  驱动框架采用的是主从模式设计,由Device Manager和Device Host组成。

  Device Manager提供了统一的驱动管理,Device Manager启动时根据Device Information提供驱动设备信息加载相应的驱动Device Host,并控制Host完成驱动的加载。

  Device Host提供驱动运行的环境,同时预置Host Framework与Device Manager进行协同,完成驱动加载和调用。根据业务的需求Device Host可以有多个实例。

  说明:

  Device Host顾名思义就是驱动宿主,提供驱动运行的环境。

  当驱动部署在用户态时,Device Host可以由独立的进程进行承载。

  当驱动在部署在内核态时,Device Host仅表示逻辑隔离。

  Device Host的划分原则:Device Host属于一类设备聚合,如Camera,Audio,Display等。

  驱动程序是部署在一个Device Host还是部署在不同的Device Host,主要考虑驱动程序之间是否存的业务耦合性,如果两个驱动程序之间存在依赖,可以考虑将这部分驱动程序部署在统一Host。

  2)驱动程序实现驱动的具体功能,每个驱动由一个或者多个驱动程序组成,每个驱动程序都对应着一个Driver Entry。Driver Entry主要完成驱动的初始化和驱动接口绑定功能。

  3)驱动配置文件.hcs主要由设备信息(Device Information)和设备资源(Device Resource)组成。

  Device Information完成设备信息的配置,如配置接口发布策略,驱动加载的方式等。Device Resource 完成设备资源的配置,如GPIO管脚、寄存器等资源信息的配置。

  4)驱动接口HDI(Hardware Driver interface )提供标准化的接口定义和实现,驱动框架提供IO Service和IO Dispatcher机制,使得不同部署形态下驱动接口趋于形式一致。

  当驱动部署在RTOS(Real-Time Operating System)轻量化操作系统时,驱动接口和驱动程序之间采用的是Function Call方式调用,因此驱动接口仅提供定义,驱动接口实现由驱动程序提供。

  2.2 HDF驱动框架工作原理

  图2 HDF驱动框架工作原理

  Device Manager提供了统一的驱动加载管理机制和驱动接口发布机制。

  当Device Host环境加载完成时,Device Manager根据Device Information信息,请求Host加载相应的驱动程序,Device Host在收到请求时,进行以下操作:

  1)根据请求加载设备信息,查找并加载指定路径下驱动镜像或从指定段地址(section)查找驱动程序入口;

  2)查找驱动设备描述符,匹配对应的设备驱动;

  3)当驱动匹配成功时,加载指定驱动程序镜像;

  4)Host Framework在驱动镜像加载成功后,调用驱动程序(Driver Entry)的绑定接口和初始化接口,实现与驱动程序的服务对象绑定,同时初始化设备驱动程序;

  5)当Device Information配置中的服务策略要求对外暴露驱动接口时,驱动框架就将驱动程序的服务对象添加到对外发布的服务对象列表中,外部客户端程序就可以通过此列表来查询并访问相应的服务接口。

  2.3 驱动接口工作机制

  图3 驱动接口工作机制

  驱动接口主要存在以下几种实现:

  ● 当驱动以内核组件部署时,客户端程序访问驱动程序需要通过system call方式调用,驱动接口通过IO Service请求将消息通过system call方式调用到内核,并将消息分发到IO Dispatcher处理。

  ● 当驱动以用户态服务形式部署时,客户端进程访问驱动进程需要通过IPC方式通信,IO Service完成IPC通信的客户端消息请求封装,IO Dispacher完成驱动服务端消息请求封装,客户端消息通过IPC通信到达服务端并分发给IO Dispacher处理。

  为了使客户端和服务端驱动调用方式基本一致,驱动框架提供IO Service和IO Dispatcher机制屏蔽了调用消息传递方式的差异。

  驱动接口实现统一采用远程调用方式,客户端驱动接口函数将请求序列化成内存数据,通过驱动框架提供的IO Service将消息发送到服务端处理,服务端在收到请求消息时通过IO Dispatcher机制将消息分发给消息处理函数处理,处理函数将反序列化内存数据解析成相应的请求。这样的做到好处是,开发者只需重点关注接口的定义,无需过多的关注如何实现不同平台上接口适配。

  三、驱动加载过程分析

  HarmonyOS驱动根据部署的不同方式,存在两种驱动加载方式:

  ● 动态加载方式:采用传统的so(共享库)加载方式,驱动程序通过指定Symbol找到驱动函数入口进行加载。

  ● 静态加载方式:采用将驱动程序通过Scatter编译方式,编译到指定的Section,再通过访问指定Section对应的地址,找到驱动函数入口进行加载。

  下面结合一个Sample示例代码,讲解驱动加载过程,重点分析静态加载方式下内核态驱动加载过程。

  3.1 实现驱动程序初始化接口

  在HDF驱动框架中,HdfDriverEntry对象被用来描述一个驱动实现。

  编写一个简单的驱动,首先需要实现驱动程序 (Driver Entry)入口中的三个主要接口:

  ■ Bind接口:

  实现驱动接口实例化绑定,如果需要发布驱动接口,会在驱动加载过程中被调用,实例化该接口的驱动服务并和DeviceObject绑定。

  ■ Init接口:

  实现驱动的初始化,返回错误将中止驱动加载流程。

  ■ Release接口:

  实现驱动的卸载,在该接口中释放驱动实例的软硬件资源。

  3.2 导出驱动程序入口符号

  实现驱动程序初始化后,需要将驱动程序入口通过驱动声明宏导出,这样驱动框架才能在启动时识别到驱动程序的存在,驱动才能被加载:

  下面是实现原理:

  图4 Driver Entry内存分布

  可以看到HDF_INIT宏是定义了一个“驱动模块名+HdfEntry”的符号放到“.hdf.driver” 所在section,该符号指向的内存地址即为驱动程序入口结构体的地址。这个特殊的section将用于开机启动时查找设备驱动。

  3.3 添加设备配置

  在设备对应的device_info.hcs添加sample驱动的配置:

  在配置中定义的device将在加载过程中产生一个设备实例,通过moduleName字段指定设备对应的驱动名称,从而将设备与驱动关联起来。其中,设备与驱动可以是一对多的关系,即可以实现一个驱动支持多个同类型设备。

  3.4 驱动启动过程

  我们添加的驱动是如何被执行的呢?简单来说,在系统启动时,驱动框架先启动,通过解析配置文件获取到设备列表,通过读取“.hdf.driver”段读取到驱动程序(Driver Entry)列表,然后遍历设备列表与驱动程序列表进行匹配,并加载匹配成功的驱动。

  驱动框架有两大核心管理者:

  ● DeviceManager:负责设备的管理,包括设备加载、卸载和查询等设备相关功能。

  ● DeviceServiceManager:负责管理设备发布的接口服务,提供接口服务的发布和查询等功能。

  驱动加载主要由DeviceManager主导,首先DeviceManager要解析配置文件中的Host列表,根据Host列表中的信息来实例化对应的Host对象。Host解析配置文件获取到关联的设备列表,遍历设备列表去获取与之匹配的驱动程序名称,然后基于驱动程序名称遍历前面提到的“.hdf.driver” section获得驱动程序地址。

  下面介绍具体过程。

  3.4.1 获取设备列表

  图5 设备列表结构

  配置文本编译后会变成二进制格式的配置文件,其中设备相关信息被存放在一个用“hdf_manager”标记的device_info配置块中,host的内容以块的形式在device_info块中依次排列,host块中记录了host名称、启动优先级和设备列表信息。设备信息中的moduleName字段将用于和驱动程序入口中的moduleName进行匹配,从而为设备匹配到正确的驱动程序。

  3.4.2 获取驱动程序列表

  图6 驱动程序(DriverEntry)内存布局

  HDF驱动框架通过驱动程序入口符号的地址集中存放到一个特殊的section来实现对驱动的索引,这个section的开头和末尾插入了_hdf_drivers_start、_hdf_drivers_end两个特殊符号,用于标记这个section的范围,两个特殊符号之间的数据即为驱动实现指针。

  3.4.3 驱动程序加载流程

  图7 HDF驱动加载流程

  Device Manager遍历设备列表,当查找到对应驱动实现时,为设备创建Device对象实例,如果设备配置中的policy字段为需要对外发布驱动接口(SERVICE_POLICY_CAPACITY),那么驱动的Bind接口将首先被调用,用于关联设备和服务实例。然后驱动的Init接口将被调用,用于完成驱动的相关初始化工作。如果驱动被卸载或者因为硬件等原因Init接口返回失败,Release将被调用,用于释放驱动申请的各类资源。

  四、总结

  本次和大家分享了HarmonyOS驱动的主要设计思想,重点分析了内核态驱动加载的过程,关于HarmonyOS驱动其他内容,后续会有更多技术文章向大家持续分享,敬请期待。


返回顶部


18183游戏网发布的系统镜像及软件均来至互联网,仅供学习和研究使用,不得用于任何商业用途并请在下载后24小时内删除,如果满意请联系版权方购买。
如果您发现本站侵害了您的版权,请立即联系我们,本站将第一时间进行相关处理。投诉邮箱1524578900@qq.com
版权声明|联系我们 Copyright © 18183游戏网 All Rights Reserved 鲁ICP备2021038877号-4

2.5446
基本信息
SQL
$_GET
$_POST
$_COOKIE
包含文件
自动加载
  1. 模型: /www/wwwroot/www.pjwan.com/lecms/model/
  2. 视图: /www/wwwroot/www.pjwan.com/view/ww7/xt_show.htm
  3. 控制器: /www/wwwroot/www.pjwan.com/lecms/control/show_control.class.php
  4. 日志目录: /www/wwwroot/www.pjwan.com/log/
  5. 当前页面: /www/wwwroot/www.pjwan.com/index.php
  6. 当前时间: 2026-08-23 11:51:50
  7. 当前网协: 216.73.216.20
  8. 请求路径: /anzhuang/25310.html
  9. 运行时间: 2.5446
  10. 内存开销: 1.36 MB
  1. #0 [time:0.0003s] SELECT * FROM le_runtime WHERE k='cfg' LIMIT 1
  2. #1 [time:0.0003s] SELECT * FROM le_runtime WHERE k='website_group_18183_pjwan_com' LIMIT 1
  3. #2 [time:0.0003s] SELECT * FROM le_runtime WHERE k='cate_68' LIMIT 1
  4. #3 [time:0.0006s] SELECT * FROM le_cms_article WHERE id=25310 LIMIT 1
  5. #4 [time:0.0003s] SELECT * FROM le_user WHERE uid=2 LIMIT 1
  6. #5 [time:0.0002s] SELECT * FROM le_cms_article_data WHERE id=25310 LIMIT 1
  7. #6 [time:0.0002s] SELECT * FROM le_cms_article_views WHERE id=25310 LIMIT 1
  8. #7 [time:0.0003s] UPDATE LOW_PRIORITY le_cms_article_views SET views=views+1 WHERE id=25310 LIMIT 1
  9. #8 [time:0.0002s] SELECT id FROM le_cms_article WHERE id<25310 ORDER BY id DESC LIMIT 0,1
  10. #9 [time:0.0002s] SELECT * FROM le_cms_article WHERE id=25309
  11. #10 [time:0.0002s] SELECT id FROM le_cms_article WHERE id>25310 ORDER BY id ASC LIMIT 0,1
  12. #11 [time:0.0002s] SELECT * FROM le_cms_article WHERE id=25311
  13. #12 [time:0.0003s] SELECT * FROM le_kv WHERE k='navigate' LIMIT 1
  14. #13 [time:0.0005s] SELECT tagid,id FROM le_cms_article_tag_data WHERE tagid=3468 ORDER BY id DESC LIMIT 0,11
  15. #14 [time:0.0005s] SELECT * FROM le_cms_article_tag_data WHERE tagid=3468 AND id=99248 OR tagid=3468 AND id=93248 OR tagid=3468 AND id=92840 OR tagid=3468 AND id=92654 OR tagid=3468 AND id=92585 OR tagid=3468 AND id=92384 OR tagid=3468 AND id=92107 OR tagid=3468 AND id=91346 OR tagid=3468 AND id=90947 OR tagid=3468 AND id=90430 OR tagid=3468 AND id=90273
  16. #15 [time:0.0006s] SELECT * FROM le_cms_article WHERE id=99248 OR id=93248 OR id=92840 OR id=92654 OR id=92585 OR id=92384 OR id=92107 OR id=91346 OR id=90947 OR id=90430
  17. #16 [time:0.0004s] SELECT cid FROM le_category ORDER BY orderby ASC ,cid ASC
  18. #17 [time:0.0015s] SELECT * FROM le_category WHERE cid=1 OR cid=2 OR cid=3 OR cid=4 OR cid=5 OR cid=6 OR cid=7 OR cid=8 OR cid=9 OR cid=10 OR cid=11 OR cid=12 OR cid=13 OR cid=14 OR cid=15 OR cid=16 OR cid=17 OR cid=18 OR cid=19 OR cid=20 OR cid=21 OR cid=22 OR cid=23 OR cid=24 OR cid=25 OR cid=26 OR cid=27 OR cid=28 OR cid=29 OR cid=30 OR cid=31 OR cid=32 OR cid=33 OR cid=34 OR cid=35 OR cid=36 OR cid=37 OR cid=38 OR cid=39 OR cid=40 OR cid=41 OR cid=42 OR cid=43 OR cid=44 OR cid=45 OR cid=46 OR cid=47 OR cid=48 OR cid=49 OR cid=50 OR cid=51 OR cid=52 OR cid=53 OR cid=54 OR cid=55 OR cid=56 OR cid=57 OR cid=58 OR cid=59 OR cid=60 OR cid=61 OR cid=62 OR cid=63 OR cid=64 OR cid=65 OR cid=66 OR cid=67 OR cid=68 OR cid=69 OR cid=70 OR cid=71 OR cid=72 OR cid=73 OR cid=74 OR cid=75 OR cid=76 OR cid=77 OR cid=78 OR cid=79 OR cid=80 OR cid=81 OR cid=82 OR cid=83 OR cid=84 OR cid=85 OR cid=86 OR cid=87 OR cid=88 OR cid=89 OR cid=90 OR cid=91 OR cid=92 OR cid=93 OR cid=94 OR cid=95 OR cid=96 OR cid=97 OR cid=98 OR cid=99 OR cid=100 OR cid=101 OR cid=102 OR cid=103 OR cid=104 OR cid=105 OR cid=106 OR cid=107 OR cid=108 OR cid=109 OR cid=110 OR cid=111 OR cid=112 OR cid=113 OR cid=114 OR cid=115 OR cid=116 OR cid=117 OR cid=118 OR cid=119 OR cid=120 OR cid=121 OR cid=122 OR cid=123 OR cid=124 OR cid=125 OR cid=126 OR cid=127 OR cid=128
  19. #18 [time:0.0003s] SELECT id FROM le_cms_article_views WHERE cid=68 ORDER BY views DESC LIMIT 0,10
  20. #19 [time:0.0003s] SELECT * FROM le_cms_article_views WHERE id=79663 OR id=5640 OR id=79660 OR id=77944 OR id=79665 OR id=77952 OR id=79023 OR id=79666 OR id=79650 OR id=79648
  21. #20 [time:0.0005s] SELECT * FROM le_cms_article WHERE id=79663 OR id=5640 OR id=79660 OR id=77944 OR id=79665 OR id=77952 OR id=79023 OR id=79666 OR id=79650 OR id=79648
  22. #21 [time:0.0003s] SELECT * FROM le_runtime WHERE k='cate_85' LIMIT 1
  23. #22 [time:0.0005s] SELECT id FROM le_cms_win WHERE (cid=86 OR cid=87 OR cid=88 OR cid=89 OR cid=90 OR cid=91 OR cid=92 OR cid=93 OR cid=94 OR cid=95 OR cid=96 OR cid=97 OR cid=98 OR cid=99 OR cid=100) ORDER BY id DESC LIMIT 0,10
  24. #23 [time:0.0005s] SELECT * FROM le_cms_win WHERE id=1027 OR id=1026 OR id=1025 OR id=1024 OR id=1023 OR id=1022 OR id=1021 OR id=1020 OR id=1019 OR id=1018
  25. #24 [time:0.0002s] SELECT * FROM le_runtime WHERE k='cate_64' LIMIT 1
  26. #25 [time:0.0004s] SELECT id FROM le_cms_article WHERE (cid=65 OR cid=66 OR cid=67 OR cid=68 OR cid=125 OR cid=126 OR cid=127 OR cid=128) ORDER BY id DESC LIMIT 0,10
  27. #26 [time:0.0005s] SELECT * FROM le_cms_article WHERE id=103563 OR id=103562 OR id=103561 OR id=103560 OR id=103559 OR id=103558 OR id=103557 OR id=103556 OR id=103555 OR id=103554
  1. #control => show
  2. #action => index
  3. #cid => 68
  4. #id => 25310
  5. #mid => 2
    1. #PHPSESSID => n6j1evnl2svk01pru2tcqjmtv6
    1. #0 /www/wwwroot/www.pjwan.com/index.php
    2. #1 /www/wwwroot/www.pjwan.com/lecms/xiunophp/xiunophp.php
    3. #2 /www/wwwroot/www.pjwan.com/lecms/config/config.inc.php
    4. #3 /www/wwwroot/www.pjwan.com/lecms/xiunophp/lib/base.func.php
    5. #4 /www/wwwroot/www.pjwan.com/lecms/xiunophp/lib/core.class.php
    6. #5 /www/wwwroot/www.pjwan.com/lecms/xiunophp/lib/debug.class.php
    7. #6 /www/wwwroot/www.pjwan.com/lecms/xiunophp/lib/log.class.php
    8. #7 /www/wwwroot/www.pjwan.com/lecms/xiunophp/lib/model.class.php
    9. #8 /www/wwwroot/www.pjwan.com/lecms/xiunophp/lib/view.class.php
    10. #9 /www/wwwroot/www.pjwan.com/lecms/xiunophp/lib/control.class.php
    11. #10 /www/wwwroot/www.pjwan.com/lecms/xiunophp/db/db.interface.php
    12. #11 /www/wwwroot/www.pjwan.com/lecms/xiunophp/db/db_pdo_mysql.class.php
    13. #12 /www/wwwroot/www.pjwan.com/lecms/xiunophp/cache/cache.interface.php
    14. #13 /www/wwwroot/www.pjwan.com/lecms/xiunophp/cache/cache_memcache.class.php
    15. #14 /www/wwwroot/www.pjwan.com/lecms/xiunophp/ext/network/Network__interface.php
    16. #15 /www/wwwroot/www.pjwan.com/lecms/config/plugin.inc.php
    17. #16 /www/wwwroot/www.pjwan.com/lecms/plugin/editor_sd/conf.php
    18. #17 /www/wwwroot/www.pjwan.com/lecms/plugin/editor_tinymce/conf.php
    19. #18 /www/wwwroot/www.pjwan.com/lecms/plugin/editor_um/conf.php
    20. #19 /www/wwwroot/www.pjwan.com/lecms/plugin/le_adminer/conf.php
    21. #20 /www/wwwroot/www.pjwan.com/lecms/plugin/le_baidu_zz/conf.php
    22. #21 /www/wwwroot/www.pjwan.com/lecms/plugin/le_category_filter/conf.php
    23. #22 /www/wwwroot/www.pjwan.com/lecms/plugin/le_content_tag_url/conf.php
    24. #23 /www/wwwroot/www.pjwan.com/lecms/plugin/le_data_table_split/conf.php
    25. #24 /www/wwwroot/www.pjwan.com/lecms/plugin/le_drafts/conf.php
    26. #25 /www/wwwroot/www.pjwan.com/lecms/plugin/le_feedback/conf.php
    27. #26 /www/wwwroot/www.pjwan.com/lecms/plugin/le_homepage_feign/conf.php
    28. #27 /www/wwwroot/www.pjwan.com/lecms/plugin/le_html_cache/conf.php
    29. #28 /www/wwwroot/www.pjwan.com/lecms/plugin/le_links/conf.php
    30. #29 /www/wwwroot/www.pjwan.com/lecms/plugin/le_minganci_do/conf.php
    31. #30 /www/wwwroot/www.pjwan.com/lecms/plugin/le_rand404content/conf.php
    32. #31 /www/wwwroot/www.pjwan.com/lecms/plugin/le_rand_author/conf.php
    33. #32 /www/wwwroot/www.pjwan.com/lecms/plugin/le_rand_pic_cid/conf.php
    34. #33 /www/wwwroot/www.pjwan.com/lecms/plugin/le_sharejs/conf.php
    35. #34 /www/wwwroot/www.pjwan.com/lecms/plugin/le_slide/conf.php
    36. #35 /www/wwwroot/www.pjwan.com/lecms/plugin/le_special_pro/conf.php
    37. #36 /www/wwwroot/www.pjwan.com/lecms/plugin/le_spider/conf.php
    38. #37 /www/wwwroot/www.pjwan.com/lecms/plugin/le_super_sitemap/conf.php
    39. #38 /www/wwwroot/www.pjwan.com/lecms/plugin/le_title_pic/conf.php
    40. #39 /www/wwwroot/www.pjwan.com/lecms/plugin/le_use_del_id/conf.php
    41. #40 /www/wwwroot/www.pjwan.com/lecms/plugin/le_webp_oss/conf.php
    42. #41 /www/wwwroot/www.pjwan.com/lecms/plugin/le_website_group/conf.php
    43. #42 /www/wwwroot/www.pjwan.com/lecms/plugin/le_zhanqunsitemaps_pro_v303/conf.php
    44. #43 /www/wwwroot/www.pjwan.com/lecms/plugin/lu_huochetou/conf.php
    45. #44 /www/wwwroot/www.pjwan.com/lecms/plugin/models_filed/conf.php
    46. #45 /www/wwwroot/www.pjwan.com/lecms/plugin/qrcode/conf.php
    47. #46 /www/wwwroot/www.pjwan.com/lecms/plugin/sy_mobile/conf.php
    48. #47 /www/wwwroot/www.pjwan.com/runcache/misc.func.php
    49. #48 /www/wwwroot/www.pjwan.com/runcache/core_lang/zh-cn.php
    50. #49 /www/wwwroot/www.pjwan.com/runcache/lang/zh-cn.php
    51. #50 /www/wwwroot/www.pjwan.com/runcache/lecms_control/parseurl_control.class.php
    52. #51 /www/wwwroot/www.pjwan.com/runcache/lecms_model/runtime_model.class.php
    53. #52 /www/wwwroot/www.pjwan.com/runcache/lecms_control/show_control.class.php
    54. #53 /www/wwwroot/www.pjwan.com/runcache/lecms_control/base_control.class.php
    55. #54 /www/wwwroot/www.pjwan.com/runcache/lecms_model/urls_model.class.php
    56. #55 /www/wwwroot/www.pjwan.com/runcache/lecms_model/category_model.class.php
    57. #56 /www/wwwroot/www.pjwan.com/runcache/lecms_model/cms_content_model.class.php
    58. #57 /www/wwwroot/www.pjwan.com/runcache/lecms_view/ww7,xt_show.htm.php
    59. #58 /www/wwwroot/www.pjwan.com/runcache/lecms_model/cms_content_data_model.class.php
    60. #59 /www/wwwroot/www.pjwan.com/runcache/lecms_model/cms_content_tag_model.class.php
    61. #60 /www/wwwroot/www.pjwan.com/runcache/lecms_model/user_model.class.php
    62. #61 /www/wwwroot/www.pjwan.com/runcache/lecms_model/cms_content_views_model.class.php
    63. #62 /www/wwwroot/www.pjwan.com/runcache/lecms_model/kv_model.class.php
    64. #63 /www/wwwroot/www.pjwan.com/runcache/lecms_model/cms_content_tag_data_model.class.php
    65. #64 /www/wwwroot/www.pjwan.com/lecms/xiunophp/tpl/sys_trace.php