Fuchsia命名空间

2023-12-19 10:32
文章标签 空间 命名 fuchsia

本文主要是介绍Fuchsia命名空间,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Fuchsia命名空间

命名空间是Fuchsia操作系统中文件存取和服务发现的基石。

定义

命名空间是一个综合的层级结构,包括文件、目录、套接口、服务、设备和其它的有名对象,这些对象被其环境提供给组件使用。

让我们稍微解释一下。

有名对象: 命名空间中包含的可由名字枚举和访问的对象,诸如列出一个目录的内容和打开一个文件。

综合层级结构: 命名空间为一个由对象组成的树状结构,这些对象可由其它命名空间的对象子树组合而来,从而形成一个综合的层级结构,按照惯例,其中的每个部分都被赋予一个路径前缀。

组件之命名空间: 每个组件裁剪自身的命名空间以符合自身的需求。它也可发布自身的对象到其它的命名空间中。

环境构造: 实例化组件的环境需要负责构造合适的命名空间,以便组件运行在合适的范围。

虽然本文档专注于介绍典型的绑定组件的命名空间用法,但是命名空间也可被独立的创建和使用。

命名空间实战

你可能已经花费了许多时间在Fuchsia命名空间的探索上,它们无处不在。如果你在命令行提示符下键入ls /,将会看到需要对象列表,表明这些对象在shell命令行的命名空间中时可访问的。

不同于其它操作系统,Fuchsia没有"根文件系统"。正如之前所述,命名空间基于组件而定义,并不是全局有效的,也非基于进程的。

这包含了一些有趣的隐含点:

  • 没有全局的"root"命名空间.
  • 没有类似Linux中的概念"运行在chroot-ed的环境中",因为每个组件 实质上由其私有的"root".
  • 组件接受的命名空间据其特定需求进行了裁剪.
  • 在命名空间边界之外,对象的路径可能没有意义.
  • 在某一时刻,进程可拥有访问多个截然不同的命名空间的权限.
  • 以组件为基础,控制访问文件的权限机制,也可用来控制对服务的访问,以及对其它有名对象的访问.

对象

命名空间中的成员称为对象。它们以多种形式存在,包括:

  • 文件: 包含二进制数据的对象
  • 目录: 包含其它对象的对象
  • 套接口: 打开后可建立连接的对象, 类似命名管道
  • 服务: 打开后提供FIDL服务的对象
  • 设备: 提供访问硬件资源的对象

对象的访问

为了访问命名空间中的对象,你必须已经拥有另外一个对象。典型的,在命名空间转移过程中,组件会在其命名空间的范围内接收到对象的通道句柄.

通过执行合适的FIDL接口,你也可凭空创建出一个新的对象。

给定一个对象的通道,你可以打开其子对象的通道,方法是给其发送一条FIDL消息,消息内容包含表示希望打开的子对象的相对路径表达式.

注意,你仅可访问对于已在访问对象可达的对象。没有依据环境的授权。

现在我们看一下对象的名称和路径时如何构建的.

对象名称

对象名称时一个本地唯一的标签,据此对象可安置于一个容器内(例如目录)。注意,名称是容器的子对象表的一个属性,而不是对象本身的属性。

例如,cat 指派一个对象,位于由调用Open()请求的一些不明确接收者中。

从根本上讲,对象没有名字,但是又可以有多个称呼。

对象名称由二进制8位组字符组成(字节顺序任意),受限于以下约束:

  • 最小长度1个字节.
  • 最大长度255个字节.
  • 不包含 NULs (零值字节).
  • 不包含 /.
  • 不等于 . or ...
  • 总是可比较的字节等式 (意味着区分字母大小写).

对于容器的Open()方法,对象名称是有效的参数。详见 FIDL Interfaces.

对象的命名倾向于使用可编码和可解释为人可读的UTF-8图形字符序列,但是命名空间自身并未强加这一要求。

实际上,客户有责任决定如何对用户程序呈现包含无效的、不可显示的、或者晦涩的字符序列名称。

对象的相对路径表达式

对象的相对路径表达式可以是一个对象名称,或者以/分隔的对象名称,其指定了一系列的嵌套的对象,为了定位容器中的对象需要穿越这些对象(例如目录)。

例如,house/box/cat 指定的对象位于它的容器对象box中,而box位于其容器对象house内,house位于未指明的Open()请求的接收者中。

对象的相对路径表达式总是向命名空间的深层穿越。特别的,命名空间不直接支持脱离容器的向上穿越(如通过..),但是客户可以部分的模仿此功能。

对象的相对路径表达式受以下的额外约束:

  • 最小长度1个字节.
  • 最大长度4095字节.
  • 不能以 / 开头或结尾.
  • 每个片段都是有效的对象名称.
  • 总是可比较的字节等式 (意味着区分字母大小写).

对象的相对路径表达式是容器Open()方法有效参数。详见 FIDL Interfaces.

解释路径表达式的客户

客户解释路径表达式是一种对对象路径表达式的泛化,这些表达式含有可选的特性,客户模拟这些特性以便增强与期望存在具有根的类似文件接口程序的兼容。

技术上讲,这些特性超出了Fuchsia命名空间协议自身的范围,但是又经常使用到,所以在此描述.

  • 客户可指定其命名空间之一作为根"root". 此命名空间表示为 /.
  • 客户可通过增加单一的前缀/,来构建相对于指定根命名空间的路径.
  • 客户可使用..路径片段折叠路径,通过客户端"标准"进程来构建自容器向上穿越的路径(假设容器的路径已知).
  • 这些特性可组合在一起.

例如,/places/house/box/../sofa/cat 指定了一些客户"根"容器内位于 places/house/sofa/cat位置的对象。

包含这些可选特性的客户解释路径表达式不是有效的容器Open() 方法的参数;它们必须先由客户翻译后才能与命名空间交互。 See FIDL Interfaces.

例如,fdio在文件操作API中实现了客户一端对..路径的解释,这些API诸如open(), stat(), unlink()等.

命名空间转移

当一个组件在环境中被实例化(如,它的进程启动),它接收到一个映射了一个或多个命名空间路径前缀到对象句柄的表.

依据惯例,表中路径前缀的编码与其关联对象的有暗指意义。 例如,pkg前缀应当关联与包含组件自身二进制文件和资产的目录。

更多相关内容在下节介绍。

命名空间协定

本节描述运行在Fuchsia系统中的典型组件的命名空间常规布局.

组件命名空间的准确内容和组织依据组件的角色、类型、身份、范畴、与其它组件的关系、以及权限会有很大的不同。详见 [sandboxing.md] 中命名空间如何为组件创建沙盒sndboxes的内容.

关于你的组件期待接收自环境的命名空间的更多内容,请参考你所实现的组件类型的关联文档.

典型对象

组件命名空间可能包含的一些典型对象:

  • 组件包中的只读可执行文件和资产.
  • 私有的本地持久存储.
  • 私有的临时存储.
  • 系统、组件框架、或者启动组件的客户提供于组件的服务.
  • 设备节点 (对于驱动和特权组件).
  • 配置信息.

典型目录结构

  • pkg/: 当前程序包的内容
    • bin/: 包内的可执行二进制文件
    • lib/: 包内的共享库
    • data/: 包内的数据,如资产
  • data/: 本地持久存储 (可读写read-write, 包私有)
  • tmp/: 临时存储 (可读写, 包私有)
  • svc/: 提供给组件的服务
    • fuchsia.process.Launcher: 加载进程
    • fuchsia.logger.Log: 日志信息
    • vendor.topic.Interface: 厂商 定义服务
  • dev/: 设备树 (按照需要对特权组件可见的部分)
    • class/, …
  • hub/: 内省系统, 参见 [hub.md] (仅特权组件)
  • config/: 组件的配置数据

命名空间参与者

这里结束一些与Fuchsia命名空间协议交互或者提供支持的抽象层的信息。

文件系统

文件系统使得文件在命名空间中可用.

简单来说文件系统是一个组件,其可将其它命名空间中的对象以类似文件的形式发布。

服务

服务生存与命名空间中.

服务是众所周知的对象,提供可由命名空间发现的FIDL接口实现。

服务的名称相当与命名空间中svc分支下的路径,由此组件可访问服务的实现。

例如,Fuchsia系统默认的日志服务的名称为fuchsia.logger.Log,它在命名空间中的位置为svc/fuchsia.logger.Log.

组件

组件消耗并且扩展命名空间。

组件时一个可执行的程序对象,在一定环境下被实例化并且给与命名空间。

组件以两种方式参与Fuchsia的命名空间:

  1. 可使用接收自环境发来的命名空间中的对象,特别的,可访问自身的包内容和收到的服务。

  2. 可以命名空间的形式通过其环境发布对象,随后其环境可在收到请求时,使部分对象对其它组件可用。这是组件实现服务的方式。

环境

环境构建命名空间.

环境作为组件的容器。每个环境有责任_构建_其组件将接收的命名空间。

环境决定组件可能访问哪些对象,以及组件按照名称请求的服务如何绑定到具体的实现。

配置

组件可能有不同类型的配置数据,取决于其 Component Manifest 中列出的特性,以文件的形式在/config命名空间中显示。这些有组件的特性集所定义。

FIDL 接口

END

这篇关于Fuchsia命名空间的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/511858

相关文章

linux如何复制文件夹并重命名

《linux如何复制文件夹并重命名》在Linux系统中,复制文件夹并重命名可以通过使用“cp”和“mv”命令来实现,使用“cp-r”命令可以递归复制整个文件夹及其子文件夹和文件,而使用“mv”命令可以... 目录linux复制文件夹并重命名我们需要使用“cp”命令来复制文件夹我们还可以结合使用“mv”命令总

Python脚本实现图片文件批量命名

《Python脚本实现图片文件批量命名》这篇文章主要为大家详细介绍了一个用python第三方库pillow写的批量处理图片命名的脚本,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言源码批量处理图片尺寸脚本源码GUI界面源码打包成.exe可执行文件前言本文介绍一个用python第三方库pi

Linux环境变量&&进程地址空间详解

《Linux环境变量&&进程地址空间详解》本文介绍了Linux环境变量、命令行参数、进程地址空间以及Linux内核进程调度队列的相关知识,环境变量是系统运行环境的参数,命令行参数用于传递给程序的参数,... 目录一、初步认识环境变量1.1常见的环境变量1.2环境变量的基本概念二、命令行参数2.1通过命令编程

变量与命名

引言         在前两个课时中,我们已经了解了 Python 程序的基本结构,学习了如何正确地使用缩进来组织代码,并且知道了注释的重要性。现在我们将进一步深入到 Python 编程的核心——变量与命名。变量是我们存储数据的主要方式,而合理的命名则有助于提高代码的可读性和可维护性。 变量的概念与使用         在 Python 中,变量是一种用来存储数据值的标识符。创建变量很简单,

【高等代数笔记】线性空间(一到四)

3. 线性空间 令 K n : = { ( a 1 , a 2 , . . . , a n ) ∣ a i ∈ K , i = 1 , 2 , . . . , n } \textbf{K}^{n}:=\{(a_{1},a_{2},...,a_{n})|a_{i}\in\textbf{K},i=1,2,...,n\} Kn:={(a1​,a2​,...,an​)∣ai​∈K,i=1,2,...,n

win7系统中C盘空间缩水的有效处理方法

一、深度剖析和完美解决   1、 休眠文件 hiberfil.sys :   该文件在C盘根目录为隐藏的系统文件,隐藏的这个hiberfil.sys文件大小正好和自己的物理内存是一致的,当你让电脑进入休眠状态时,Windows 7在关闭系统前将所有的内存内容写入Hiberfil.sys文件。   而后,当你重新打开电脑,操作系统使用Hiberfil.sys把所有信息放回内存,电脑

求空间直线与平面的交点

若直线不与平面平行,将存在交点。如下图所示,已知直线L过点m(m1,m2,m3),且方向向量为VL(v1,v2,v3),平面P过点n(n1,n2,n3),且法线方向向量为VP(vp1,vp2,vp3),求得直线与平面的交点O的坐标(x,y,z): 将直线方程写成参数方程形式,即有: x = m1+ v1 * t y = m2+ v2 * t

[Linux]:环境变量与进程地址空间

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. 环境变量 1.1 概念 **环境变量(environment variables)**一般是指在操作系统中用来指定操作系统运行环境的一些参数,具有全局属性,可以被子继承继承下去。 如:我们在编写C/C++代码的时,在链接的时候,我们并不知

【编程底层原理】方法区、永久代和元空间之间的关系

Java虚拟机(JVM)中的内存布局经历了几个版本的变更,其中方法区、永久代和元空间是这些变更中的关键概念。以下是它们之间的关系: 一、方法区: 1、方法区是JVM规范中定义的一个概念,它用于存储类信息、常量、静态变量、即时编译器编译后的代码等数据。 3、它是JVM运行时数据区的一部分,与堆内存一样,是所有线程共享的内存区域。 二、永久代(PermGen): 1、在Java SE 7之前,

BERN2(生物医学领域)命名实体识别与命名规范化工具

BERN2: an advanced neural biomedical named entity recognition and normalization tool 《Bioinformatics》2022 1 摘要 NER和NEN:在生物医学自然语言处理中,NER和NEN是关键任务,它们使得从生物医学文献中自动提取实体(如疾病和药物)成为可能。 BERN2:BERN2是一个工具,