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

UEFI 事件

UEFI 不再支持中断(准确地说,UEFI 不再为开发者提供中断支持,但在UEFI内部还是使用了时钟中断),所有的异步操作都要通过事件(Event)来完成

启动服务为开发者提供了用于操作事件、定时器及TPL(任务优先级)的函数。这些函数可以分为三类:事件相关函数、定时器相关函数及 TPL相关函数。

在这里插入图片描述

事件函数

启动服务中事件相关函数有 6 个,函数名大部分以 Event 结尾。提供给事件生产者的函数有 CreateEvent/CreateEventExSignalEventCloseEvent。提供给事件使用者的有WaitForEventCheckEvent

等待事件的服务 WaitForEvent

WaitForEvent 用于等待事件的发生,类似于 Windows 提供的 WaitForMultipleObjects(...)
在这里插入图片描述
WaitForEvent 是阻塞操作,直到 Event 数组内任一事件被触发,或任一事件导致错误出现,WaitForEvent 才返回。WaitForEvent 从前到后依次检查 Event 数组内的事件,发现有被触发的事件或遇到错误则返回,如果所有事件都没有被触发,则从头开始重新检查。

当检查到某个事件处于触发态时*Index赋值为该事件在Event数组中的下标,返回前该事件将重置为非触发态。

当检查到某个事件是EVT_NOTIFY_SIGNAL类型时,*Index赋值为该事件在Event数组中的下标,并返回EFI_INVALID_PARAMETER
WaitForEvent必须运行在 TPL_APPLICAION 级别,否则将返回 EFI_UNSUPPORTED

WaitForEvent 没有超时属性,如果想让 WaitForEvent 只等待一定的时间,则需要在事件等待数组加入定时器事件。

生成事件的服务 CreateEvent

CreateEvent 用于生成一个事件。
在这里插入图片描述

1.事件的类型
事件的类型可以是以下一种或几种基本类型的组合:
在这里插入图片描述

  • EVT_TIMER:定时器事件。普通Timer事件,没有Notification函数。生成事件后需调用SetTimer服务设置时钟属性;
  • EVT_NOTIFY_WAIT:普通事件。这个事件有一个Notification函数,当这个事件通过CheckEvent()检查状态或通过 WaitForEvent()等待时,这个 Notification 函数会被放到待执行队列gEventQueue[Event->NotifyTpl]中;
  • EVT_NOTIFY_SIGNAL:普通事件。这个事件有一个Notification函数,当这个事件通过SignalEvent()被触发时,这个 Notifcation 函数会被放到待执行队列 gEventQueue[Event->NotifyTpl] 中等待执行;
  • 0x00000000:普通事件。此类事件没有Notification 函数。

还有两种特殊的事件,它们用在操作系统系统加载器从启动期向运行时期转换的过程中

  • EVT_SIGNAL_EXIT_BOOT_SERVICES:此类事件是一种特殊的 EVT_NOTIFY_SIGNAL,实际上它是 EVT_NOTIFY_SIGNAL0x00000001的组合。当ExitBootServices()执行时,事件被触发。EVT_SIGNAL_EXIT_BOOT_SERVICES不能和其他类型混合使用。它的 Notification 函数和子函数不能使用启动服务中的内存分配服务;在 Notification 函数执行前所有的定时器服务都已失效,因而在Notificaiton 函数中也不能使用定时器服务。
  • EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE:它是EVT_RUNTIME_CONTEXTEVT_RUNTIMEEVT_NOTIFY_SIGNAL0x00000002的组合。它不能和这 4 种类型之外的类型组合使用。当 SetVirtualAddressMap()被调用时触发此类事件。

2.优先级
CreateEvent 的第二个参数为NotifyTPL(即任务优先级),它可以是 0 ~ 31 的一个整数。
UEFI 预定义了以下 4 个优先级:
在这里插入图片描述

  • TPL_APPLICATION:预定义的 4 个级别中最低的一个优先级。应用程序运行(包括 Boot Manager 和 OS Loader)在这个级别。当程序运行在这个级别时,任务队列中没有任何处于就绪状态的事件 Notification 函数;
  • TPL_CALLBACK:比较耗时的操作通常在这个优先级执行,如文件系统、磁盘操作等;
  • TPL_NOTIFY:运行在这个级别的程序不允许阻塞必须尽快执行完毕并且返回。如果需要更多操作,则需要使用Event由内核重新调度。通常,底层的 IO 操作允许在这个级别。大部分EventNotification函数允许在这个级别;
  • TPL_HIGH_LEVEL:优先级最高级别。在此级别,中断被禁止。UEFI 内核全局变量的修改需要允许在这个级别。

3.Notification 函数 NotifyFunction
CreateEvent的第三个参数NotifyFunctionEFI_EVENT_NOTIFY类型的函数指针。
在这里插入图片描述
如果事件的类型是 EVT_NOTIFY_WAIT,则 EFI_EVENT_NOTIFY 函数会在等待此事件的过程中调用;如果事件的类型是EVT_NOTIFY_SIGNAL,则 EFI_EVENT_NOTIFY 函数会在事件触发时调用。既没有 EVT_NOTIFY_WAIT 属性也没有EVT_NOTIFY_SIGNAL属性的事件,Notification 参数将被忽略。

CreateEvent 的第4个参数是NotifyContext,将在Notification 函数被调用时作为第 2 个参数传递给该函数,用于指向这个Notification 函数的上下文。

CreateEventEx 服务

CreateEventEx 服务用于生成事件并将事件加入事件组。
在这里插入图片描述
CreateEventEx 生成的事件会加入到EventGroup中。当EventGroup中的任一事件被触发后,组中的所有其他事件都会被触发,进而同组内所有的Notification函数都将被加入到待执行队列。同组内 NotifyTpl(优先级)高的Notification函数会先被执行。

如果输入参数EventGroupNULL,则CreateEventEx退化为 CreateEvent

Type 不能是 EVT_SIGNAL_EXIT_BOOT_SERVICESEVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE,因为这两种类型有各自对应的Group

UEFI 预定义的 4 个 Event 组:
在这里插入图片描述

事件相关的其他函数

1.检查事件状态的服务CheckEvent()
CheckEvent 用于检测事件的状态。与WaitForEvent不同的是,CheckEvent调用后立刻返回。
在这里插入图片描述

2.触发事件的服务 SignalEvent
SignalEvent 用于将事件的状态设置为触发态。如果事件类型为EVT_NOTIFY_SIGNAL,则将其 Notification函数添加到就绪队列准备执行。如果该事件属于一个组,则将该组内所有事件都设置为触发态,并将组内所有EVT_NOTIFY_SIGNAL事件的Notification函数添加到就绪队列准备执行。
在这里插入图片描述

3.关闭事件的服务CloseEvent
事件使用完毕后,必须调用CloseEvent关闭这个事件:
在这里插入图片描述

通常的原则是由事件的所有者(即调用CreateEvent产生该事件的调用者)调用CloseEvent函数。调用该函数后,指定的事件将从内核中删除。

定时器函数

定时器是一类特殊的事件,生成定时器事件后,可以通过SetTimer服务设置定时器属性。

SetTimer 服务的函数原型:
在这里插入图片描述
Type 是定时器类别:
在这里插入图片描述

任务优先级

UEFI标准虽然不支持多线程,但是UEFI中有任务的概念:一个程序是一个任务,事件的Notification函数也是一个任务。UEFI没有给开发者提供中断接口,但 UEFI 内核的运行需要时钟中断的支持,时钟中断处理函数也是一个任务。
例如,时钟中断任务的重要性要大于定时器的Notification函数,而定时器的 Notification函数的重要性大于普通应用程序。UEFI为任务定义了任务级别,以便有限的计算机资源可以相对合理地分配给众多的任务。

提升和恢复任务优先级

RaiseTPL(NewTpl)用于提升当前任务的任务优先级至NewTpl,该函数的返回值为原来的任务优先级。RestoreTPL用于恢复(通常是降低)任务优先级至原来的优先级。

在这里插入图片描述
RaiseTPLRestoreTPL 必须成对出现,执行了RaiseTPL后,必须尽快调用 RaiseTPL 将任务优先级恢复到原来的值。

当任务优先级提升至TPL_HIGH_LEVEL时,将关闭中断。当任务优先级从TPL_HIGH_LEVEL恢复到原来的(比TPL_HIGH_LEVEL低的)值时,中断被重新打开。

在任务优先级恢复到原优先级之前,所有高于原优先级的触发态事件的Notification函数都要执行完毕。

UEFI是单CPU单线程系统产生数据竞争的唯一可能来自中断处理函数,因而可以利用这一特性实现锁,这正是 UEFI 锁的实现机制。

UEFI 中的时钟中断

UEFI 用事件机制取代了 BIOS 中的中断机制,虽然 UEFI 不再提供中断接口,但其实现却离不开中断尤其是时钟中断。时钟中断是事件机制的基础。

1.时钟处理函数 CoreTimerTick
在时钟中断中调用,是时钟中断处理函数的主体。该函数执行期间必须关中断并且不能被其他任何任务干扰,因而进入函数时需要加锁,离开函数时需要解锁。它的主要功能是维持系统时间,检查定时器事件列表中是否有到期的事件
在这里插入图片描述

2.设置时钟处理函数及安装时钟中断
在这里插入图片描述
在这里插入图片描述

mArchProtocols 数组是 UEFI 系统 DXE 阶段的全局变量,存放了体系结构相关的 Protocol,系统初始化时会为 mArchProtocols 中的每个元素生成一个事件,当这个元素对应的 Protocol 安装时,该事件会触发,在事件的回调函数中会对该Protocol做相应的初始化。

Protocol 在内核中的组织:
在这里插入图片描述
所有的 Protocol均放在 mProtocolDatabase指向的PROTOCOL_ENTRY链表中。PROTOCOL_ENTRY 包含三个链表。
AllEntriesPROTOCOL_ENTRY 链。
Protocols 指向此Protocol的所有实例。
Notify指向 PROTOCOL_NOTIFY链表,当 PROTOCOL_ENTRY.ProtocolD 对应的 Protocol 安装时,Notify 链表中所有Event都会触发。

例如,mArchProtocols[3]{&gEfiTimerArchProtocolGuid, (VOID**)&gTimer, NULL, NULL, FALSE},是EFI_TIMER_ARCH_PROTOCOL 对应的 EFI_CORE_PROTOCOL_NOTIFY_ENTRY 项;
CoreNotifyOnProtocolInstallation 执行后,mArchProtocols[3]{&gEfiTimerArchProtocolGuid, ( VOlD** )&gTimer, timerEvent, Registration, FALSE} ,TimerEventNotification 函数被 CoreRegisterProtocolNotify 函数注册到系统。
在这里插入图片描述
在这里插入图片描述
CoreRegisterProtocolNotify(…)函数的主要功能是在 mProtocolDatabase 数据库中注册PROTOCOL_NOTIFY。当Protocol安装时,会检查该Protocol对应的PROTOCOL_ENTRY.Notify。如果PROTOCOL_ENTRY.Notify存在,则触发它指向的事件。
在这里插入图片描述

EFI_TIMER_ARCH_PROTOCOL安装时,mArchProtocols[3].Event事件会触发,然后这个事件的响应函数 GenericProtocolNotify会执行,在 GenericProtocoINotify中通过 EFI_TIMER_ARCH_PROTOCOLRegisterHandler 时钟中断处理函数。

向 gimer 注册 CoreTimerTick 函数
gTimerEFI_TIMER_ARCH_PROTOCOL*类型的全局变量。
在这里插入图片描述
gTimer->RegisterHandler 这个函数指针指向了函数 TimerDriverRegisterHandler
在这里插入图片描述

mTimerNotifyFunction这个函数指针将在时钟中断处理函数TimerInterruptHandler中被调用。
在这里插入图片描述

向 CPU 注册中断处理函数 TimerInterruptHandler
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
TimerDriverlnitialize 中,最终通过 EFI_CPU_ARCH_PROTOCOLRegisterInterruptHandler注册了 TimerInterruptHandler。另外,在中断处理函数中将会调用 TimerInterruptHandler,而TimerlnterruptHandler 又会调用 mTimerNotifyFunction, 即 CoreTimerTick
在这里插入图片描述
mCpu->RegisterInterruptHandler 将会调用CpuRegisterInterruptHandler 函数:
在这里插入图片描述
此函数注册并启用由 InterruptHandler 为处理器中断或由InterruptType指定的异常类型指定的处理程序。如果InterruptHandlerNULL,则取消安装由InterruptType指定的处理器中断或异常类型的处理程序。安装的处理程序对于每个处理器中断或异常调用一次。

在 CPU 时钟中断向量中调用时钟中断处理函数

默认的中断向量主要功能是调用CommonInterruptEntry。该函数主要完成以下任务:
1)保存寄存器;
2)调用ExternalVectorTable[InterruptType]
3)恢复寄存器,从中断处理返回。
在时钟中断向量中,ExternalVectorTable[InterruptType]指向函数 TimerInterruptHandler

时钟中断的执行过程:
在这里插入图片描述
注册时钟中断函数和注册时钟处理函数的过程:
在这里插入图片描述

UEFI 事件 Notification 函数的派发

Event的一个重要作用是实现异步操作,事件 Notification函数的派发是在gBS->RestoreTpl服务中完成的。gBS->RestoreTpl实际指向CoreRestoreTpl函数:
在这里插入图片描述

内容来源于 《UEFI 原理与编程》。。。

相关文章:

UEFI 事件

UEFI 不再支持中断(准确地说,UEFI 不再为开发者提供中断支持,但在UEFI内部还是使用了时钟中断),所有的异步操作都要通过事件(Event)来完成。 启动服务为开发者提供了用于操作事件、定时器及TPL…...

大师开讲-图形学领域顶级专家王锐开讲Vulkan、VSG开源引擎

王锐,毕业于清华大学,图形学领域顶级专家,开源技术社区的贡献者与推广者。三维引擎OpenSceneGraph的核心基石开发者与维护者,倾斜摄影数据格式osgb的发明人。著有《OpenSceneGraph 3 Cookbook》,《OpenSceneGraph 3 Beginers Guid…...

小F的矩阵值调整

问题描述 小F得到了一个矩阵。如果矩阵中某一个格子的值是偶数,则该值变为它的三倍;如果是奇数,则保持不变。小F想知道调整后的矩阵是什么样子的。 测试样例 样例1: 输入:a [[1, 2, 3], [4, 5, 6]] 输出&#xff1a…...

ORB-SLAM2 ----- LocalMapping::SearchInNeighbors()

文章目录 一、函数意义二、函数讲解三、函数代码四、本函数使用的匹配方法ORBmatcher::Fuse()1. 函数讲解2. 函数代码 四、总结 一、函数意义 本函数是用于地图点融合的函数,前面的函数生成了新的地图点,但这些地图点可能在前面的关键帧中已经生成过了&a…...

给UE5优化一丢丢编辑器性能

背后的原理 先看FActorIterator的定义 /*** Actor iterator* Note that when Playing In Editor, this will find actors only in CurrentWorld*/ class FActorIterator : public TActorIteratorBase<FActorIterator> {//..... }找到基类TActorIteratorBase /*** Temp…...

【Docker】常用命令汇总

Docker 是1个开源的应用容器引擎&#xff0c;基于Go 语言并遵从 Apache2.0 协议开源。 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。 容器是完全使用沙箱机制&#xff0c;相…...

Mybatis:CRUD数据操作之多条件查询及动态SQL

Mybatis基础环境准备请看&#xff1a;Mybatis基础环境准备 本篇讲解Mybati数据CRUD数据操作之多条件查询 1&#xff0c;编写接口方法 在 com.itheima.mapper 包写创建名为 BrandMapper 的接口。在 BrandMapper 接口中定义多条件查询的方法。 而该功能有三个参数&#xff0c;…...

【笔记】轻型民用无人驾驶航空器安全操控

《轻型民用无人驾驶航空器安全操控》 理论考试培训材料 法规部分 【民用无人驾驶航空器的分类】 1、如何定义微型、轻型无人驾驶航空器&#xff1f; 微型无人驾驶航空器&#xff0c;是指空机重量小于0.25千克&#xff0c;最大平飞速度不超过40千米/小时&#xff0c;无线电发…...

TouchGFX设计模式代码实例说明

一)Model - View - Presenter (MVP) 模式在 TouchGFX 中的应用 1)Model&#xff08;模型&#xff09;&#xff1a; 模型代表应用程序的数据和业务逻辑。例如&#xff0c;在一个简单的计数器应用中&#xff0c;模型可以是一个包含计数器当前值的类。 class CounterModel { pri…...

flink学习(7)——window

概述 窗口的长度(大小): 决定了要计算最近多长时间的数据 窗口的间隔: 决定了每隔多久计算一次 举例&#xff1a;每隔10min,计算最近24h的热搜词&#xff0c;24小时是长度&#xff0c;每隔10分钟是间隔。 窗口的分类 1、根据window前是否调用keyBy分为键控窗口和非键控窗口…...

restTemplate get请求

报错解释&#xff1a; 这个报错信息表明在使用RestTemplate进行GET请求时&#xff0c;需要提供一个请求类型&#xff08;reqType&#xff09;&#xff0c;但是传入的值为空。这通常意味着在构建请求或者调用方法时&#xff0c;没有正确设置请求的Content-Type头部&#xff0c;…...

ffmpeg 预设的值 加速

centos 安装ffmpeg 编译安装 官网获取最新的linux ffmpeg 代码 https://ffmpeg.org//releases/ mkdir -p /data/app/ffmpeg cd /data/app/ffmpeg wget http://www.ffmpeg.org/releases/ffmpeg-7.1.tar.gz tar -zxvf ffmpeg-7.1.tar.gz#安装所需的编译环境 yum install -y \…...

maven <scope>compile</scope>作用

在 Maven 项目中&#xff0c; 元素用于定义依赖项的作用范围。 元素可以有多个值&#xff0c;每个值表示不同的作用范围。其中&#xff0c;scope compile scope 是默认的作用范围&#xff0c;表示该依赖项在编译、测试和运行时都需要。 scope compile scope 的含义 1、编译时…...

Ubuntu Server 22.04.5 从零到一:详尽安装部署指南

文章目录 Ubuntu Server 22.04.5 从零到一&#xff1a;详尽安装部署指南一、部署环境二、安装系统2.1 安装2.1.1 选择安装方式2.1.2 选择语言2.1.3 选择不更新2.1.4 选择键盘标准2.1.5 选择安装版本2.1.6 设置网卡2.1.7 配置代理2.1.8 设置镜像源2.1.9 选择装系统的硬盘2.1.10 …...

反射机制了解

反射概念 了解反射背景 存在某些变量或形参的声明类型是Object类型&#xff0c;但是程序却需要调用该对象运行时类型的方法&#xff0c;该方法不是Object中的方法&#xff0c;如何解决。转到如何获取该对象运行时类型的方法。 只能运行时才能获取&#xff0c;这就用到反射。 …...

机器学习策略Ⅰ

机器学习策略Ⅰ 在构建一个好的监督学习系统时&#xff0c;通常需要确保以下四个方面&#xff1a; 系统需要在训练集上能够很好地拟合数据&#xff0c;达到某种可接受的性能水平&#xff08;如接近人类水平&#xff09;。如果训练集表现不好&#xff0c;可以使用更大的模型&…...

redis中的bigkey及读取优化

一、bigKey介绍 1、简介 在 Redis 中,Big Key(大键)指的是占用大量内存的单个键。通常,Redis 是一个高性能的内存数据库,但是当某些键变得非常大时,会带来性能上的影响。例如,大量的内存消耗、长时间的操作延迟,甚至可能导致 Redis 停止响应或崩溃。 通俗的来说,指…...

【西瓜书】支持向量机(SVM)

支持向量机&#xff08;Support Vector Machine&#xff0c;简称SVM&#xff09;。 超平面 分类学习最基本的想法就是基于训练集合D在样本空间中找到一个划分超平面&#xff0c;将不同类别的样本分开。 但能将训练样本分开的划分超平面可能有很多&#xff0c;应该努力去找到哪…...

三维渲染中顺序无关的半透明混合(OIT)(二——Stencil Route)

1、A-Buffer算法。 在谈到Stencil Route之前&#xff0c;需要先讨论A-Buffer算法。A-Buffer是一种图形学&#xff08;渲染方向&#xff09;上的用于可见面分析(Visble Surface Detection)的技术&#xff0c;是Z-Buffer的衍生方法。 Z-Buffer是用于剔除 不透明 物体的算法。假…...

(SAST检测规则-3)固定的 SessionID 缺陷详解

漏洞类型&#xff1a; 会话固定攻击&#xff08;Session Fixation Attack&#xff09; 漏洞描述&#xff1a; 会话固定攻击是利用服务器的会话管理机制存在漏洞&#xff0c;攻击者通过提前控制或预测用户的会话标识符&#xff08;Session ID&#xff09;&#xff0c;当用户登录…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁

赛门铁克威胁猎手团队最新报告披露&#xff0c;数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据&#xff0c;严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能&#xff0c;但SEMR…...

STM32标准库-ADC数模转换器

文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”&#xff1a;输入模块&#xff08;GPIO、温度、V_REFINT&#xff09;1.4.2 信号 “调度站”&#xff1a;多路开关1.4.3 信号 “加工厂”&#xff1a;ADC 转换器&#xff08;规则组 注入…...

ArcPy扩展模块的使用(3)

管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如&#xff0c;可以更新、修复或替换图层数据源&#xff0c;修改图层的符号系统&#xff0c;甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...