diff --git a/README.md b/README.md index 2af2bd9d..8b10ddf1 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,6 @@ ## PR 提交要求 1. 多个翻译请**分文件提交 PR**,即新建分支(branch),在每个分支中只更改一个文件并提交; - 1. PR 提交时请在**标题区域包含文件名**,以便进行记录; + 1. PR 提交时请在**标题区域包含文件的绝对路径**,以便进行查找、核对和记录; 1. PR 的标题和内容最好使用中文; - 1. 为避免做重复性工作,请在翻译时**先试译若干节**,并将 PR **[以草稿形式提交](https://docs.github.com/cn/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests#draft-pull-requests)**([创建草稿 PR](https://docs.github.com/cn/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request-from-a-fork) 或[提交 PR 后进入并在右侧选择转换为草稿](https://docs.github.com/cn/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/changing-the-stage-of-a-pull-request#converting-a-pull-request-to-a-draft)),以便校对人员提前开始校对,及时修正当前翻译中存在的可能会在下文中重复出现的格式或内容问题。 - + 1. 为避免做重复性工作,最好在翻译时**先试译若干节**,并将 PR **[以草稿形式提交](https://docs.github.com/cn/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests#draft-pull-requests)**([创建草稿 PR](https://docs.github.com/cn/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request-from-a-fork) 或[提交 PR 后进入并在右侧选择转换为草稿](https://docs.github.com/cn/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/changing-the-stage-of-a-pull-request#converting-a-pull-request-to-a-draft)),以便校对人员提前开始校对,及时修正当前翻译中存在的可能会在下文中重复出现的格式或内容问题。 diff --git a/contribute/docs/documentation-standards.md b/contribute/docs/documentation-standards.md new file mode 100644 index 00000000..fa9319c3 --- /dev/null +++ b/contribute/docs/documentation-standards.md @@ -0,0 +1,269 @@ + +# 文档标准概述 + + +本文档概述了 Fuchsia 文档的标准、结构、语言风格和最佳做法。 + + +## 文档定位 + + + * **为开发 Fuchsia 具体特性的专门文档:** + 针对开发者创建或维护 Fuchsia 代码库特定部分的文档,应当和源代码保存在同一目录下。这类文档通常以 `README.md` 文件的形式嵌入在 Fuchsia 代码库中。 + + * **面向 Fuchsia 开发者的总体文档:** Fuchsia 文档应当创建在 /HEAD/docs/ 中. + 在 `/docs/` 目录下,您应当在以下子目录之一内创建文档: + + * get-started: + + 有关下载、设置、开始 Fuchsia 开发的具体指南应当放进 `/get-started`。这类内容应当包含观点明确的、简短的教程,以帮助新用户入门 Fuchsia,并在 Fuchsia.dev 中链接至附加文档。 + * development: + + `/development/` 目录(在网站上显示为“指南”(Guides))中包含了针对Fuchsia开发者的说明和教程。该目录包含关于如何构建、运行和测试 Fuchsia 的文档。 + * concepts: + + `/concepts` 目录包含针对 Fuchsia 具体特性及其工作原理的深入解释,包括操作系统概述、框架、架构和软件包(package)。 + * reference: + + `/reference/` 目录包含自动生成的关于 Fuchsia 工具和 API 的参考文档,包括 FIDL 和内核的参考文档。 + * contribute: + + `/contribute/` 目录包含代码和文档的贡献进度以及最佳做法,包含文档准则和风格指南、代码策略以及管理体系。 + * `images` + + `/images/` 目录包含在文档中使用的图像。您应当将图像放在这一公共目录中。 + + +## 文档类型 + + +大多数文档可以分为以下几类: + + +- [程序性的](documentation-types.md#procedural-documentation) + - 入门 - 初始设置的文档 + - 指南 - 任务导向的文档 + + +- [概念性的](documentation-types.md#conceptual-documentation) - 多侧重于教授 Fuchsia、Fuchsia 架构和 Fuchsia 组件的基础性文档 + + +- [参考文档](documentation-types.md#reference-documentation) - 侧重于详细说明 Fuchsia API 和 工具的语法和参数的文档。这类文档通常自动生成。 + + +要获取更多信息,请参阅[文档类型](documentation-types.md)。 + + +## 文档和代码风格指南 + + +为确保由大量贡献者创建的文档都保持一致性,遵循文档风格指南很重要。要获取具体文档指导,请参阅[文档风格指南](documentation-style-guide.md);要获取代码样例指导,请参阅[代码样例风格指南](code-sample-style-guide.md)。 + + + +## 搜索的最佳做法 + +文档只有在用户能查到的时候才算有用。下面是一些关于可查性和搜索的最佳做法: + + - 将您的文档添加至目录:在 fuchsia.dev 的左侧导航中添加文档链接。要获取更多信息,请参阅[网站导航和目录文件](documentation-navigation-toc.md) + +- 交叉链接文档:添加指向文档主题的链接,以帮助读者更好地理解文档的内容。 例如,[Fuchsia 模拟器] (/development/build/emulator.md) 的概念文档链接到有关 Fuchsia 模拟器的相关指南和入门文档。 + +- 使用一致的术语:如果您在撰写有关 Fuchsia 中特定概念的文章,请确认您使用的是一致的术语。 使用[术语表](/glossary/README.md)来验证用语。 + + +## 文档的文件格式和文件名 + + +Fuchsia 的所有文档均使用 Markdown(`.md`)撰写,Fuchsia.dev 使用 [Hoedown Markdown Parser](https://github.com/hoedown/hoedown) 作为 Markdown 文档语法分析器。 + + +该网站的导航是由 `_toc.yaml` 文件配置的,该文件包含在每个文档目录中。请使用[网站导航和目录文件](documentation-navigation-toc.md)中的指导来更新这些文件。 + + +文件和目录名应当为小写,并使用短横线(hyphen)而非下划线(underscore)来分隔单词。在文件或目录名中请仅使用标准 ASCII 字母数字字符。如果文件名包含带有下划线的命令,那么您可以包含下划线。 + + +## 语言风格总体指导 + + +- **使用通俗易懂的美国英语撰写。** 使用清晰、直白的美国英语撰写,以使内容易于理解。请使用简单的词汇,保持简洁,并使用(常见)缩写,如 _it's_ 或 _don't_。 + +- **心怀敬意。** 请遵循[尊重性规范](/contribute/respectful_code.md)中规定的方针。 + +- **使用第二人称(“you”)撰写。** Fuchsia文档是写给用户(“you”)的。例如,“您(you)可以通过以下步骤安装 Fuchsia……”。不要使用第三人称称呼读者(“Fuchsia 用户可以通过……安装 Fuchsia”)或使用“we”(“我们(we)可以通过……安装 Fuchsia”)。 + +- **使用现在时态撰写。** 请在记录系统时始终立足眼下(it is),而非未来(it will be)。类似“will”之类的词语非常含糊。例如“您将看到”这种说法将引起如“我何时将会看到?”之类的问题。1分钟,还是20分钟呢?另外,若非必要,请不要提及未来的产品特性。提及可能取消的未来计划将导致维护上的困难。 + +- **保持语句简短具体。** 使用标点符号可以便于您的读者跟进说明、理解概念。而且,短句更易于翻译。 + +- **了解您的受众群体。** 在撰写文档之前,请确定好您的受众群体。了解受众群体使您能够明确他们应当熟悉的概念。当撰写面向更高级受众群体的文档时,请在文档前声明,让用户了解这一前提后,再进行阅读。 + +- **使用主动语态。** 请尽量使用主动语态写作,因为被动语态会使句子模棱两可且难以理解。 下面是一个例子: + - 主动语态:“操作系统运行一个进程。”(The operating system runs a process.)在这种情况下,主语执行动词表示的动作。 + - 被动语态:“一个进程正在被运行。”(A process is being run.)主语不再是“主动的”(_active_),而是被动词作用——它是“被动的”(_passive_)。 + 大多数情况下,如果您使用了“by”,那么您的句子可能仍然是被动语态。 + + +- **若使用首字母缩写词,请您在第一次书写时进行定义。** 例如,looks good to me(LGTM,我觉得看起来很好)。不要认为每个人都理解所有的首字母缩写词。您不需要定义工业标准首字母缩写词,如 TCP/IP。 + + +- **定义技术术语,回避行话。** Fuchsia 文档应当易于各个层次的开发者理解。请避免使用不常用或高度技术性词语而使得文章过于复杂。如果您使用了 Fuchsia 特定的术语,请在[术语表](/glossary/README.md)中对其进行定义。请回避自造词。 + + +- **回避口头表达或地区习语。** 请记住,许多 Fuchsia 用户并非英语母语者。请避免使用难于翻译的习语,例如“that's the way the cookie crumbles.”(生米已成熟饭/覆水难收)虽然对您而言能够理解,但是很难准确地翻译到其他语言中。 + + +- **避免引用专有信息。** 这里指的是任何可能是已注册商标的任何潜在词语或您公司的任何内部信息(API 密钥、机器名等)。 + + +- **使用性别中立代词。** 请不要使用 _he_,_him_,_his_,_she_ 或 _her_,也不要使用 _he/she_ 或 _(s)he_ 等其他类似的符号表达方式。取而代之,请使用单数的 _they_。 + + +- **使用一致的术语。** 确保术语在代码、用户界面和文档中是一致的。尽可能使用常见术语,并使用[术语表](/glossary/README.md)来验证用语。 diff --git a/contribute/docs/documentation-style-guide.md b/contribute/docs/documentation-style-guide.md index 4c182bb5..5b750e55 100644 --- a/contribute/docs/documentation-style-guide.md +++ b/contribute/docs/documentation-style-guide.md @@ -1,13 +1,23 @@ + +# 文档风格指南 + +本文档给出了针对 Fuchsia.dev 写作风格的指南。这些方针基于[Google 开发者风格指南][google-dev-doc-style-guide]中的通用指导。 + +注意:本指南重点介绍了为 Fuchsia 编写文档的一些最佳做法。其中的某些主题在以下文档的资源中可能会得到更为广泛的探讨: + +* 要获取关于通用文档标准的信息,包括文件类型、位置和整体语言风格,请参阅 [Fuchsia 文档标准][doc-standard]。 +* 要获取关于措辞、风格和结构的具体指导,请参阅 [Fuchsia 文档风格指南][style-guide]。 +* 要获取完整的 Markdown 参考指南,请参阅 [Markdown 参考指南][markdown-guide]。 + +## 文字和链接 + +### 遵循 80 字符限制 + +在 Fuchsia 项目中,代码的行最大长度为 100 字符,而文档的行最大长度为 80 字符。该规则一个值得注意的例外情况是网址(即链接),写在一行中,不换行。 + +代码常使用缩进(页面左侧的空格),而英文散文(文档)多形成文字段落。这种差异导致了不同的宽度规格。 + +### 标记外部链接 + +请使用 `{:.external}` 标记任何不属于 `fuchsia.dev`、 +`fuchsia.googlesource.com` 或 `fuchsia-review.googlesource.com` 的链接: + +```none +这是一个[外部](http://example.com){:.external}链接。 ``` + +注意外部链接标志:这是一个[外部][external-link-example]{:.external}链接。 + +### 使用参考风格的链接 + +一般来说,Fuchsia 建议在 Markdown 文件中使用参考风格(reference-style)的链接。 参考风格链接使用与链接相关联的参考标识符,接下来每当您在文档中使用该链接时,即可引用该标识符。这使得文档中的链接易于更新。 + +推荐:请在您需要链接的位置创建标识符。 + + +本例中,链接标识符称为 `fuchsia-home`: + +```none +欢迎来到 [Fuchsia 首页][fuchsia-home]。 ``` + + +接着在文档底部对其定义: +
[fuchsia-home]: https://fuchsia.dev/
+ + +不推荐:编写如下的行内链接: + +```none +欢迎来到 [Fuchsia 首页](www.fuchsia.dev)。 +``` + +您可以在外部的 [Markdown 指南][markdown-reference-links]中阅读更多与参考风格链接有关的信息。 + +### 对不同的 Fuchsia 内容使用正确链接 + +在 Fuchsia 文档中您可以为三类内容添加链接: + +* `/docs/` - 链接至位于 Fuchsia 源树中 `/docs/` 目录内的文档。这些链接必须关联到具有 `.md` 扩展名的文件。例如,`/concepts/README.md`。 +* 源代码 - 链接至位于 Fuchsia 源树中的源代码文件。这些链接可以关联到任何文件扩展名,但这些文件必须存在于源树中。例如,`/src/sys/sysmgr/main.cc`。 +* 参考文档 - 链接至自动生成的 Fuchsia 参考文档。 + * 大多数 Fuchsia 参考文档不存在于源树内,但在 [fuchsia.dev][fuchsia-dev] 上发布了。这些链接必须使用完全限定的网址。例如,`https://fuchsia.dev/reference/fidl/fuchsia.io`。 + * 不过,一些 Fuchsia 参考文档存在于源树内。这些文档位于 `/reference/`,并在 `https://fuchsia.dev/fuchsia-src/reference/` 中发布。这些链接必须关联到具有 `.md` 扩展名的文件。例如,`/reference/syscalls/bti_create.md`。 + + +### 测试您的链接后再提交更改 + +一旦创建了有效的 markdown 文件,您应当运行 `doc-checker` 以确保您的文件使用了有效的链接。当您试图提交包含 `.md` 文件的更改时,Gerrit 会运行 `doc-checker`,并会在您的提交中含有损坏链接时进行阻止。 + +要在本地运行 `doc-checker`,请使用 `fx format-code` 工具: ```posix-terminal fx format-code ``` + +## 标题 + +### 为页面和章节标题使用句首字母大写格式 + +推荐:使用句首字母大写格式(sentence case): ```none # This title is an example of sentence case ``` + +不推荐:使用标题词首大写格式(title case): ```none # This Title is an Example of Title Case ``` + +### 为锚点使用连接号,不要使用下划线 + +默认情况下,`fuchsia.dev` 创建锚点时会在在空格处使用下划线(`_`)。不过,当引用一个页面中的章节时,请使用连接号(`-`,dash),使用 `{#section-title}` 创建自定义锚点。同样地,请在文件名中使用连接号。 + +推荐:为锚点使用连接号 + +```none + ## 这是一个章节标题 {#this-is-a-section-header} +``` + +## 代码样例 + +### 为 shell 命令样例使用 posix-terminal 格式化 + +推荐:为 shell 命令在 ``` 后添加 `posix-terminal` 能让读者更容易复制代码块中的内容。 +
 ```posix-terminal
@@ -149,66 +283,127 @@ fx ota
 ```
 
+ +该代码块在渲染时,命令前会出现 `$`: ```posix-terminal fx ota ``` + +不推荐:请勿在命令里硬编码 `$` 字符。 ```sh $ fx ota ``` + +### 使用 none 以禁用复制功能 + +推荐:对于不需要读者复制内容的代码或输出样例,请在 ``` 后添加 `none {:.devsite-disable-click-to-copy}`。 + +
+```none {:.devsite-disable-click-to-copy}
+$ my_command
+不必复制和粘贴该代码块。
+```
 
+ +该代码块在渲染时,右上角没有复制标志: + + ```none {:.devsite-disable-click-to-copy} +$ my_command +不必复制和粘贴该代码块。 ``` + +不推荐:为只需查看的内容启用复制功能。如果您在 ``` 之后不指定任何内容,那么复制功能默认是启用的。 + +
+```
+$ my_command
+不必复制和粘贴该代码块。
+```
 
+ +该代码块渲染为如下形式: + +``` +$ my_command +不必复制和粘贴该代码块。 ``` + +### 引用源代码时使用路径,不要使用网址 + +推荐:任何引用源代码的链接应当仅使用路径引用。否则您将收到静态错误检查(static error check)。 + +
+更新[状态标头][sh]
+[sh]: /zircon/system/ulib/inspect/include/lib/inspect/cpp/vmo/state.h
 
@@ -220,4 +415,4 @@ Update the [state header][sh] [google-dev-doc-style-guide]: https://developers.google.com/style [markdown-reference-links]: /contribute/docs/markdown.md [external-link-example]: http://example.com -[fuchsia-dev]: https://fuchsia.dev \ No newline at end of file +[fuchsia-dev]: https://fuchsia.dev diff --git a/contribute/governance/rfcs/0001_rfc_process.md b/contribute/governance/rfcs/0001_rfc_process.md index fc97df8f..728cc74b 100644 --- a/contribute/governance/rfcs/0001_rfc_process.md +++ b/contribute/governance/rfcs/0001_rfc_process.md @@ -27,7 +27,7 @@ establishing a consistent and transparent path for making project-wide, technical decisions, all the stakeholders can be confident about the technical direction of the project. --> -现在,Fuchsia 项目在项目级别的技术决定上并没有一个正式的工作流程。以我们目前的规模来说,这样的非正式性导致了不同的人在项目方向和如何组合系统上有着不同的看法。 通过建立这样一个一致且透明的项目标准, 所有的利益相关者都能够在项目的技术方向充满信息。 +现在,Fuchsia 项目在项目级别的技术决定上并没有一个正式的工作流程。以我们目前的规模来说,这样的非正式性导致了不同的人在项目方向和如何组合系统上有着不同的看法。 通过建立这样一个一致且透明的项目标准, 所有的利益相关者都能够在项目的技术方向充满信心。 @@ -72,7 +72,7 @@ The following kinds of changes must use the RFC process: changing the set of supported languages impacts everyone who needs to debug and understand the system, even if not everyone uses the new language. --> - * **制订项目政策。** 项目政策对系统有着广泛的影响,常常影响着项目贡献者。比如,修改支持的(编程)语言集,会影响需要调试和理解系统的人员,即使并不是所有的人都使用新语言。 + * **制定项目政策。** 项目政策对系统有着广泛的影响,常常影响着项目贡献者。比如,修改支持的(编程)语言集,会影响需要调试和理解系统的人员,即使并不是所有的人都使用新语言。 -### 步骤二:起草 {#draft} +#### 第二步:起草 {#draft} -在这个阶段不必担心您的 RFC 的序号。反之,请使用 `NNNN` 做为占位符。比如,一个文件的名字应该是 `NNNN_my_idea.md` 这种形式。RFC 文档会在合并之前不久获得一个序号。 +在这个阶段不必担心您的 RFC 的序号。反之,请使用 `NNNN` 作为占位符。比如,一个文件的名字应该是 `NNNN_my_idea.md` 这种形式。RFC 文档会在合并之前不久获得一个序号。 -> **建议。** 您可以在准备好接收反馈之前,先把包含 RFC 的 CL 标记为“进行中”。 +> **建议:** 您可以在准备好接收反馈之前,先把包含 RFC 的 CL 标记为“进行中”。 -利益相关者将代码审查标志设为 -1 或者 -2 并不一定会阻止项目接收该 RFC。要获取关于 RFC 接受决定流程的更多细节,请参阅下面的[“决定如何做出”章节](#how-decisions-are-made) 。 +利益相关者将代码审查标志设为 -1 或者 -2 并不一定会阻止项目接受该 RFC。要获取关于 RFC 接受决定流程的更多细节,请参阅下面的[“决定如何做出”章节](#how-decisions-are-made) 。 - -## Summary - -In the past, `zx_task_kill` allowed usermode to kill individual threads. However, -killing individual threads encourages bad practices and has a high chance of leaving -the process in a bad state. For this reason, the ability to kill individual threads -should be removed. - -## Motivation and problem statement - -There is no reasonable use for usermode to kill individual threads. Exposing such facility -encourages bad practices. - -On Fuchsia, like other systems, killing a thread is done asynchronously; for running threads there -is no practical way to determine the exact place where it is safe to terminate a thread. For a -blocked (waiting) thread, the safer and often simple solution is to add logic so upon wakeup the -thread exits by itself. - -Dangers killing a thread - -* Locks can be left acquired, including global locks like ones controlling the heap. -* Memory can be leaked. At the very least the thread stack, but often many other pieces. -* Runtime left in an inconsistent state. This is at least true for the C and Go runtime. -* Killing a thread in its way to a syscall leaves the process in an unknown state. Kernel is - fine but the process does not have a way to know what happened and what did not happen. -* Defeats RAII wrappers and automatic cleanup. In fact, it defeats most guarantees from the high - level languages Fuchsia uses. - -## Design - -The following syscall will fail with `ZX_ERR_NOT_SUPPORTED` when passed a handle to a thread: - -``` -zx_status_t zx_task_kill(zx_handle_t handle); -``` - -Processes and jobs will still be killable as normal. - -## Implementation - -Luckily, thread killing is not used very much in Fuchsia. The only use cases are in test code -that checks that a thread hits a specific exception. This code is going to be updated so that -the excepting thread exits itself after the exception is handled. For code where the exception -is unrecoverable, the excepting thread's instruction pointer can be set directly to -zx_thread_exit or the runtime's thread exit function before the thread resumes. These tests -may still leak what the excepting thread had stored on the heap, but the runtime is in -a better state, and the leaks will be collected when the test's process exits. - -## Performance - -N/A - -## Security considerations - -N/A - -## Privacy considerations - -N/A - -## Testing - -The zircon core-tests will be updated to ensure that the zx_task_kill syscall behaves as intended. -Some amount of static analysis can be done to find call sites of zx_task_kill that are passed -threads. - -The full Fuchsia Large Scale Change (LSC) process will be followed to ensure this change is -properly tested. - -## Documentation - -The documentation for [zx_task_kill](/reference/syscalls/task_kill.md) will be updated to -reflect that threads are not killable. - -## Drawbacks, Alternatives, and Unknowns - -The alternative to this proposal is the current status quo, which is to allow threads to be -killed. Threads have been killable for the entire history of Fuchsia, but there has not been -any acceptable use cases where programs have relied on this behavior. For this reason, -we believe that thread killing can be safely removed. - -## Prior art and references - -* [Windows Vista tries to remove -TerminateThread](https://devblogs.microsoft.com/oldnewthing/20150814-00/?p=91811) +{% set rfcid = "RFC-0007" %} +{% include "docs/contribute/governance/rfcs/_common/_rfc_header.md" %} +# {{ rfc.name }}: {{ rfc.title }} + + + +## 概述 + + +过去,`zx_task_kill` 允许在用户态杀死单个线程。但是,杀死单个线程会为不良做法提供支持,并且很有可能使进程处于不良状态。出于这个原因,应该删除杀死单个线程的能力。 + + +## 动机与问题陈述 + + +对于用户态而言,杀死单个线程的做法没有合理用途。暴露此类能力会为不良做法提供支持。 + + +在 Fuchsia 上,和其他系统一样,杀死一个线程是异步完成的;对于正在运行的线程,没有实用的方法来确定可安全终止线程的确切位置。对于阻塞(等待)状态的线程,通常更安全且简单的解决方案是添加逻辑,以便在唤醒后线程自行退出。 + + +杀死线程的危险 + + +* 锁可以被保持获取,包括像控制堆这样的全局锁。 +* 内存可能会泄漏。至少线程堆栈可能泄漏,但通常还有许多其他部分的内存会泄漏。 +* 运行时处于不一致的状态。至少对于 C 和 Go 运行时来说是这样。 +* 以系统调用的方式杀死一个线程会使进程处于未知状态。这对内核没有影响,但该进程无法知道发生了什么以及没有发生什么。 +* 破坏 RAII 包装器和自动清理。事实上,它破坏了 Fuchsia 使用的高级语言的大多数保证机制。 + + +## 设计 + + +当将句柄被传递给线程时,以下系统调用将失败并返回`ZX_ERR_NOT_SUPPORTED`: + +``` +zx_status_t zx_task_kill(zx_handle_t handle); +``` + + +进程和作业仍然可以正常地被杀死。 + + +## 实现 + + +幸运的是,Fuchsia 中并没有太多使用到杀死线程。唯一的用例是在检查线程是否遇到特定异常的测试代码中。此代码将被更新,以便异常线程在异常被处理后自行退出。对于异常无法恢复的代码,可以在线程恢复前,将异常线程的指令指针直接设置为 zx_thread_exit 或运行时的线程退出函数。这些测试可能仍然会泄漏异常线程存储在堆上的内容,但运行时会处于一个更好的状态,并且会在测试的进程退出时收集泄漏的内容。 + + +## 性能 + +N/A + + +## 安全性考虑 + +N/A + + +## 隐私问题 + +N/A + + +## 测试 + + +Zircon 核心测试将被更新,以确保 zx_task_kill 系统调用按预期运行。可以进行一些静态分析来找到传递线程的 zx_task_kill 的调用点。 + + +将遵循完整的 Fuchsia 大型变更(Large Scale Change,LSC)流程,以确保这一变化被正确测试。 + + +## 文档 + + +[zx_task_kill](/reference/syscalls/task_kill.md) 的文档将被更新以反映线程不可杀死。 + + +## 缺点、替代方案和未知因素 + + +该提议的替代方案是当前的现状,即允许线程被杀死。在 Fuchsia 的整个历史中,线程都是可以被杀死的,但是没有任何可接受的用例表明程序依赖于这种行为。出于这个原因,我们相信可以安全地删除线程杀死功能。 + + +## 现有技术和参考文献 + + +* [Windows Vista 尝试移除 TerminateThread 方法](https://devblogs.microsoft.com/oldnewthing/20150814-00/?p=91811) diff --git a/development/hardware/README.md b/development/hardware/README.md index c8f52c71..b4f9ddac 100644 --- a/development/hardware/README.md +++ b/development/hardware/README.md @@ -1,34 +1,73 @@ + +# 在设备上安装 Fuchsia + +Fuchsia 平台能够安装在以下硬件设备上: + +- [Chromebook][install-fuchsia-on-chromebook] +- [Intel NUC 迷你电脑][install-fuchsia-on-nuc] +- [Khadas VIM3 开发板][install-fuchsia-on-vim3] + +## 架构支持 + +Fuchsia 支持两种指令集(Instruction Set Architecture,ISA): + +* `arm64`——Fuchsia 在受支持的微处理器上,对 `arm64`(也称为 AArch64)的支持没有限制。 + +* `x86-64`——Fuchsia 在受支持的微处理器上,对 `x86-64`(也称为 IA32e 或 AMD64)的支持有一定限制。 + +## CPU 支持 + +Fuchsia 对于 CPU 的支持: + +* Intel——对于 Intel CPU,只有 Broadwell 及更高版本是受到主动支持的,并且会添加新的功能。另外,我们将接受补丁,以保持 Nehalem 及更高版本正常引导。 + +* AMD——AMD CPU 是**不**受主动支持的(具体地,我们对其没有进行主动测试),但是我们将接受补丁,以确保其正确引导。 + +## 目录 + +- [在 Chromebook 上安装 Fuchsia][install-fuchsia-on-chromebook] +- [在 NUC 迷你电脑上安装 Fuchsia][install-fuchsia-on-nuc] +- [在 NUC 迷你电脑上使用 Zedboot(旧版)安装 Fuchsia][install-fuchsia-on-nuc-legacy] +- [在 Khadas VIM3 开发板上安装 Fuchsia][install-fuchsia-on-vim3] +- 创建 Fuchsia 可引导镜像: + - [从 USB 闪存驱动器安装 Fuchsia][prepare-usb] + - [使用 Fuchsia 安装程序(旧版)][use-the-installer-legacy] +- 设置实验性硬件: + - [在 Acer Switch Alpha 12 上安装 Fuchsia][install-fuchsia-on-acer12] + - [在 Toulouse 上安装 Fuchsia][install-fuchsia-on-toulouse] diff --git a/development/hardware/acer12.md b/development/hardware/acer12.md index 15043e12..a5e18252 100644 --- a/development/hardware/acer12.md +++ b/development/hardware/acer12.md @@ -1,27 +1,81 @@ + +# 宏碁 Switch Alpha 12 + +警告:这些说明是用于配置本机器并在其上启动一个实验性、开发中的操作系统。 + +## 打开机器电源 + +您必须按住电源按钮(左侧,音量摇杆上方)几秒钟,然后松开,从而启动。电源按钮本身上的微小蓝灯亮起时(是的,当您按住电源按钮时很难看到这个灯),或者当显示屏背光亮起时,您可以放心地松开。如果您按得太久,它可能会再次关闭电源。 + +## 关闭机器电源 + +如果您启动到了 Windows 10,或者某些东西挂起或崩溃了并且您需要关闭电源,请按住电源按钮直到显示屏关闭。请确保总共按住大约 10 秒钟。 + +## 进入 BIOS + +在机器关闭的情况下,按住音量加键,然后保持不松手并按住电源键。当显示屏背光亮起时松开电源键。另一种方法是,在打开机器电源时按住外接键盘上的 F2 键。 + +## 启用 Zircon 引导 + +1. 启动机器并进入 BIOS(基本输入输出系统) + +2. 从左侧的选项卡中选择“Security(安全)” + +3. 点击“Supervisor Password Is(管理员密码是)”下的“[clean]”灰色条 + +4. 输入管理员密码,并再次输入,然后按OK + +5. 从左侧的选项卡中选择“Boot(启动)” + +6. 点击“Secure Boot(安全启动)”下的“[Enabled]”灰色条(如果没有灰色条,则表示您尚未设置管理员密码,请返回并立即设置) + +7. 从菜单中选择“Disabled(已禁用)” + +8. 可以在每项右侧使用向上/向下箭头调整“Boot priority order(启动优先级顺序)”列表 + +9. 排列该列表成如下: - USB HDD - USB FDD - USB CDROM @@ -29,36 +83,108 @@ With the machine off, Press and hold Volume Up, then continue to hold while pres - Network Boot-IPV4 - Network Boot-IPV6 - Windows Boot Manager + +10. 选择左侧的“Main(主菜单)”选项卡,分别按“[SetTime]”和“[SetDate]”按钮设置时间​​和日期。这是想要正常使用网络所必需的操作。 + +11. (可选)返回“Security(安全)”选项卡并将管理员密码设置为空。否则每次使用 BIOS 时都需要输入密码。修改安全启动设置时需要密码,在没有密码时会持续显示“disabled(已禁用)”。 + +12. 从左侧的选项卡中选择“Exit(退出)” + +13. 选择“Exit Saving Changes(退出并保存更改)” + +14. 继续[使用 USB 闪存驱动器进行设置](usb_setup.md) + +## 如果您最终进入 Windows 10 设置怎么办? + +如果您没有进入 BIOS 并且没有安装其他操作系统,您最终会出现蓝色背景的“Hi there”屏幕,要求您选择国家、语言等。 + +1. 请按住电源约 10 秒(屏幕将在 2-3 秒后关闭)。 + +2. 然后按上所述引导进入 BIOS。 + +## 如果您卡在 Windows 10 恢复中怎么办? + +有可能最终出现这样的情况:机器真的想帮助您恢复失败的启动并进入 Windows 10,将您丢进了一个恢复屏幕——蓝色背景,屏幕左上方显示“Recovery(恢复模式)”,还有一段文字说 “It looks like Windows didn’t load correctly(Windows 似乎未正确加载)”。 + +1. 选择“See advanced repair options(查看高级修复选项)” + +2. 选择“Troubleshoot(疑难解答)”(螺丝刀和扳手图标) + +3. 选择“Advanced options(高级选项)”(复选标记和线条图标) + +4. 选择“UEFI Firmware Settings(UEFI 固件设置)”(电路板和齿轮图标) + +5. 当提示“Restart to change UEFI firmware settings(重新启动以更改 UEFI 固件设置)”时,选择“Restart(重新启动)” + +6. 机器现在应该重新启动进入 BIOS + +7. 检查“Windows Boot Manager(Windows 启动管理器)”没有被移到启动顺序的顶部,如果在顶部,请修改掉 + +## 怪症 + +据观察,USB 初始化在冷启动时有竞争问题。因此,如果您从冷启动开始并尝试启动到 USB,您可能会发现自己启动到的是磁盘。 + +缓解措施: + +- 一个很有用的技巧,使用 `cmdline` 文件设置 `zircon.nodename=foo` 以在启动屏幕期间了解您是从 USB 启动还是从磁盘启动。 + +- 如果宏碁从磁盘启动但您想从 USB 启动,请移除并重新插入 USB 驱动器,然后使用 `ctrl-alt-del`(不是电源按钮)重新启动。 + +- 您可以从 bios 中判断 USB 是否已初始化,因为它会命名 USB 设备。 diff --git a/development/hardware/chromebook.md b/development/hardware/chromebook.md index 64c43eab..c77ae54f 100644 --- a/development/hardware/chromebook.md +++ b/development/hardware/chromebook.md @@ -1,123 +1,281 @@ + +# 在 Chromebook 上安装 Fuchsia + + +## 支持的 Chromebook + +这些 Chromebook 开发者经常使用,应当是稳定支持的。 + +* Google Pixelbook Go(_atlas_) + +### 以前支持的 Chromebook + +这些 Chromebook 受到“尽力而为”的支持,并且不会受到定期测试。 + +* Google Pixelbook(_eve_) + +### 其他 ChromeOS 设备 + +其他基于 x86 的 ChromeOS 设备可能工作,也可能不会工作。基于 ARM 的 ChromeOS 设备无法开箱即用。 + +## 前提条件 + + +请确保您为 Fuchsia 进行了 `chromebook-x64` 构建。 + +1. 完成[下载 Fuchsia 源代码][get-fuchsia-source]指南。 +2. 请在[配置和构建 Fuchsia][build-fuchsia]中设置您的构建配置,以使用如下的 Chromebook 产品: ```posix-terminal fx set workstation_eng.chromebook-x64 --release ``` + +## 更新 ChromeOS + +如果您的 Chromebook 从未启动过,请您最好将其启动,以检查重要的更新,步骤如下: + +1. 正常启动 Chromebook。通常,打开盖子会启动设备。如果没有启动,请使用位于设备左侧、靠近腕托位置的电源按钮。 + +2. 点按“开始使用”(Let's go)按钮。 + +3. 连接到有线或无线网络。 + +4. 接受条款,以进入更新检查步骤。 + +5. 设备应当检查并安装找到的更新。 + + +6. 更新重启之后,点按左下角的“以访客身份浏览”(Browse as Guest)。 + + +7. 通过浏览器用户界面,前往“设置->关于 Chrome OS”(Settings->About Chrome OS)或“帮助->关于 Chrome OS”(Help->About Chrome +OS),确认新安装的版本。 + +## 为您的设备开启开发者模式 + +注意:这将会擦除保存在您 Chromebook 本地的任何状态。 + +1. 关闭 Chromebook 电源。 + +2. 进入恢复模式。同时按住 Esc+Refresh(键盘顶行的第一和第三个按钮)。接着按下电源按钮(设备的左下方)。 + +3. 按下 Ctrl+D,以在禁用 OS 验证的情况下启动。您应当看到“要关闭 OS 验证,请按下 ENTER。”(To turn OS verification OFF, press ENTER) + +4. 当您的设备重启时,您将收到 OS 验证已经关闭的确认信息。再次按下 Ctrl+D 进入开发者模式(Developer Mode)。 + +5. 等待设备自行完成重新配置,可能需要几分钟时间。设备最初可能看起来没有任何反应。请允许设备静置一到两分钟。在此过程的前期,您可能听到两次响亮的“哔”声。该过程在您再次听到两次响亮的“哔”声时完成。 + +6. 当开发者模式转换完成时,设备应当自行重启。现在您可以跳至“从 USB 启动”一节的步骤 #2 了。 + +## 从 USB 启动 + +1. 启动至 ChromeOS。 + +2. 您应当看到显示“OS 验证已关闭”(OS verification is OFF)的画面,在大约 30 秒后,启动会继续。请等待欢迎或登录界面加载。请**忽略**任何用于“启用调试功能”(Enable debugging features)的链接。 + +3. 按下 Ctrl+Alt+Refresh/F3 进入命令行界面。如果该组合键无效,请尝试再次重启 Chromebook。 + +4. 进入“chronos”用户,密码留空。 + +5. 运行 `sudo crossystem dev_boot_usb=1`,启用 USB 启动。 + +6. (**可选**)运行 `sudo crossystem dev_default_boot=usb`,将 USB 启动设为默认。 + +7. 将 USB 驱动器插入 Chromebook。 + +8. 键入 `sudo reboot` 进行重启。 + +9. 在“OS 验证已关闭”画面,按下 Ctrl+U 跳过超时等待并立即从 USB 启动。(要获取其他短路选项,请参阅[提示和技巧](#tips-and-tricks)) + +仅当您想要重新铺设(re-pave)或另行从网络启动设备时,才需要 USB 驱动器进行引导。 + +如果您未将 USB 启动设为默认(步骤 #6),那么在开机时,您将需要在灰色的“警告 OS 未验证”(warning OS-not verified)画面按下 Ctrl+U,以从 USB 启动。 + +如果设备试图从 USB 启动(可能是因为您将其设为了默认,或按下了 Ctrl+U)失败,那么您将听到一次相当响亮的“哔”声。 + +注意,已经观察到启动过程中 ChromeOS 引导加载程序 USB 枚举速度很慢。如果您在从 USB 启动时遇到问题,那么在设备通过引导加载程序前,移除其他 USB 设备可能会有所帮助;另外,也请避免使用 USB 集线器。 + +## 提示和技巧 {#tips-and-tricks} + +默认情况下,ChromeOS 引导加载程序的超时等待时间很长,以便您能够按下按键。要跳过此过程,您可以在警告 OS 无法验证的灰色画面中按下 Ctrl+D 或 Ctrl+U。Ctrl+D 将使设备跳过超时等待,并从其默认源启动。Ctrl+U将跳过超时等待,并从 USB 启动设备。 + +### 配置 Fuchsia 引导源 + +Fuchsia 具有称为 `cros_nvtool` 的 `crossystem` 等价物。您可以运行 `cros_nvtool set dev_boot_default ` 将系统的默认引导源分别修改为 USB 或硬盘。 + +### 返回 ChromeOS + +要返回 ChromeOS,您必须修改 Fuchsia 内核分区的优先级低于两个 ChromeOS 内核分区中的至少一个。 + +1. 如果您未处于虚拟控制台中,请按下 Alt+Esc 进入其中 +1. 按下 Alt+Fullscreen 进入 Fuchsia 中的终端模拟器 +1. 使用 `lsblk` 命令查找含有 KERN-A、KERN-B 和 KERN-C 分区的硬盘。下例中为设备 000,请注意,内核分区的设备路径是其设备本身路径的扩展。 $ lsblk ID SIZE TYPE LABEL FLAGS DEVICE @@ -129,7 +287,10 @@ kernel partitions is an extension of that device. 005 4G cros rootfs ROOT-B /dev/sys/platform/pci/00:1e.4/pci-sdhci/sdhci/sdmmc/block/part-004/block 006 64M cros kernel KERN-C /dev/sys/platform/pci/00:1e.4/pci-sdhci/sdhci/sdmmc/block/part-005/block 007 4G cros rootfs ROOT-C /dev/sys/platform/pci/00:1e.4/pci-sdhci/sdhci/sdmmc/block/part-006/block + +4. 使用 `gpt` 命令查看设备(例,000)的分区表。 $ gpt dump /dev/class/block/000 blocksize=0x200 blocks=488554496 @@ -170,25 +331,40 @@ kernel partitions is an extension of that device. id: 769444A7-6E13-D74D-B583-C3A9CF0DE307 type: 3CB8E202-3B7E-47DD-8A3C-7FF2A13CFCEC flags: 0x0000000000000000 + +5. 注意,KERN-A 和 KERN-B 通常具有 ChromeOS 内核。Zircon 内核在上例中显示为 KERN-C,或者在某些设置中为 ZIRCON-A。 + + 要进入 ChromeOS,请通过引用**硬盘**上**分区**的索引,来降低 KERN-C(或 ZIRCON-A)的优先级。例如: $ gpt edit_cros 5 -P 0 /dev/class/block/000 + +6. 重启。 + +7. 当 ChromeOS 引导加载程序出现时,请按下空格键重新启用 OS 验证。您的设备将会重启。这一次,消息会显示“您的系统正在进行自我修复。请稍候。”(Your system is repairing itself. Please wait.)该操作将大约需要 5 分钟,之后 Chromebook 将最后重启一次。设备将重启至初始设置界面。 + +要返回 Fuchsia 内核,请重新铺设设备。 [get-fuchsia-source]: /get-started/get_fuchsia_source.md [build-fuchsia]: /get-started/build_fuchsia.md diff --git a/development/hardware/khadas-vim3.md b/development/hardware/khadas-vim3.md index 758ff5a7..ffd0015c 100644 --- a/development/hardware/khadas-vim3.md +++ b/development/hardware/khadas-vim3.md @@ -1,14 +1,622 @@ + +# 在 Khadas VIM3 板型上安装 Fuchsia + + +本指南向您展示如何在 [Khadas VIM3](https://www.khadas.com/vim3) 上安装 Fuchsia。安装过程可能需要 1 到 3 个小时。 + + +如果您想了解 Fuchsia 如何在相对低成本、支持多种外围设备的实际硬件上工作,那么在 VIM3 上运行 Fuchsia 非常有用。有关 Fuchsia 支持的 VIM3 功能的详细信息,请参阅[附录:支持的功能](#features)。 + + +如果您只想以尽可能低的分歧探索 Fuchsia,请查看[开始使用 Fuchsia SDK](/docs/get-started/sdk/index.md)。 + + +如果您在完成本指南时遇到任何问题,请参阅[附录:支持](#support)。 + + +## 受众群体 {#audience} + + +如果您从未维修过电子产品,您可能会发现本指南难以完成。例如,本指南假设您知道如何将串行电缆连接到 GPIO 以读取日志并通过像 `minicom` 这样的串口通信程序发送命令。 + + +本指南还假设您熟悉 CLI 工作流程,例如从源代码构建 Fuchsia。 + + +## 前提条件 {#prerequisites} + + +您需要以下所有硬件和软件来完成本指南: + + +* 一个 [Khadas VIM3](https://www.khadas.com/vim3) 单板计算机。 + + + 注意:Fuchsia 是否能在 Basic 型号 VIM3 上运行尚不清楚。本指南已使用 Pro 型号 VIM3 进行了验证。 + + +* 一台运行 Linux 并具有 2 个 USB 端口可用的台式机或笔记本电脑。 + + + 关键术语:此台式机或笔记本电脑在本指南的其余部分中称为**主机**。 + + + 注意:macOS 主机可能会运行,但这些说明没有在 macOS 上得到验证。在远程 Linux 计算机上构建 Fuchsia,然后尝试使用本地 macOS 主机将 Fuchsia 刷入到 VIM3 上是无法运行的。 + + + + + 注意:本指南假设您的 Linux 发行版具有 Debian 命令,例如 `apt`。 + + +* 为您的主机提供至少 24W 的电源。启用 [DVFS](https://en.wikipedia.org/wiki/Dynamic_frequency_scaling) 后,VIM3 可以消耗那么多功率 。 + + +* 在您的主机上工作的 Fuchsia 开发环境。换句话说,您应该能够从主机上的源代码构建 Fuchsia。请参阅[构建 Fuchsia](#build)。 + + +* 一条 [USB 转 TTL 串行电缆](https://www.adafruit.com/product/954)。 + + +* 支持数据和电力传输的 USB-C 到 USB-\* 电缆。USB-C 端用于 VIM3。另一端可以是您的主机支持的任何 USB 类型。 + + +以下是可选的: + + +* 一个[散热器](https://www.khadas.com/product-page/new-vim-heatsink)。这使得 VIM3 上的 2 个 CPU 内核能够全速运行,而不会达到 80°C,超过该临界温度,内核就会被节流。 + + +有关兼容配件的示例,请参阅 Khadas 商店中的 [VIM3 系列](https://www.khadas.com/shop?Collection=VIM3&sort=price_descending)。 + + +注意:本节中的所有链接仅是为了您的方便。您不需要从这些确切的商店或这些确切的零件购买。 + + +## 构建 Fuchsia {#build} + + +如果您还没有设置 [in-tree][glossary.in-tree] 环境,您应该现在就开始这个步骤,因为它可能需要一段时间才能完成: + + +1. [下载 Fuchsia 源代码](/docs/get-started/get_fuchsia_source.md)。 + + +1. [配置和构建 Fuchsia](/docs/get-started/build_fuchsia.md)。 + + + * 构建 Fuchsia 时,请改用 `fx set core.vim3`。 + + +注意: 本指南的其余部分假设你的 Fuchsia 源代码目录位于 `~/fuchsia`。 + + +您将使用 Fuchsia 开发环境为 VIM3 构建 Fuchsia 镜像,并运行一个树内 CLI 工具来将 Fuchsia 镜像刷入到 VIM3。 + + +## 设置硬件 {#hardware} + + +设置 VIM3 来与您的主机通信: + + +1. 使用 USB-C 到 USB-\* 电缆将 VIM3 和您的主机相互连接。VIM3 上的白色 LED 会亮起。 + + + 注意:不要在 VIM3 和主机之间使用 [USB 集线器](https://en.wikipedia.org/wiki/USB_hub)连接。集线器可能会使您的 VIM3 和主机更难检测和相互通信。 + + + 这个连接用于供电和用 [`fastboot`](https://en.wikipedia.org/wiki/Fastboot) 刷写 VIM3。 + + +1. 将串行电缆连接到 VIM3 的 GPIO: + + + * GND 连接到引脚 17。 + + + * RX(输入到 VIM3)连接到引脚 18。 + + + * TX(从 VIM3 输出)连接到引脚 19。 + + + * 不要把您串行电缆的电源线连接到 VIM3 的任何 GPIO 上。VIM3 是通过 USB 线获得电源的。 + + + 提示:引脚 1、20、21 和 40 标记在电路板上。 + + + 注意:通常 TX 和 RX 线的颜色不是标准化的。例如,您的 RX 线可能是蓝色或绿色。 + + + 有关如何将串行线连接到 VIM3 的示例图像,请参阅[串行调试工具](https://docs.khadas.com/linux/vim3/SetupSerialTool.html)。 + + +### 验证串行连接 {#serial} + + +确保您可以查看通过串行电缆发送的日志: + + +1. 在您的主机中打开一个终端,并且在将串行电缆连接到主机的 USB 端口之前,运行 `ls /dev/ttyUSB*`。 + + +1. 将串行电缆连接到主机,然后再次运行 `ls /dev/ttyUSB*`。应该比第一次运行命令多出 1 个结果,例如 `/dev/ttyUSB0`。这是 VIM3 和主机之间的 USB 连接。您将在下一步中为 `Serial Device` 值提供这个结果。 + + + 如果在连接串行电缆前后运行 `ls /dev/ttyUSB*` 没有区别,可以尝试 `ls /dev/tty*` 或 `ls /dev/*`。 + + +1. 如[设置串行通信程序](https://docs.khadas.com/linux/vim3/SetupSerialTool.html#Setup-Serial-Communication-Program)中所述,在您的主机上安装、设置和启动 `minicom`。 + + + 关键术语:在本指南的其余部分中,运行的终端窗口 `minicom` 称为**串行控制台**。 + + + 注意:本指南假设您使用的串行通信程序是 `minicom`,但您可以使用您喜欢的任何程序。 + + +1. 按下 VIM3 上的复位按钮。复位按钮是电路板上旁边印有 **R** 的按钮。请参见 [VIM3/3L 硬件](https://docs.khadas.com/linux/vim3/Hardware.html) 获得图表。在串行控制台中,您应该看到人类可读的日志。 + + +## 擦除 eMMC {#emmc} + + +在本指南的后面部分,您将更新 VIM3 上的引导加载程序和操作系统。除非您先完全擦除 eMMC,否则这些更新不起作用: + + +1. 按下 VIM3 上的重置按钮。 + + +1. 在按下复位按钮之后,在 VIM3 启动时开始重复按 Space 键。确保光标聚焦在串行控制台上。引导加载程序过程应该会暂停,并且串行控制台应该显示 `kvim3#` 提示符。您的串行控制台现在提供了访问 **U-Boot shell** 的权限。 + + +1. 在 U-Boot shell 中运行以下命令: + + ```posix-terminal + store init 3 + ``` + + + 您的串行控制台日志应验证 eMMC 被正确地擦除。 + + +有关详细信息,请参阅[擦除 eMMC](https://docs.khadas.com/linux/vim3/EraseEmmc.html)。 + + +## 更新 VIM3 上的 Android 镜像 {#android} + + + + +VIM3 默认自带的 Android 镜像不支持 Fuchsia 安装。如果您刚从 Khadas 收到您的 VIM3,您必须更新您的 Android 镜像: + + +1. 点击以下 URL 下载更新的 Android 镜像: + + +1. 提取压缩存档文件(VIM3_Pie_V210527.7z)。提取后您应该有一个 `VIM3_Pie_V210527` 目录,其中包含一个 `update.img` 文件。 + + +1. 按照[安装操作系统到 eMMC](https://docs.khadas.com/linux/vim3/InstallOsIntoEmmc.html) 中的说明进行操作。运行 `aml-burn-tool` 时,`-i` 标记的值应该是 `update.img` 文件的路径。您的命令应类似于以下内容: + + ```posix-terminal + aml-burn-tool -b VIM3 -i ~/Downloads/VIM3_Pie_V210527/update.img + ``` + + + 注意:通过单击**在 Ubuntu 上安装**和 **VIM3/VIM3L** 选项卡,确保您遵循 Ubuntu 和 VIM3 的说明。默认情况下不显示这些说明。 + + + 提示:`TST Mode` 工作流可能是使您的 VIM3 进入升级模式的最简单和最快的方法。 + + +1. 如果您的 VIM3 上的白色和红色 LED 熄灭,而蓝色 LED 亮起,这意味着您的 VIM3 处于睡眠模式。尝试将您的 VIM3 回到[升级模式](https://docs.khadas.com/linux/vim3/BootIntoUpgradeMode.html),然后再次按下复位按钮。 + + +此时,您的 VIM3 上的白色 LED 应该亮起,并且在您按下 VIM3 上的重置按钮后,您应该会在串行控制台中看到一些日志。 + + +## 更新引导加载程序 {#bootloader} + + +将 Fuchsia 的自定义引导加载程序刷入到 VIM3: + + +1. 安装 [Android SDK 平台工具](https://developer.android.com/studio/releases/platform-tools)。 + + + 安装这些工具可以让您访问 `adb`。 + + +1. 验证您现在是否可以运行 `adb`: + + ```posix-terminal + adb --version + ``` + + +1. 按重置按钮,然后在串行控制台中反复按 Space 键,将会再次访问 U-Boot shell。当您的串行控制台显示 `kvim3#` 提示符时,您就进入了 U-Boot shell。 + + +1. 在您的 U-Boot shell 中运行以下命令: + + ```posix-terminal + fastboot + ``` + + + 您应该在串行控制台中看到以下日志: + + ``` + g_dnl_register: g_dnl_driver.name = usb_dnl_fastboot + + USB RESET + SPEED ENUM + + USB RESET + SPEED ENUM + ``` + + + 如果您看到第一行(`g_dnl_register: g_dnl_driver.name = usb_dnl_fastboot`)但之后没有其他行,请尝试使用不同的 USB-C 到 USB-\* 电缆并确保它同时支持数据和电力传输。 + + +1. 在您的主机中打开一个新的终端窗口并运行以下命令: + + ```posix-terminal + cd ~/fuchsia/prebuilt/third_party/fastboot + + ./fastboot flashing unlock + + ./fastboot flashing unlock_critical + + ./fastboot flash bootloader ~/fuchsia/prebuilt/third_party/firmware/vim3/u-boot.bin.unsigned + + ./fastboot reboot + ``` + + + 注意:安装 Android SDK 平台工具可能会在您的主机上安装另一个 `fastboot` 实例。使用 Fuchsia 时,请记住使用在 `~/fuchsia/prebuild/third_party/fastboot/fastboot` 中 `fastboot` 的 [in-tree][glossary.in-tree] 版本。`fastboot` 协议允许任意供应商协议扩展,Fuchsia 将来可能会依赖此功能。 + + +注意:您也可以从源代码中构建自定义引导程序(`u-boot.bin.unsigned`): + + +## 将 Fuchsia 刷入 eMMC {#fuchsia} + + +在你的 VIM3 上安装 Fuchsia: + + +1. 按下重置按钮,然后立即按下 F 键,使您的 VIM3 进入 `fastboot` 模式。 + + +1. 从您主机上的单独终端运行以下命令: + + ```posix-terminal + cd ~/fuchsia + + fx flash --pave + ``` + + +你的 VIM3 现在正在运行 Fuchsia! + + +每当您想刷入新的 Fuchsia 镜像到 VIM3 时,请重复本节中的步骤。 + + +## 附录:修复一个变砖的 VIM3 {#bricks} + + +如果您的 VIM3 已[变砖](https://en.wikipedia.org/wiki/Brick_(electronics))并需要“恢复出厂设置”,请执行以下步骤: + + +1. [擦除 eMMC](#emmc). +1. [更新安卓镜像](#android). +1. [更新引导加载程序](#bootloader). +1. [将 Fuchsia 刷入 eMMC](#fuchsia). + + +## 附录:支持 {#support} + + +* 对于似乎与 VIM3 硬件或固件相关的问题,请尝试 [VIM3 官方文档](https://docs.khadas.com/linux/vim3/index.html)和 [Khadas VIM3 官方论坛](https://forum.khadas.com/c/khadas-vim3/30)。 +* 对于似乎与 Fuchsia 相关的问题,请尝试 [Fuchsia 邮件列表和聊天室](/docs/contribute/community/mailing-lists.md)。 + + +## 附录:功能支持 {#features} + + +Fuchsia 目前支持 VIM3 的这些特性: + +* UART 串​​行调试器 +* 通过以太网和 USB 铺路 +* 存储 (eMMC) +* HDMI 显示和帧缓冲(Framebuffer) +* GPU(Mali)和 Vulkan 图形 +* 以太网 +* 安全数字输入输出(SDIO) +* 集成电路总线(I2C) +* 通用输入输出接口(GPIO) +* 温度传感器和 DVFS +* 实时时钟(RTC) +* 时钟 +* 风扇 +* NNA +* 外围模式下的 USB-C +* USB-A + +这些功能正在开发中,可能不受支持: + +* 视频解码器 +* 串行外设接口(SPI) +* 音频 + +不支持以下功能,但未来的贡献可能会添加: + +* SPI 闪光灯 +* 主机模式下的 USB-C +* 电源管理和电源管理 IC(PMIC) +* 局域网唤醒 +* UART 蓝牙 + + +这些功能不受支持且不太可能添加: + +* 视频编码(由于非公开固件) +* 可信执行环境/安全启动 + + +## 附录:更新开机启动画面 {#splash} + + +要将开机启动屏幕画面更新为 Fuchsia 标识,请在 VIM3 处于 `fastboot` 模式时从主机终端运行以下命令: + +```posix-terminal +fastboot flash logo ~/fuchsia/zircon/kernel/target/arm64/board/vim3/firmware/logo.img +``` \ No newline at end of file diff --git a/general-translation-guide.md b/general-translation-guide.md index 5d52bbde..f79451a3 100644 --- a/general-translation-guide.md +++ b/general-translation-guide.md @@ -69,8 +69,12 @@ 1. 英文和中文非标点、数字和中文非标点间请用 1 个空格分割;英文或数字与中文标点间请不要空格。可以考虑使用[该软件](https://pypi.org/project/zhlint/)或类似程序进行自动化排版。 +1. **请不要参照英文写法在译文段落内添加单个换行**。单个换行会使得渲染后的文档内出现多余的空格。 + 1. 为提高校对时文本的可读性,请尽量分段翻译,避免一次性注释过多段落并进行大段翻译。 + + ### 翻译规范 1. 请至少在同一目录下保持措辞一致。 @@ -120,7 +124,7 @@ 1. 原文是内联代码格式的、具有可读性的非代码内容的。 1. 原文描述的是英文语境内容,强调了该处英文形式,且具有准确中文翻译的。 - 则请使用下面的方式标注: + 对于**所在位置不是标题中的**,请使用下面的方式标注: - 如果原文不涉及全称和简称问题,则请在译文对应位置后使用全角括号标注英文原文。另外,如果原文在代码区内,则请在代码区外标注。 - 如果原文同时具有全称和简称,或原文是未给出全称的专业术语简称,则请在译文对应位置后使用全角括号依次标注全称和简称,并在中间使用全角逗号分隔。另外,如果原文在代码区内,则请在代码区外标注。 @@ -149,6 +153,11 @@ 具体地,第一例中只包含全称,因此正常使用全角括号标注;第二例中包含了英文简称,故在全角括号中依次标注全称和简称,并使用全角逗号分隔;第三例在 [Google 公司的帮助文档](https://developer.android.com/guide/platform#:~:text=%E9%A2%84%E5%85%88%20(AOT)%20%E5%92%8C-,%E5%8D%B3%E6%97%B6%20(JIT)%20%E7%BC%96%E8%AF%91,-%E4%BC%98%E5%8C%96%E7%9A%84)中已有译例,因此按照固定方式翻译和标注。 + 对于**所在位置是标题中的**,请使用下面的方法标注: + + - 如果在正文中出现了该概念,则应当在正文进行标注,而不应在标题中进行标注。 + - 如果在正文中未出现该概念,则除非:(1)翻译具有较大歧义性,或(2)在其他文章中再次出现(即证明本身是重要概念),这些情况可以在标题中标注原文,否则不应在标题中标注原文(即不进行标注)。 + - **原文作正文,标注译文。** 如果满足下列条件之一: 1. 原文是未适配中文的输出内容的。 diff --git a/get-started/_common/components/_debugging_intro.md b/get-started/_common/components/_debugging_intro.md index 7b37df46..510739ec 100644 --- a/get-started/_common/components/_debugging_intro.md +++ b/get-started/_common/components/_debugging_intro.md @@ -1,4 +1,7 @@ + +开发软件意味着要处理程序崩溃和发现错误的根源。Fuchsia 有一套工具来帮助识别和诊断组件中的问题,从分析崩溃日志到在核心代码中进行完整的逐步调试。 diff --git a/get-started/_common/components/_declaring_intro.md b/get-started/_common/components/_declaring_intro.md index 395e91b2..8ee335b4 100644 --- a/get-started/_common/components/_declaring_intro.md +++ b/get-started/_common/components/_declaring_intro.md @@ -1,15 +1,24 @@ + +每个组件(component)都有一个声明,描述组件属性和功能。对于在软件包中分发的组件,其声明使用**组件清单(component manifest)文件**表示,并在**组件解析器**的帮助下加载。 + +![该图显示了如何使用“组件清单”来声明组件。该清单由开发者工具编译,并在运行时解析到设备上。](/get-started/images/components/component-manifest.png){: width="836"} + +请您使用组件清单语言(CML)文件声明组件。在构建时,组件清单编译器(`cmc`)工具会验证清单源并将其编译为二进制格式(`.cm`),并将其存储在组件的软件包中。在运行时,组件解析器将二进制清单文件加载到[组件管理器](/glossary/README.md#Component-Manager)的 [ComponentDecl](https://fuchsia.dev/reference/fidl/fuchsia.component.decl#Component) FIDL 结构中。 diff --git a/get-started/_common/components/_declaring_manifests.md b/get-started/_common/components/_declaring_manifests.md index dab204a6..2cbfe72c 100644 --- a/get-started/_common/components/_declaring_manifests.md +++ b/get-started/_common/components/_declaring_manifests.md @@ -1,9 +1,14 @@ -## Component manifests + +## 组件清单 + +CML 文件是以 `.cml` 扩展名结尾的 [JSON5](https://json5.org/){: .external} 文件。如下 CML 清单文件示例,描述了一个运行 ELF 二进制文件的简单组件,该文件向系统日志打印一条“Hello, World”信息: + +```json5 +{ + // 有关要运行的程序的信息。 + program: { + // 使用内置的 ELF 运行器。 + runner: "elf", + // 为此组件运行的二进制文件。 + binary: "bin/hello", + // 程序参数 + args: [ + "Hello", + "World!", + ], + }, + + // 此组件使用的能力。 + use: [ + { protocol: "fuchsia.logger.LogSink" }, + ], +} ``` + +该文件声明了关于组件的两个主要部分的信息: + +注意:要获取组件清单(component manifest)的更多详细信息,请参阅[组件清单](/concepts/components/v2/component_manifests.md)。 + +* `program`:描述可执行信息,例如二进制文件、程序参数和相关联的运行时。在此示例中,二进制文件被编译为 ELF 可执行文件并使用内置的 [ELF 运行器](/concepts/components/v2/elf_runner.md)。 + +* `use`:声明此组件运行所需的功能。在此示例中,`fuchsia.logger.LogSink` 协议使该组件能够向系统日志(syslog)写入消息。 diff --git a/get-started/_common/components/_declaring_shards.md b/get-started/_common/components/_declaring_shards.md index f752add6..e4b9db15 100644 --- a/get-started/_common/components/_declaring_shards.md +++ b/get-started/_common/components/_declaring_shards.md @@ -1,15 +1,23 @@ -## Manifest shards + +## 清单碎片 + +一些能力集合代表了系统中许多组件所共有的用例需求,例如日志记录。为了简化将这些能力纳入组件的过程,本框架将其抽象为**清单碎片**(Manifest shard),可将其纳入 CML 源文件中。 + +下面是一个与前面的示例等效的 CML。在这种情况下,通过包含 `diagnostics/syslog/client.shard.cml` 文件,而不是显式地声明 `fuchsia.logger.LogSink` 来提供必要的日志记录功能: + +```json5 +{ + include: [ "syslog/client.shard.cml" ], + + // 有关要运行的程序的信息。 + program: { + // 使用内置的 ELF 运行器。 + runner: "elf", + // 为此组件运行的二进制文件。 + binary: "bin/hello-world", + // 程序参数 + args: [ + "Hello", + "World!", + ], + }, +} +``` diff --git a/get-started/_common/components/_organizing_identifying.md b/get-started/_common/components/_organizing_identifying.md index 1c3fd62e..55ce8032 100644 --- a/get-started/_common/components/_organizing_identifying.md +++ b/get-started/_common/components/_organizing_identifying.md @@ -1,21 +1,31 @@ -## Identifying components + +## 组件的标记 + +组件由 URL 标识。框架借助**组件解析器**将组件 URL 解析为组件声明。解析器本身就是能够处理特定 URL 格式并获取组件清单、程序和资源的组件。 + +大多数组件都发布在 Fuchsia 包内,因此组件 URL 是对该包内组件清单的引用。请查看下面的示例: ```none fuchsia-pkg://fuchsia.com/{{ '' }}foo-package{{ '' }}#meta/{{ '' }}foo-component.cm{{ '' }} ``` + +组件实例由称为 **绰号(moniker)** 的拓扑路径引用来标识。组件的绰号将其在组件实例树中的位置指示为绝对或相对路径。例如,绰号路径 `/core/system-updater` 指的是存在于 `core` 领域中的 `system-updater` 的实例。 diff --git a/get-started/_common/components/_organizing_intro.md b/get-started/_common/components/_organizing_intro.md index 50f7b8de..8ef85e7c 100644 --- a/get-started/_common/components/_organizing_intro.md +++ b/get-started/_common/components/_organizing_intro.md @@ -1,24 +1,37 @@ + +系统中的所有组件组成一个有根的**组件实例树**。树中的父组件负责将其他组件的实例声明为其子组件并为它们提供能力。同时,子组件可以向父组件公开能力。这些组件实例和能力关系构成了**组件拓扑**。 + +任何父组件及其所有子组件在树中形成一个称为**领域**的组。领域使父级能够控制那些能力流入和流出其组件的子树,从而创建能力边界。这种封装允许领域在内部进行重组,而不会影响依赖于其公开能力的外部组件。 + +![图表展示了组件实例被组织成一个树,父组件通过“能力路由”确定每个子组件可用的能力。](/get-started/images/components/component-topology.png){: width="616"} + +在上图中,`fuchsia.example.Foo` 协议能力通过组件实例树从提供者路由到客户端。组件使用 `use` 关键字声明它们**需要**的能力: + +```json5 +{ + // 程序运行的有关信息。 + program: { + // 使用内置的 ELF 运行程序来运行二进制文件。 + runner: "elf", + // 运行该组件的二进制文件。 + binary: "bin/client", + }, + + // 此组件所需的能力。 + use: [ + { protocol: "fuchsia.example.Foo" }, + ], +} ``` + +组件使用组件清单中的 `capabilities` 部分声明它们实现或**提供**的能力。这使得组件框架知道该能力和它的提供者。请查看下面的 `provider.cml` 示例: + +```json5 +{ + // 程序运行的有关信息。 + program: { + // 使用内置的 ELF 运行程序来运行二进制文件。 + runner: "elf", + // 运行该组件的二进制文件。 + binary: "bin/provider", + }, + // 此组件提供的能力。 + capabilities: [ + { protocol: "fuchsia.example.Foo" }, + ], + // 通过此组件路由的能力。 + expose: [ + { + protocol: "fuchsia.example.Foo", + from: "self", + }, + ], +} +``` + + +`expose` 关键字使这个组件的能力通过它的父组件向其他领域提供,这也可能包括这个组件的子组件提供的能力。在这种情况下,能力的来源是 `self`,因为这个组件是提供者。 + +父组件控制领域内的**能力路由**,创建从客户端组件到提供者的显式路径。请查看以下 `parent.cml` 清单示例: ```json5 { @@ -96,18 +160,28 @@ example `parent.cml` manifest: } ``` + + + +父组件在领域中声明一组子组件,并使用 `offer` 关键字将能力路由到它们。用这种方法,父组件就决定了每个子组件能力的范围和来源。这也使拓扑中的多个组件能够提供相同的能力,因为组件框架依赖于显式路由来确定如何解析来自每个客户端的请求。 + +注意:要获取关于组件组织的更多详细信息,请参阅[组件拓扑](/concepts/components/v2/topology.md)。 diff --git a/get-started/_common/components/_organizing_lifecycle.md b/get-started/_common/components/_organizing_lifecycle.md index 7ae52f80..6e5a9e85 100644 --- a/get-started/_common/components/_organizing_lifecycle.md +++ b/get-started/_common/components/_organizing_lifecycle.md @@ -1,37 +1,65 @@ -## Component lifecycle + +## 组件生命周期 + +在组件拓扑中添加和移除组件实例时,会创建和销毁组件实例。这可以通过以下两种方式之一发生: + +* **静态地**:该实例在组件清单中被声明为树中另一个组件的子组件。静态组件仅当一个更新改变了组件拓扑时才会创建和销毁。 + +* **动态地**:实例在运行时使用 `fuchsia.component.Realm` 协议在组件 `collection` 中添加或移除。动态组件在系统关闭时销毁。 + +一旦组件被销毁,框架就会移除它的持久状态(比如本地存储)。 + +当一个组件尝试打开到另一组件的通道时(这称为**绑定**(binding)),框架会启动后者的一个组件实例。当连接到由组件所暴露的能力时,绑定会**隐式**发生。对已经启动的组件进行绑定,会连接到其当前运行的实例。 + + + +组件可能会通过退出程序(由组件的 `runner` 定义)自行停止,或者可能由框架在系统关闭时停止。在被销毁之前,框架将组件移动到**关闭**状态以表示它不能再次启动。 + +![该图显示了组件如何具有两种不同的状态:实例和执行。这些状态描述了“组件生命周期”。](/get-started/images/components/component-lifecycle.png){: width="662"} + +注意:要获取关于组件状态和执行的更多详细信息,请参阅[组件生命周期](/concepts/components/v2/lifecycle.md)。 diff --git a/get-started/_common/components/_overview.md b/get-started/_common/components/_overview.md index 5fb3a066..36fb9226 100644 --- a/get-started/_common/components/_overview.md +++ b/get-started/_common/components/_overview.md @@ -1,17 +1,17 @@ - 组件是 Fuchsia 上运行在其自有沙盒中的程序。每个组件都是一个可组合的模块,通过其能力(capability)与其它组件交互。Fuchsia 中所有软件都被定义为组件,除了内核镜像、引导进程以及组件管理器(Component Manager)。 - Fuchsia 的组件框架负责运行系统内几乎所有的用户空间软件。组件管理器是一个系统进程,它协调各个组件实例的执行和生命周期,维护组件拓扑,给组件提供相应功能,并使它们彼此隔离。 - 组件通过能力来获得访问更广泛系统的各个部分的权限。每个组件都可以声明其提供给系统的新能力,以及其运行所需的由其他组件(或框架)提供的能力。组件管理器解析并验证组件间的所有能力请求,以确保它们与组件已被正确授予的能力相匹配。 + diff --git a/get-started/_common/components/_product_driver.md b/get-started/_common/components/_product_driver.md index e56a8b82..814fc730 100644 --- a/get-started/_common/components/_product_driver.md +++ b/get-started/_common/components/_product_driver.md @@ -1,13 +1,25 @@ + +## 驱动框架 + +与会话类似,Fuchsia 驱动框架使开发人员能够将产品特定的设备驱动程序实现为组件。一些驱动程序组件代表硬件接口控制器,例如 PCI 或 USB,而其他驱动程序组件则与终端设备交互,例如以太网控制器或键盘。 + +当设备被发现或连接到系统时,`driver_manager` 平台组件启动必要的驱动程序组件,将它们绑定到硬件接口,并管理它们的生命周期。 + +注:要获取关于驱动框架的更多细节,请参阅 [Fuchsia 驱动框架](/development/drivers/concepts/fdf.md)。 diff --git a/get-started/_common/components/_product_session.md b/get-started/_common/components/_product_session.md index d776e8c1..74b6d30e 100644 --- a/get-started/_common/components/_product_session.md +++ b/get-started/_common/components/_product_session.md @@ -4,12 +4,16 @@ Sessions are components that encapsulate a product’s user experience. The session framework serves as a boundary between the Fuchsia platform and the product-level user interaction. Each Fuchsia product defines a single session instance as the root of the product experience, which may or may not manage -additional child components. +additional child components. --> +会话是一系列封装了产品用户体验的组件。会话框架充当 Fuchsia 平台和产品级用户之间交流的边界。每个 Fuchsia 产品都将单个会话实例定义为产品体验的根,它可能管理,也可能不管理其他子组件。 + The `session_manager` platform component starts the session component on boot and offers it a fixed set of capabilities necessary to support the session framework APIs for elements such as window management, input event handling, or -accessibility. +accessibility. --> +`session_manager` 平台组件在启动时打开会话组件,并为其提供一组固定的功能,以支持诸如窗口管理、输入事件处理或无障碍功能等元素的会话框架 API。 -Note: For more details on the session framework, see -[Introduction to the session framework](/concepts/session/introduction.md). + +注: 要获取关于会话框架的更多细节,请参阅[会话框架介绍](/concepts/session/introduction.md)。 diff --git a/get-started/_common/components/_tests_intro.md b/get-started/_common/components/_tests_intro.md index 9b994c64..982d91d7 100644 --- a/get-started/_common/components/_tests_intro.md +++ b/get-started/_common/components/_tests_intro.md @@ -1,19 +1,31 @@ + +Fuchsia **测试运行器框架**(Test Runner Framework)使开发者能够使用各种语言和运行时为组件构建测试,并在目标设备上执行它们。该框架提供了实现 `fuchsia.test.Suite` 协议的**测试运行器**组件,并与通用的特定语言的测试框架(如 GoogleTest (C++))集成。 + +`test_manager` 组件负责在 Fuchsia 设备上运行测试。它检查实现测试套件协议的组件,并将它们作为子组件启动。这意味着 `test_manager` 也负责为每个测试套件提供能力,即创建通常所谓的**测试领域**。 + +![图中显示了测试运行器框架如何为开发者提供接口来公开测试套件,以及开发者工具如何在 Fuchsia 设备上执行测试。](/get-started/images/components/test-realm.png){: width="714"} + +`ffx test` 等开发者工具与设备上的 `test_manager` 进行通信,以执行测试套件并取回结果。 diff --git a/get-started/_common/fidl/_connecting_intro.md b/get-started/_common/fidl/_connecting_intro.md index 644a0b63..d1eecf71 100644 --- a/get-started/_common/fidl/_connecting_intro.md +++ b/get-started/_common/fidl/_connecting_intro.md @@ -1,3 +1,4 @@ + +协议句柄是一个很常见的对象,它提供了一个 FIDL 协议的实现,FIDL 协议可以通过组件命名空间找到。组件框架使用能力促进了[组件](/glossary/README.md#component)之间的协议发现。能力路由描述了哪个组件应该作为任何给定客户端的提供者。一旦确定了适当的组件,[组件管理器](/glossary/README.md#component-manager)就会使用每个组件命名空间中的句柄来启动组件之间的连接。 + +请参考以下 `fuchsia.example.Foo` 协议的示例: + +![图中显示了如何连接组件,组件是能力路由和协议服务的结合。组件必须为它们提供给其他组件的协议的实现来提供服务。](/get-started/images/fidl/protocol-serving.png){: width="629"} + +该图强调了执行连接所涉及的主要元素: + +1. 提供者组件在清单的 `capabilities` 部分中静态地**声明**协议。这使组件框架能够执行能力路由。 + +2. 客户端组件在清单(manifest)的 `use` 部分静态地**请求**协议。如果能力路由成功,这将在客户端的命名空间中创建 `/svc/fuchsia.example.Foo` 协议项。 + +3. 提供者代码在运行时**发布**实现。这将在提供者传出目录中的 `/svc/fuchsia.example.Foo` 处创建一个协议项。 + +4. 客户端代码在运行时**连接**到协议句柄。这将与运行在提供者组件中的实现打开一个 FIDL 连接。 diff --git a/get-started/_common/fidl/_fidl_intro.md b/get-started/_common/fidl/_fidl_intro.md index 33d69954..02609832 100644 --- a/get-started/_common/fidl/_fidl_intro.md +++ b/get-started/_common/fidl/_fidl_intro.md @@ -1,11 +1,17 @@ + +Fuchsia 接口定义语言(FIDL)是用来描述 Fuchsia 程序使用的进程间通信(IPC)协议的语言。FIDL 为供应商提供了一种简化的声明语法,以便将接口定义为一种**协议**。支持的数据类型包括整数、浮点数、布尔运算、字符串和[句柄][glossary.handle]。这些可以被组织成更复杂的数组、向量、结构体、表格和联合体。 + +考虑以下用于 `Echo` 接口的 FIDL 协议的示例。 ```fidl library fuchsia.examples; @@ -15,27 +21,45 @@ library fuchsia.examples; {% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="examples/fidl/fuchsia.examples/echo.test.fidl" region_tag="echo" adjust_indentation="auto" %} ``` + +FIDL 协议描述了一组**方法**,在通过通道发送消息时被调用。通道消息本身是异步的,发送方和接收方彼此可以独立操作。FIDL 方法引入了更高层次的语义,使 FIDL 交易的客户端和服务器端的编程更加符合传统习惯。 + +FIDL 支持以下方法类型: + +* **双向方法**:一个典型的方法调用是,接受可选的参数,其返回类型定义在 `->` 操作符之后。双向方法会阻塞调用方直到收到响应。在 `Echo` 的例子中,`EchoString()` 方法是一个双向的方法。 + +* **单向方法**:异步方法调用,立即返回而不等待响应。没有声明返回类型的方法被认为是客户端的单向方法。在 `Echo` 的例子中,`SendString()` 方法是一个单向的方法。 + +* **事件**:必要时,服务器端可以向客户端发送非请求信息,这种消息称为事件。事件在 `->` 操作符的返回端声明其方法名称。在 `Echo` 的例子中,`OnString()` 方法是一个事件。 + +注意:要获取 FIDL 语言语法和支持的类型的更多细节,请参阅 [FIDL 语言规范](/reference/fidl/language/language.md)。 [glossary.handle]: /glossary/README.md#handle diff --git a/get-started/_common/fidl/_overview.md b/get-started/_common/fidl/_overview.md index 1075fdb1..3e6be97e 100644 --- a/get-started/_common/fidl/_overview.md +++ b/get-started/_common/fidl/_overview.md @@ -1,22 +1,34 @@ + +您已经在 **Fuchsia 简介**中了解到,Zircon 提供了内核对象类型来支持 Fuchsia 的进程间通信(IPC)。这些对象类型定义了进程用来交换数据的特定机制。在这个框架内,Zircon 通道提供了一个基于消息的异步传输能力,即支持同时传递数据和一组句柄来授予访问权。 + +Zircon 通道是 **Fuchsia 接口定义语言**(Fuchsia Interface Definition Language,FIDL)所描述的更高层次的交互的基础,FIDL 是用来描述 Fuchsia 程序所使用的 IPC 协议的语言。FIDL 允许不同的客户和服务器相互进行操作,通过强制执行一套语义行为和在通道上操作的持久性格式来实现相互操作。 + +程序通过 **FIDL 编译器**生成的特定语言的绑定(binding)和库与 FIDL 协议进行交互,该编译器是用于隐藏 Zircon IPC 复杂性的一个抽象层。这使得我们可以引入熟悉的编程习惯,如结构化类型和同步执行。编译器为每种支持的语言都生成了绑定,因此供应商不需要维护客户端库。 + +![图中显示了 Fuchsia 接口定义语言(FIDL)如何通过一个通用接口促进进程间通信(IPC);与何种编程语言无关。](/get-started/images/fidl/fuchsia-interface.png){: width="870"} diff --git a/get-started/_common/fidl/_testing_intro.md b/get-started/_common/fidl/_testing_intro.md index b1611972..20be291d 100644 --- a/get-started/_common/fidl/_testing_intro.md +++ b/get-started/_common/fidl/_testing_intro.md @@ -1,3 +1,4 @@ + +[集成测试](https://en.wikipedia.org/wiki/Integration_testing){:.external} 侧重于验证组件的行为,因为它会与系统上其他组件进行交互。正因为如此,集成测试通常与主组件分开构建,并且可能将被测组件和其他依赖组件声明为子组件。根据测试的性质,依赖组件可以作为模拟(mock)或存根(stub)提供,以促进测试用例保持封闭性。 diff --git a/get-started/_common/intro/_architecture.md b/get-started/_common/intro/_architecture.md index 522c93d6..9455f7c9 100644 --- a/get-started/_common/intro/_architecture.md +++ b/get-started/_common/intro/_architecture.md @@ -1,29 +1,54 @@ + +![展示整个 Fuchsia 系统架构的高层图表的数据表,强调了核心组件和子系统] (/get-started/images/intro/fuchsia-architecture.png){: width="1080"} -The following architectural principles guide Fuchsia's design and development: + +以下架构性原则指导了 Fuchsia 的设计与开发: + +* [**简单:**][simple]Fuchsia 让创建、维护和集成软件与硬件在各种设备中都变得容易。 + +* [**安全:**][secure]Fuchsia 有着为现代计算设计的内核和软件模型。 + +* [**可升级:**][updatable]作为模块化操作系统,Fuchsia 允许内核、驱动和软件组件独立升级。 + +* [**高性能:**][performant]Fuchsia 为真实世界产品需求设计,并为性能优化。 + +系统的核心是 [Zircon][glossary.zircon],它是处理系统启动与引导的内核和一组库。其他所有系统组件都实现于用户空间并被隔离,再次强化了**最小特权原则**。这些组件包括: + +* 设备驱动 +* 文件系统 +* 网络栈 [glossary.zircon]: /glossary/README.md#zircon [simple]: /concepts/principles/simple.md diff --git a/get-started/_common/intro/_components_capabilities.md b/get-started/_common/intro/_components_capabilities.md index c917b833..ec55afb2 100644 --- a/get-started/_common/intro/_components_capabilities.md +++ b/get-started/_common/intro/_components_capabilities.md @@ -1,19 +1,23 @@ -## Component capabilities + +## 组件能力 -Components obtain privileges to access various parts of the wider system + +组件通过**能力**(capability)获得访问更广泛系统的各个部分的权限。每个组件都可以声明其提供给系统的新能力,以及其运行所需的由其他组件(或框架)提供的能力。 -As you just saw, `runner` is an example of a capability declaring the runtime + +如您所见,`runner` 是一个声明组件运行时所需能力的例子。其它常见能力类型的例子是访问文件系统资源的 `directory` 和与其它组件通信的 `protocol`。 -Developers declare the capability types required by the component using the + +开发者在组件清单声明组件所需要的能力类型。以下是请求两个能力的组件清单示例:对 `example-data` 目录的读权限和以 FIDL 协议 `fuchsia.example.Foo` 描述的服务。 ```json5 use: [ @@ -28,6 +32,7 @@ use: [ ] ``` -Component manager uses the capability declarations to populate each component's + +组件管理器依据能力声明将必需的目录句柄填入各个组件的命名空间。对于本例而言,组件将在其命名空间中接收到 `/example/data` 和 `/svc/fuchsia.example.Foo`。 diff --git a/get-started/_common/intro/_components_manager.md b/get-started/_common/intro/_components_manager.md index 6bc5c22f..142e3f75 100644 --- a/get-started/_common/intro/_components_manager.md +++ b/get-started/_common/intro/_components_manager.md @@ -1,39 +1,47 @@ -## Component manager + +## 组件管理器 -The heart of the component framework is the **component manager**. It is + +组件框架的核心是**组件管理器**。它负责协调所有组件实例的执行,提供相应的功能,连接各个组件。 -Components can be launched explicitly (from a URL, for example) or implicitly + +组件可以显式地启动(例如,通过网址调用)或者隐式地通过响应特定功能的请求而启动。组件管理器采取必要的步骤以决定是启动一个新组件还是将请求路由到现有实例。为实现这种路由功能,每个组件必须先声明它能**提供**给系统和它需要**使用**的功能。 -Component manager parses each component's **declaration** to determine how to + +组件管理器解析每个组件的**声明**以确定如何运行组件并提供必要的能力。组件通常通过组件的包中所包含的**组件清单**文件向系统进行声明。 -Below is a simple example of a component manifest that describes an ELF -executable with some additional command arguments: + +以下是一个组件清单的简单例子,它描述了一个包含一些附加命令参数的 ELF 可执行程序: ```json5 program: { @@ -43,6 +51,8 @@ program: { }, ``` -Notice the runtime declaration telling the component manager that this + +请注意这个运行时声明,它告诉组件管理器这个组件需要[ELF 运行器](/concepts/components/v2/elf_runner.md)。 +**这是一个功能示例!** diff --git a/get-started/_common/intro/_components_organization.md b/get-started/_common/intro/_components_organization.md index a088092f..57feaa9a 100644 --- a/get-started/_common/intro/_components_organization.md +++ b/get-started/_common/intro/_components_organization.md @@ -1,28 +1,36 @@ -## Component organization + +## 组件组织 -All components in the system are composed into a single rooted + +系统中所有组件组成一棵单根**组件实例树**。这棵树结构控制着组件行为的几个重要方面。 -![Tree diagram illustrating how component instances are organized. These parent + +![树图展示了组件实例是如何组织的。这种父子关系控制组件行为的几个方面。] (/get-started/images/intro/component-organization.png){: width="712"} -Parent components in the tree are responsible for creating instances of + +树中的父组件负责将其他组件的实例创建为其子组件,并向其提供必要能力。与此同时,子组件向父组件公开能力。子组件可通过如下方式之一创建: -* **Statically**: The parent declares the existence of the child in its own + +* **静态创建**:父组件在自身组件声明中声明子组件的存在。 +* **动态创建**:父组件在运行时通过 `fuchsia.component.Realm` 协议将子组件添加到组件集中。 -Any parent component and all its children form a group within the tree called + +任何一个父组件及其所有子组件在树中形成一个称为**领域**(realm)的组,领域使父组件可以控制哪些能力可以流入和流出组件子树,从而建立一个能力边界。组件使用 `expose` 关键字来决定是否将能力导出到领域外: ```json5 expose: [ @@ -33,8 +41,9 @@ expose: [ ], ``` -Once a capability is exposed to the realm, the parent can share it with other -components within the same realm. This is done using the `offer` keyword: + +一旦将能力公开至领域,父组件就可以将其分享给领域内的其它组件。这可以通过使用 `offer` 关键字达成: ```json5 offer: [ @@ -45,21 +54,24 @@ offer: [ ], ``` -[Component manager][glossary.component-manager] is responsible for resolving + +[组件管理器][glossary.component-manager]负责解析通过提供对应能力(如目录或协议)的组件访问该能力的请求。这就是**能力路由**。组件管理器只能解析在同一领域内**公开**和**提供**的能力。 -![Diagram showing how components share capabilities through + +![组件如何通过“能力路由”共享能力的图示,描述了资源如何在特定领域内变得可用。] (/get-started/images/intro/capability-routing.png){: width="614"} [glossary.component-manager]: /glossary/README.md#component-manager diff --git a/get-started/_common/intro/_overview.md b/get-started/_common/intro/_overview.md index 14ce6cb7..fd7b58c0 100644 --- a/get-started/_common/intro/_overview.md +++ b/get-started/_common/intro/_overview.md @@ -1,6 +1,9 @@ -Fuchsia is a new open source operating system created at Google from the kernel -up to meet the needs of today's growing ecosystem of connected devices. + +Fuchsia 是谷歌从内核创建的一种新的开源操作系统,旨在满足当今不断增长的互联设备生态系统的需求。 + -In this training module, you'll learn the core principles behind this new + +在本培训模块中,您将了解这一新操作系统背后的核心原理,并探索 Fuchsia 如何为开发人员在各种设备上创建经久耐用的产品和体验奠定基础。 diff --git a/get-started/_common/intro/_packages_storing.md b/get-started/_common/intro/_packages_storing.md index acafa858..21f7c8f0 100644 --- a/get-started/_common/intro/_packages_storing.md +++ b/get-started/_common/intro/_packages_storing.md @@ -1,22 +1,27 @@ -## Storing packages + +## 包存储 -On the device, package BLOBs are stored in a content-addressable filesystem + +在设备上,包 BLOB 存储于内容可寻址的文件系统中,该文件系统针对一次写入,频繁读取的文件进行了优化,称为 `blobfs`。这使得包在所有包范围内被**去重**并采用各自的哈希**加密验证**。Fuchsia 在 `blobfs` 上运行 `pkg-cache` 服务以便进行包管理。 -![Diagram illustrating how the package cache is built on top of "blobfs" — a + +!["blobfs" 中包缓存建立的图示 —— 内容可寻址的文件系统使 BLOB 去重并允许它们在包间共享。] (/get-started/images/intro/blobfs.png){: width="632"} -The `pkg-cache` layer tracks which packages in the system are currently + +`pkg-cache` 层跟踪系统中哪些包当前处于活动状态。**包未在 Fuchsia 中明确安装或删除**。软件按需交付,同样可以通过定期的**垃圾清理**从不再活动的包中回收空间。当 `pkg-cache` 触发垃圾清理已回收空间时,任何未被活动包引用的内容 BLOB 将被删除。 -Note: For more of the technical details on Fuchsia packages and software -delivery, see the [package documentation](/concepts/packages/package.md). + +注:更多有关 Fuchsia 中包和软件交付的技术细节,请参考[包文档](/concepts/packages/package.md)。 diff --git a/get-started/_common/intro/_sandboxing_intro.md b/get-started/_common/intro/_sandboxing_intro.md index 2e22ab62..e73de119 100644 --- a/get-started/_common/intro/_sandboxing_intro.md +++ b/get-started/_common/intro/_sandboxing_intro.md @@ -1,3 +1,6 @@ + +在这一章中,您将学习 Zircon 内核对象如何使 Fuchsia 能够遵循**最少特权原则**,隔离进程并只授予他们需要的权限。 diff --git a/get-started/_common/intro/_sandboxing_namespaces.md b/get-started/_common/intro/_sandboxing_namespaces.md index 7fd4a275..add13543 100644 --- a/get-started/_common/intro/_sandboxing_namespaces.md +++ b/get-started/_common/intro/_sandboxing_namespaces.md @@ -1,11 +1,16 @@ -## Namespaces - + +## 命名空间 + +进程的命名空间包含了进程对外界的私有视图,并且控制了进程能够对 Fuchsia 系统造成多少影响。 +这有效地定义了进程所在的沙箱的规则。 -Namespaces are populated with various resource objects, including: - + +命名空间由各种资源对象填充,包括: + +* **文件**: 包含二进制数据的对象。 +* **目录**: 包含其他对象的对象。 +* **套接字**: 打开时建立连接的对象,如命名管道。 +* **协议和服务**: 打开时提供结构化服务的对象。 +* **设备**: 提供对硬件资源的访问的对象。 + +进程的创建者基于那些所请求的能力,来填充命名空间的内容。 +进程不能向自己的命名空间添加对象,因为这实际上相当于进程在授予自身访问那些对象的权限。 diff --git a/get-started/_common/intro/_sandboxing_sandboxing.md b/get-started/_common/intro/_sandboxing_sandboxing.md index b6027567..8c31049b 100644 --- a/get-started/_common/intro/_sandboxing_sandboxing.md +++ b/get-started/_common/intro/_sandboxing_sandboxing.md @@ -1,10 +1,17 @@ -## Sandboxing + +## 沙盒 + +当一个新进程被创建时,它没有任何能力。 +进程完全依赖于其创建者通过传给它的那些[句柄][glossary.handle]来提供能力。 +我们也可以说,空进程没有**环境权限**(ambient authority)。 + +因此,进程被创建时通常被赋予一些初始资源和能力。 +`fuchsia.process.Launcher` 协议提供了从一个可执行文件和一组内核对象句柄来在系统上创建新进程的低级接口。 +大多数软件使用组件框架,它简化了创建一个有一组标准的初始能力的新进程来执行一些代码的工作。 +您将在稍后更详细地探索组件。 - + +

一些给予进程的初始句柄是被进程挂载到**命名空间**(namespace)中的目录。

[glossary.handle]: /glossary/README.md#handle \ No newline at end of file diff --git a/get-started/_common/intro/_zircon_syscall.md b/get-started/_common/intro/_zircon_syscall.md index 0cfc85f5..7d432a65 100644 --- a/get-started/_common/intro/_zircon_syscall.md +++ b/get-started/_common/intro/_zircon_syscall.md @@ -1,47 +1,85 @@ -## System calls + +## 系统调用 + +用户空间代码使用**系统调用**与内核空间对象交互。Zircon 有执行低层操作的系统调用,如: + +* 内存管理 +* 任务和进程管理 +* 进程间通信(IPC)与同步 +* 异常处理 +* 硬件支持服务(时钟、熵、设备 I/O) + + + +用户空间进程通过 `libzircon.so` 访问系统调用,这是一个 +[虚拟动态共享对象][glossary.virtual-dynamic-shared-object](virtual Dynamic Shared Object,vDSO)。 +Zircon vDSO 是 ELF 格式的共享库,它被内核映射到每个新进程的地址空间。 +这个库被称为“虚拟”,是因为它是直接由内核映像暴露,而非从文件加载的。 + +大多数系统调用直接操作一个或多个[句柄][glossary.handle]。 +句柄是进程内部对内核空间对象的引用,表示为32位整数(`zx_handle_t`)。 +每个句柄声明了持有者具有的对句柄自身或引用的对象执行操作的特权,即**权利**(right)。 diff --git a/get-started/build_fuchsia.md b/get-started/build_fuchsia.md index 7e66e119..42057111 100644 --- a/get-started/build_fuchsia.md +++ b/get-started/build_fuchsia.md @@ -1,167 +1,267 @@ + +# 配置和构建 Fuchsia {#configure-and-build-fuchsia} +这篇文档将引导您在主机上配置并构建 Fuchsia。 + +步骤如下: + +1. [前提条件](#prerequisites) +1. [设置构建配置](#set-your-build-configuration) +1. [提升构建速度(可选)](#speed-up-the-build) +1. [构建 Fuchsia](#build-fuchsia) + +## 1. 前提条件 {#prerequisites} + +在开始之前,请先检查是否满足如下要求: + +* [源代码设置](#source-code-setup) +* [硬件要求](#hardware-requirements) + +### 源代码设置 {#source-code-setup} + +根据文档[下载 Fuchsia 源代码](/get-started/get_fuchsia_source.md)指示下载 Fuchsia 的源代码,然后在您的计算机上设置开发环境。 + +### 硬件要求 {#hardware-requirements} + +您只能在具有下列主机架构之一的计算机上构建 Fuchsia: + +- x86-64 Linux (只支持基于 Debian 系列的发行版) +- x86-64 macOS + +注意:不支持 Windows 和 ARM64。 + +## 2. 设置构建配置 {#set-your-build-configuration} + +Fuchsia 的构建配置告诉构建系统进行构建的产品,以及构建面向的平台。 + +要设置您的 Fuchsia 构建配置,请运行 [`fx set`][fx-set-reference] 命令: ```posix-terminal fx set {{ '' }}PRODUCT{{ '' }}.{{ '' }}BOARD{{ '' }} ``` - + +请替换以下选项: + +* `PRODUCT`(产品):您想要构建的 Fuchsia 产品,比如:`core` 和 `workstation_eng`。 +* `BOARD`(板型):产品的可执行文件架构,比如:`x64` 和 `qemu-x64`。 + +下面的示例将一项构建配置设置为 `core.qemu-x64`: ```posix-terminal fx set core.qemu-x64 ``` - + +在这个示例中: + + * `core` 是 Fuchsia 具备最小功能集的产品,包括常用的网络功能。 + * `qemu-x64` 是 Fuchsia 模拟器(FEMU)的 x64 架构这一板型,FEMU 基于开源模拟器 [QEMU][qemu]{:.external}。 + +另外,下面的例子将一项构建配置设置为 `workstation_eng.x64`,这常用于[在设备上安装 Fuchsia 工作站][build-workstation]: ```posix-terminal fx set workstation_eng.x64 ``` - + +要获取关于构建配置的更多信息,请参阅[配置构建](/development/build/fx.md#configure-a-build)。 + +## 3. 提升构建速度(可选) {#speed-up-the-build} + +注意:这一步对于构建 Fuchsia 而言并不是必需的,但是可以在您构建 Fuchsia 时节省很多时间,因此建议您完成该步骤。 + +要提升 Fuchsia 构建速度,您可以使用下列服务之一: + +* [启用 Goma](#enable-goma) +* [安装 ccache](#install-ccache) + +### 启用 Goma {#enable-goma} + +[Goma](https://chromium.googlesource.com/infra/goma/server/){:.external} 是一个分布式编译器服务,适用于 Chrome、Android 和 Fuchsia 等开源项目。 + +如果您能访问 Goma, 请在您的计算机上 Goma 客户端: ```posix-terminal fx goma ``` - + +### 安装 ccache {#install-ccache} + +如果您无法访问 Goma,但想在本地加速构建,则可以使用 [ccache](https://ccache.dev/){:.external} 缓存之前构建的产物。 * {Linux} - + + 要在 Linux 上使用 `ccache`,请安装如下安装包: ```posix-terminal sudo apt install ccache ``` * {macOS} - + + 对于 macOS ,请参阅[在 Mac 上使用 CCache](https://chromium.googlesource.com/chromium/src.git/+/HEAD/docs/ccache_mac.md){:.external} 中的安装步骤。 + +如果您的 `CCACHE_DIR` 环境变量指向已有路径,那么 `ccache` 就会自动开启。 + +要覆盖此默认行为,请为 `fx set` 指定以下标志: + +* 即使其他的加速项可用,也要强制使用 `ccache`,则:
     fx set PRODUCT.BOARD --ccache
     
- + +* 要禁用 `ccache`:
     fx set PRODUCT.BOARD --no-ccache
     
- + +## 4. 构建 Fuchsia {#build-fuchsia} + +[`fx build`][fx-build-reference] 命令可以把源代码构建打包,或者构建成其他的类型。 + +要构建 Fuchsia,请运行以下命令: + +注意:构建时间一般为 90 分钟。 ```posix-terminal fx build ``` - + +当您修改源代码后,请再次运行命令 `fx build` 进行增量构建,或者运行 `fx -i build` 命令来开启一个监视进程,这个监视进程会在发现源代码更新时自动构建。 + +要获取关于构建 Fuchsia 的更多信息,请参阅[执行构建](/development/build/fx.md#execute-a-build)。 + +## 后续步骤 + +要在您的计算机上启动 Fuchsia 模拟器 (FEMU),请参阅[开启 Fuchsia 模拟器](/get-started/set_up_femu.md)。 + +不过,如果您想在硬件设备上运行 Fuchsia,请参阅[在设备上安装 Fuchsia](/development/hardware/README.md)。 + diff --git a/get-started/explore_fuchsia.md b/get-started/explore_fuchsia.md index c1e32ae8..8d148400 100644 --- a/get-started/explore_fuchsia.md +++ b/get-started/explore_fuchsia.md @@ -1,81 +1,116 @@ -# Explore Fuchsia {#explore-fuchsia} + +# 探索 Fuchsia {#explore-fuchsia} -Once you have Fuchsia up and running on a device or emulator, -check out the following resources: + +在设备或模拟器上启动并运行 Fuchsia 后,请参阅以下资源: -* [Run ffx commands](#run-ffx-commands). + +* [运行 ffx 命令](#run-ffx-commands)。 +* [运行示例](#run-examples)。 +* [创建 Fuchsia 组件](#create-fuchsia-components)。 +* [贡献更改](#contribute-changes)。 -## Run ffx commands {#run-ffx-commands} + +## 运行 ffx 命令 {#run-ffx-commands} -[`ffx`][ffx-overview] is a host tool for Fuchsia target workflows that + +[`ffx`][ffx-overview] 是 Fuchsia 目标工作流的主机工具,为所有 Fuchsia 环境和主机平台上提供一致的开发体验。 -The following are some of `ffx` command examples: + +以下是一些 `ffx` 命令示例: -* Display the list of devices: + +* 显示设备列表: ```posix-terminal ffx target list ``` -* Display the device information: + +* 显示设备信息: ```posix-terminal ffx target show ``` -* Print the device logs: + +* 输出设备日志: ```posix-terminal ffx log ``` -* Reboot the device: + +* 重启设备: ```posix-terminal ffx target reboot ``` -## Run examples {#run-examples} + +## 运行示例 -To try out Fuchsia's sample software, check out the guides below: + +要试用 Fuchsia 的样例程序,请参阅如下指南: -* [Run an example component](/development/run/run-examples.md) + +* [运行示例组件](/development/run/run-examples.md) +* [运行测试组件](/development/run/run-test-component.md) +* [运行端到端测试](/development/testing/run_an_end_to_end_test.md) -## Create Fuchsia components {#create-fuchsia-components} + +## 创建 Fuchsia 组件 {#create-fuchsia-components} + +Fuchsia 中软件的最小可执行单元是[组件](/concepts/components/v2),这些组件通过 [FIDL](/concepts/fidl/overview.md)(Fuchsia 接口定义语言)协议彼此交互。 -To learn more about Fuchsia components and FIDL, check out the guides below: + +要想了解更多有关 Fuchsia 组件和 FIDL 的信息,请参阅如下指南: -* [Build components](/development/components/build.md) + +* [构建组件](/development/components/build.md) +* [FIDL 概览](/development/languages/fidl/README.md) +* [FIDL 教程](/development/languages/fidl/tutorials/overview.md) -## Contribute changes {#contribute-changes} + +## 贡献更改 {#contribute-changes} -When you're ready to contribute to the Fuchsia project, -see [Contribute changes][contribute-changes]. + +当您准备好为 Fuchsia 项目做出贡献时,请参阅[贡献更改][contribute-changes]。 -## See also + +## 参阅 -For more information on Fuchsia's development workflows, -check out the following resources: + +要获取关于 Fuchsia 开发流程的更多信息,请参阅下列资源: -* [fx workflows](/development/build/fx.md) + +* [fx 工作流程](/development/build/fx.md) +* [工作流程技巧和问题](/development/source_code/workflow_tips_and_faq.md) +* [配置编辑器](/development/editors/) +* [源代码布局](/development/source_code/layout.md) +* [构建系统](/development/build/build_system/index.md) + diff --git a/get-started/get_fuchsia_source.md b/get-started/get_fuchsia_source.md index 7bb6eafa..5463aaf4 100644 --- a/get-started/get_fuchsia_source.md +++ b/get-started/get_fuchsia_source.md @@ -1,30 +1,52 @@ + +# 下载 Fuchsia 源代码 + +本指南说明了如何下载 Fuchsia 源代码以及在您的机器上部署开发环境。 + +步骤如下: + +1. [执行预检查](#perform-a-preflight-check)。 +2. [安装必备软件包](#install-prerequisite-packages)。 +3. [下载 Fuchsia 源代码](#download-the-fuchsia-source-code)。 +4. [设置环境变量](#set-up-environment-variables)。 +5. [配置防火墙规则(可选)](#configure-firewall-rules)。 + + +## 1. 执行预检查 {#perform-a-preflight-check} + +Fuchsia 提供了一个预检查工具([`ffx platform preflight`][ffx-platform-preflight]),这个工具可以测试您的机器,并会通知您在该机器上可能会影响从源代码构建 Fuchsia 的任何问题。 + +注意:这个预检查工具只支持 x64 架构。目前 Fuchsia 不保证在其他宿主架构上能构建成功,比如 Windows 和 ARM64。 + +运行如下命令: * {Linux} @@ -38,14 +60,22 @@ Run the following command: curl -sO https://storage.googleapis.com/fuchsia-ffx/ffx-macos-x64 && chmod +x ffx-macos-x64 && ./ffx-macos-x64 platform preflight ``` + +## 2. 安装必备软件包 {#install-prerequisite-packages} + +Fuchsia 要求 `curl`、 `file`、 `unzip` 以及 `git` 等工具是最新版。 `git` 版本需为 2.28 或以上。 * {Linux} + + 安装(或更新)以下软件包: ```posix-terminal sudo apt install curl file git unzip @@ -53,56 +83,92 @@ of `git` needs to be 2.28 or higher. * {macOS} + + 安装 Xcode 命令行工具: + + 注意:如果 `ffx platform preflight` 显示 Xcode 工具已经安装,则请跳过这一步。 ```posix-terminal xcode-select --install ``` + +## 3. 下载 Fuchsia 源代码 {#download-the-fuchsia-source-code} + +Fuchsia 提供了一个[引导脚本](/scripts/bootstrap),这个脚本会创建一个名为 `fuchsia` 的文件夹,并把 Fuchsia 源码下载到这里。 + +下载 Fuchsia 源码要求您机器上有大约 2 GB 的存储空间。根据您的构建配置,之后在构建 Fuchsia 时,您还额外需要 80 到 90 GB 的存储空间。另外,下载过程中也会使用大量的内存。建议您在此过程中关闭其他非必要的进程。 + +要下载 Fuchsia 源代码,请执行如下步骤: + +1. 选择一个 Fuchsia 源代码下载目录,例如: + + 注意:您可以在任何目录下设置 Fuchsia。本指南选择 `$HOME` 作为示例。 ```posix-terminal cd $HOME ``` + +1. 运行引导脚本: + + 注意:下载 Fuchsia 源代码可能需要 60 分钟。 ```posix-terminal curl -s "https://fuchsia.googlesource.com/fuchsia/+/HEAD/scripts/bootstrap?format=TEXT" | base64 --decode | bash ``` + + + 这个脚本会创建 `fuchsia` 目录,并且下载源代码。 + + 如果您在脚本运行期间看到了 `Invalid authentication credentials` 错误信息,请参考[认证错误](#authentication-error)章节寻求帮助。 + +## 4. 设置环境变量 {#set-up-environment-variables} + +Fuchsia 建议您按照如下操作更新 shell 配置文件: + +* 添加 `.jiri_root/bin` 目录到您的 `PATH` 环境变量 + + Fuchsia 源码中的 `.jiri_root/bin` 目录包含了 [`jiri`](https://fuchsia.googlesource.com/jiri) 和 [`fx`](/development/build/fx.md) 工具,这些是 Fuchsia 工作流中的必备工具。Fuchsia 使用 `jiri` 工具在 Fuchsia 的项目中管理仓库,而 `fx` 工具能够帮助配置、构建、运行以及调试 Fuchsia。Fuchsia 的工具链需要可以在您的 `PATH` 环境变量中找到 `jiri` 工具。 + +* 使用“source”命令导入 `scripts/fx-env.sh` 文件 + + 虽然这并不是必须的,但是使用“source”命令导入 [`fx-env.sh`](/scripts/fx-env.sh) 文件可以在您的终端中启用一系列有用的 shell 函数。比如,它会创建 `FUCHSIA_DIR` 环境变量,以及提供 `fd` 命令用来在目录中导航时提供自动补全 (要获取更多信息,请参阅 `fx-env.sh` 中的注释)。 + +注意:如果您不想更新您的 shell 配置,则请参阅[在不更新 PATH 变量的情况下准备 Fuchsia](#work-on-fuchsia-without-updating-your-path)。 + +要更新您的 shell 配置文件来设置 Fuchsia 的环境变量,请执行如下步骤: + +1. 使用文本编辑器打开您的 `~/.bash_profile` 文件(在以下示例中,我们使用 [Nano][nano]{:.external} 文本编辑器): + + 注意:本指南使用 `bash` 终端作为示例,如果您使用 `zsh`,请在后续步骤中请替换 `~/.bash_profile` 为 `~/.zprofile`: ```posix-terminal nano ~/.bash_profile ``` + +1. 在您的 `~/.bash_profile` 文件中添加如下配置: + + 注意:如果您的 Fuchsia 源码不在 `~/fuchsia` 目录下,则请替换 `~/fuchsia` 为您的 Fuchsia 目录。 ```sh export PATH=~/fuchsia/.jiri_root/bin:$PATH source ~/fuchsia/scripts/fx-env.sh ``` + +1. 保存文件并退出。 + +1. 要更新环境变量,请运行如下命令: ```posix-terminal source ~/.bash_profile ``` + +1. 验证您可以在您的 `fuchsia` 目录内运行如下命令且没有报错: ```posix-terminal jiri help @@ -169,85 +269,151 @@ do the following: fx help ``` + +## 5. 配置防火墙规则(可选) {#configure-firewall-rules} + +注意:这一步对构建或者运行 Fuchsia 并不是必需的。但是推荐您进行该步骤,以确保 Fuchsia 模拟器实例能在 Linux 上流畅运行。 + +(**仅限 Linux**)如果您计划在 Linux 中运行 Fuchsia,那么建议您运行如下命令,在宿主机上允许 Fuchsia 特定流量: ```posix-terminal fx setup-ufw ``` + +该脚本需要 `sudo` 权限(会要求您输入密码)来设置适当的防火墙规则。(要获取关于该脚本的更多信息,请参考 [`setup-ufw`][setup-ufw])。 + +## 后续步骤 + +要构建您第一个 Fuchsia 系统镜像,请参阅[配置和构建 Fuchsia](/get-started/build_fuchsia.md)。 + +## 附录 + +### 认证错误 {#authentication-error} + +如果您在引导脚本运行过程中看到了 `Invalid authentication credentials`(无效的认证凭据)错误信息,那么您的 `~/.gitcookies` 文件中可能含有来自 `googlesource.com` 中一些仓库的 cookie,引导脚本想要匿名检查。 + +要解决该错误,请使用以下方式之一: + +* 按照屏幕上的指示为指定仓库获取密码。 +* 删除 `.gitcookies` 文件中有问题的 cookie。 + + +### 在不更新 PATH 变量的情况下准备 Fuchsia {#work-on-fuchsia-without-updating-your-path} + +下面的章节为[设置环境变量](#set-up-environment-variables)章节提供了替代方法: + +* [把工具复制到二进制目录](#copy-the-tool-to-your-binary-directory) +* [添加符号链接到二进制目录](#add-a-symlink-to-your-binary-directory) + +#### 把工具复制到二进制目录 {#copy-the-tool-to-your-binary-directory} + +如果您不想更新您的环境变量,但是想在任何目录中使用 `jiri` 工具,那么请把 `jiri` 工具复制到 `~/bin` 目录中,比如: + +注意:如果您的 Fuchsia 源码不在 `~/fuchsia` 目录中,则请把 `~/fuchsia` 替换为您的 Fuchsia 目录。 ```posix-terminal cp ~/fuchsia/.jiri_root/bin/jiri ~/bin ``` + +但是,您必须在没有 `sudo` 的情况下对 `~/bin` 有写访问权限。否则,`jiri` 无法自动保持最新版本。 + +#### 添加符号链接到二进制目录 {#add-a-symlink-to-your-binary-directory} + +同样地,如果您想在不更新环境变量的情况下使用 `fx` 工具,则请在 `~/bin` 路径中添加您 `fx` 工具的链接文件,比如: + +注意:如果您的 Fuchsia 源码不在 `~/fuchsia` 目录中,则请把 `~/fuchsia` 替换为您的 Fuchsia 目录。 ```posix-terminal ln -s ~/fuchsia/scripts/fx ~/bin ``` - + +或者,请直接使用 `fx` 工具的路径来运行,比如: ```posix-terminal ./scripts/fx help ``` - + +无论哪种情况,您都需要 `jiri` 工具在您的 `PATH` 环境变量中。 [ffx-platform-preflight]: https://fuchsia.dev/reference/tools/sdk/ffx#preflight diff --git a/get-started/learn-fuchsia.md b/get-started/learn-fuchsia.md index bcbb26ab..fa5890b7 100644 --- a/get-started/learn-fuchsia.md +++ b/get-started/learn-fuchsia.md @@ -1,31 +1,55 @@ + +# 使用入门 + +Fuchsia 是一个现代化开源操作系统,它简单、安全、可更新以及运行效率高。同时提供了操作系统的核心功能,比如系统资源管理、驱动框架以及软件抽象。Fuchsia 是一种通用操作系统,旨在助力多样化的硬件和软件生态系统。 + +## SDK 还是源代码树? + +Fuchsia 是 Google 积极开发的一个开源项目。参与 Fuchsia 的方式有两种:您可以使用 Fuchsia 的 SDK 来为 Fuchsia 构建产品和软件,或者向源代码树贡献代码以构建 Fuchsia 平台。 + +## SDK——为 Fuchsia 构建软件 + +Fuchsia 的 SDK 配套有一些工具帮助您开始开发运行在 Fuchsia 上的软件。在您开始开发软件之前,建议您了解 Fuchsia SDK 的基础知识。 + +SDK 基础知识 + +## 源代码树——向 Fuchsia 贡献代码 + +由于 Fuchsia 是一个开源项目,因而您可以为 Fuchsia 源代码树贡献代码。在您开始贡献代码之前,建议您了解关于 Fuchsia 平台的基础知识,以便理解 Fuchsia 的工作原理。 + Fundamentals for contributors \ No newline at end of file + href="/get-started/learn">针对贡献人员的基础知识 diff --git a/get-started/learn/intro/architecture.md b/get-started/learn/intro/architecture.md index aab7cae8..fb7f06da 100644 --- a/get-started/learn/intro/architecture.md +++ b/get-started/learn/intro/architecture.md @@ -1,3 +1,4 @@ -# Fuchsia architecture + +# Fuchsia 架构 <<../../_common/intro/_architecture.md>> diff --git a/get-started/learn/intro/packages.md b/get-started/learn/intro/packages.md index d675445f..fb39ce46 100644 --- a/get-started/learn/intro/packages.md +++ b/get-started/learn/intro/packages.md @@ -1,4 +1,5 @@ -# Software delivery + +# 软件交付 <<../../_common/intro/_packages_intro.md>> @@ -6,26 +7,40 @@ <<../../_common/intro/_packages_storing.md>> + +## 练习:包 + +在之前的本系列代码练习中,虽然您可能没有意识到,但您已经体验过到设备的软件按需交付。在本练习中,您将进一步揭开它的神秘面纱,了解到包被交付和存储到 Fuchsia 设备中的过程的具体细节。 <<../_common/_restart_femu.md>> + +### 启动本地包服务器 + +运行如下命令,以启动包服务器并允许模拟器加载软件包: ```posix-terminal fx serve-updates ``` - + +该命令打印的输出类似如下所示。它表示服务器正在运行,并已成功将模拟器注册为目标设备: ```none {:.devsite-disable-click-to-copy} [serve-updates] Discovery... @@ -37,22 +52,40 @@ running and has successfully registered the emulator as a target device: [pm auto] client count: 1 ``` + +### 检查包服务器 + +`fx serve-updates` 命令会启动用于将包交付到目标设备的 **本地包服务器**。该服务器默认在 8083 端口上运行。 + +在浏览器中访问 `http://localhost:8083`,会加载出一个当前包仓库中可用的包的列表的网页。列表中的每一项都是可被交付到设备的包。 + +### 监视包加载 + +包由 Fuchsia 设备按需解析并加载。让我们在 `spinning-square` 示例包上进行操作来稍作展示。 + +在设备命令行中,您可以确定某个已知的包目前是否在设备上。 ```posix-terminal fx shell pkgctl pkg-status fuchsia-pkg://fuchsia.com/spinning-square-rs @@ -63,22 +96,34 @@ Package in registered TUF repo: yes (merkle=ef65e2ed...) Package on disk: no ``` + +打开新终端,开始流式传输 `pkg-resolver` 的设备日志。 ```posix-terminal ffx log --filter pkg-resolver ``` + +这里展示了从包服务器加载的包的所有实例。 + +在设备命令行中,尝试解析包: ```posix-terminal fx shell pkgctl resolve fuchsia-pkg://fuchsia.com/spinning-square-rs ``` + +注意 `pkg-resolver` 的输出中增加的新行: ```none {:.devsite-disable-click-to-copy} [pkg-resolver][pkg-resolver][I] Fetching blobs for fuchsia-pkg://devhost/spinning-square-rs: [ @@ -88,7 +133,10 @@ Notice the new lines added to the log output for `pkg-resolver`: [pkg-resolver][pkg-resolver][I] resolved fuchsia-pkg://fuchsia.com/spinning-square-rs as fuchsia-pkg://devhost/spinning-square-rs to 21967ecc643257800b8ca14420c7f023c1ede7a76068da5faedf328f9d9d3649 with TUF ``` + +在设备命令行中,再次在设备上查看包状态: ```posix-terminal fx shell pkgctl pkg-status fuchsia-pkg://fuchsia.com/spinning-square-rs @@ -99,30 +147,48 @@ Package in registered TUF repo: yes (merkle=ef65e2ed...) Package on disk: yes (path=/pkgfs/versions/ef65e2ed...) ``` + +Fuchsia 解析了包并按需从本地 TUF 仓库中将其加载了! + +### 探索包的元数据 + +现在 `spinning-square` 包已经成功解析,接下来可以探索包内容。在解析之后,包就可以在目标设备上用它的内容地址引用。 + +在设备命令行中,可以使用 `pkgctl get-hash` 命令来确认 `spinning-square` 的包摘要。 ```posix-terminal fx shell pkgctl get-hash fuchsia-pkg://fuchsia.com/spinning-square-rs ``` + +该命令会返回如下的唯一包摘要: ```none {:.devsite-disable-click-to-copy} ef65e2ed... ``` + +使用 `pkgctl open` 命令并提供完整的包摘要,来查看包内容。 ```posix-terminal fx shell pkgctl open {{ '' }}ef65e2ed...{{ '' }} @@ -154,17 +220,30 @@ package contents: /data/vulkan/explicit_layer.d/VkLayer_khronos_validation.json ``` + +这个命令列出了包的元数据和包中的每个内容 BLOB(Binary Large OBject,二进制大型对象)。其中的 `bin/` 项目对应可执行文件,`lib/` +项目对应共享库依赖,还有后面的额外元数据和资源。 + +## 接下来是? + +祝贺!您现在对 Fuchsia 的独特性和这样一个新平台的设计目标都有了更好的理解。 + +在下一个模块中,您将了解到有关 Fuchsia 这个开源项目和用于构建与自定义系统的工具的更多知识: Building Fuchsia + href="/get-started/learn/build">构建 Fuchsia diff --git a/get-started/learn/intro/sandboxing.md b/get-started/learn/intro/sandboxing.md index 426101cf..68191dac 100644 --- a/get-started/learn/intro/sandboxing.md +++ b/get-started/learn/intro/sandboxing.md @@ -1,5 +1,6 @@ {% import 'docs/_common/_doc_widgets.md' as widgets %} -# Software isolation model + +# 软件隔离模型 <<../../_common/intro/_sandboxing_intro.md>> @@ -7,30 +8,48 @@ <<../../_common/intro/_sandboxing_namespaces.md>> -## Exercise: Namespaces + +## 练习:命名空间 + +在本练习中,您将使用命令行来更详细地探索组件的命名空间(namespace)的内容。 <<../_common/_start_femu.md>> -### Find a component in the hub + +### 在 hub 中找到一个组件 + +Fuchsia 提供了 [Hub](/concepts/components/v2/hub.md) 作为诊断接口, +用于获取系统中运行的组件实例的信息。 +您可以使用 hub 的目录结构来探索组件及其命名空间。 + +连接到设备命令行并输入以下 `ls` 命令 +来列出 `/hub-v2/children/core/children` 下的 `core` 领域(realm)的组件: ```posix-terminal fx shell ls /hub-v2/children/core/children @@ -45,10 +64,16 @@ build-info ... ``` + +这是许多核心 Fuchsia 系统组件的一个列表。要查看更多关于特定组件的详细信息,可以列出它的目录内容。 + +对 `http-client` 组件试试这个: ```posix-terminal fx shell ls /hub-v2/children/core/children/network/children/http-client @@ -65,10 +90,14 @@ resolved url ``` -### Explore the namespace and outgoing directory + +### 探索命名空间和出口目录 + +您将在 hub 内部的 `exec/in` 路径下找到运行中组件的**命名空间**。 ```posix-terminal fx shell ls /hub-v2/children/core/children/network/children/http-client/exec/in @@ -80,16 +109,27 @@ pkg svc ``` -Here are some quick highlights of each element: + +对每个元素简单说明如下: + +* `config/`: 组件的配置数据 +* `pkg/`: 组件的包的内容 +* `svc/`: 可供组件使用的系统服务 + +列出 `svc/` 目录的内容。这个目录包含 +[服务节点](https://fuchsia.dev/reference/fidl/fuchsia.io#NodeInfo), +表示提供给这个组件的系统服务。 ```posix-terminal fx shell ls /hub-v2/children/core/children/network/children/http-client/exec/in/svc @@ -101,13 +141,22 @@ fuchsia.net.name.Lookup fuchsia.posix.socket.Provider ``` + +每个服务都通过一个公有协议访问,其由一个 + [Fuchsia 接口定义语言(Fuchsia Interface Definition Language,FIDL)][glossary.FIDL]接口定义。 +组件通过其**出口目录**(outgoing directory)来提供系统服务, +这个目录被映射到 hub 内部的 `exec/out` 路径。 + +列出 `svc/` 出口目录来查看这个组件提供的系统服务。 ```posix-terminal fx shell ls /hub-v2/children/core/children/network/children/http-client/exec/out/svc @@ -117,11 +166,18 @@ fx shell ls /hub-v2/children/core/children/network/children/http-client/exec/out fuchsia.net.http.Loader ``` + +我们将在以后更详细地探索 FIDL 协议及如何访问各种服务。 diff --git a/get-started/set_up_femu.md b/get-started/set_up_femu.md index 0ddf5502..81b7fc42 100644 --- a/get-started/set_up_femu.md +++ b/get-started/set_up_femu.md @@ -1,193 +1,353 @@ + +# 启动 Fuchsia 模拟器 + +本指南提供关于在您的设备上安装和启动 Fuchsia 模拟器(FEMU)的方法说明。 + +步骤如下: + +1. [前提条件](#prerequisites)。 +1. [为 FEMU 构建 Fuchsia](#build-fuchsia-for-femu)。 +1. [启用 VM 加速(可选)](#enable-vm-acceleration)。 +1. [启动 FEMU](#start-femu)。 +1. [发现 FEMU](#discover-femu)。 + + +## 1. 前提条件 {#prerequisites} + +运行 FEMU 需要您完成以下指南: + + * [下载 Fuchsia 源代码][get-fuchsia-source] + * [配置和构建 Fuchsia][build-fuchsia] + +## 2. 为 FEMU 构建 Fuchsia {#build-fuchsia-for-femu} + +要运行 FEMU,您首先要构建一个支持模拟器环境的 Fuchsia 系统镜像。本指南使用 `qemu-x64` 板型和 `workstation_eng` 产品作为示例。 + +要构建 FEMU 的 Fuchsia 镜像,请执行以下操作: + +1. 设置 Fuchsia 构建配置: ```posix-terminal fx set workstation_eng.qemu-x64 --release ``` + +2. 构建 Fuchsia: ```posix-terminal fx build ``` + +要获取关于支持的板型和产品的更多信息,请参阅 [Fuchsia 模拟器(FEMU)][femu-overview]概述页面。 + +## 3. 启用 VM 加速(可选) {#enable-vm-acceleration} + +(**仅限Linux**)大部分 Linux 设备支持通过 KVM 进行 VM 加速,这大大提高了模拟器的性能和可用性。 + +如果您的设备可以使用 KVM,请更新您的组权限来启用 KVM。 * {Linux} + + 要在您的设备上启用 KVM,请执行以下操作: + + 注意:您只需要在每台设备上执行一次。 + + 1. 在您的设备上添加您自己到 `kvm` 组: ```posix-terminal sudo usermod -a -G kvm ${USER} ``` + + 1. 注销与您设备的所有桌面会话,然后重新登录。 + + 1. 要验证 KVM 配置正确,请运行以下命令: ```posix-terminal if [[ -r /dev/kvm ]] && grep '^flags' /proc/cpuinfo | grep -qE 'vmx|svm'; then echo 'KVM is working'; else echo 'KVM not working'; fi ``` + + 验证此命令输出以下行: ```none {:.devsite-disable-click-to-copy} KVM is working ``` + + 如果您看到 `KVM not working`,那么您可能需要重启您的设备,以使权限修改生效。 * {macOS} + + macOS 无需额外的设置。 + + 在 macOS 上 Fuchsia 模拟器使用的是 [Hypervisor 框架][hypervisor-framework]{: .external},而不是 KVM。 + +## 4. 启动 FEMU {#start-femu} + +### 启动包服务器 + +在启动模拟器之前,请启动包服务器。 + +要启动包服务器,请运行以下命令: ```posix-terminal fx serve ``` + +注意:或者,您可以将 `fx serve` 进程置于后台。 + +### 启动模拟器 + +要在您的 Linux 设备启动模拟器,请执行以下操作: * {Linux} + + 1. 通过运行以下命令配置 upscript: + + 注意:如果您的设备使用了防火墙,您可能需要应用一些额外的配置来允许模拟器访问网络。这通常通过运行“upscript”来完成,该脚本为当前进程设置接口和防火墙访问规则。如果您位于企业网络,请联系您的内部网络团队来查看他们是否有现行的 upscript 供您使用。 + + 如果您没有使用防火墙,那么还需要进行一些配置才能启用 tun/tap 网络。位于 {{ '' }}FUCHSIA_ROOT{{ '' }}/scripts/start-unsecure-internet.sh 的 upscript 示例应该适用于大多数非企业网络。 ```posix-terminal ffx config set emu.upscript {{ '' }}FUCHSIA_ROOT{{ '' }}/scripts/start-unsecure-internet.sh ``` + + * `start-unsecure-internet.sh` 是一个 upscript 示例。 + * `FUCHSIA_ROOT` 是您 Fuchsia 目录的路径。 + + 1. 启动 FEMU + + 1. 要启动可以访问外部网络的模拟器,请运行以下命令: ```posix-terminal ffx emu start --net tap ``` + + * `--net` 指定模拟器的网络模式。`--net tap` 附加到 Tun/Tap 接口。 + + 1. 要启动不可访问外部网络的模拟器,请运行以下命令: ```posix-terminal ffx emu start --net none ``` + + 启动模拟器会打开一个标题为 **Fuchsia Emulator** 的新窗口,当模拟器完成启动后,您会返回到命令提示符,模拟器会在后台运行。 * {macOS} + + 要在 macOS 上启动 FEMU,请执行以下操作: + + 1. 启动 FEMU: ```posix-terminal ffx emu start ``` + + 如果您在 macOS 上第一次(包括在重启后的第一次)启动 FEMU,则会有窗口弹出,询问您是否要允许 `aemu` 进程在您的设备上运行。请点击 **允许**(Allow)。 + + 该命令打开一个标题为 **Fuchsia Emulator** 的新窗口。当模拟器启动完成后,您会返回到命令提示符,模拟器会在后台运行。 + + 2. (可选)如果您需要指定已启动的 Fuchsia 模拟器,您可以在同一终端运行 `fx set-device` 命令。 ```posix-terminal fx set-device {{ '' }}NAME{{ '' }} ``` + + 请替换以下内容: + + * `NAME`:请从 `ffx emu list` 或 `ffx target list` 命令的输出中选择希望使用的值。`fuchsia-emulator` 为默认值。 + + +## 5. 发现 FEMU {#discover-femu} + +要将 Fuchsia 模拟器发现为正在运行的 Fuchsia 设备,请运行以下命令: ```posix-terminal ffx target list ``` + +该命令的输出类似于以下内容: ```none {:.devsite-disable-click-to-copy} $ ffx target list @@ -195,52 +355,93 @@ NAME SERIAL TYPE STATE ADDRS/ fuchsia-emulator workstation_eng.qemu-x64 Product [fe80::866a:a5ea:cd9e:69f6%qemu] N ``` + +`fuchsia-emulator` 是 Fuchsia 模拟器的默认节点名称。 + +`ffx target list` 的输出受 `--net` 选项影响,具体如下: + + * `--net none` 禁用网络,这导致设备在运行 `ffx target list` 时无法被发现。 + + * `--net tap` 和 `--net user` 允许设备在运行 `ffx target list` 时能被发现。 + +## 后续步骤 + +要了解关于 Fuchsia 设备命令和 Fuchsia 工作流的更多内容,请参阅[探索 Fuchsia][explore-fuchsia]。 + +## 附录 + +本章节提供额外的 FEMU 选项。 + +### 查看所有可用的标记(flag) -To see a full list of the emulator's supported flags: + +要查看模拟器所支持标记的[完整列表][ffx-emu-reference],请运行以下命令: ```posix-terminal ffx emu start --help ``` + +### 在没有 GUI 支持的情况下运行 FEMU + +如果您不需要图形界面或者在远程工作流下工作,您可以在无头模式(headless mode)下运行 FEMU: ```posix-terminal ffx emu start --headless ``` + +### 指定 FEMU 使用的 GPU -By default, the FEMU launcher uses software rendering using -[SwiftShader][swiftshader]{: .external}. To force FEMU to use a specific -graphics emulation method, use the parameters `--gpu host` or -`--gpu guest` with the `ffx emu start` command. - -These are the valid commands and options: + +默认情况下,FEMU 启动器尝试检测主机是否有可用于图形渲染的 GPU。如果需要显式设置渲染类型,那么您可以使用带有以下选项的 `--gpu` 标记: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
GPU 仿真方式说明标记
硬件(主机 GPU)直接使用主机设备的 GPU 进行 GPU 处理。ffx emu start --gpu host
软件(主机 CPU)使用主机设备的 CPU 来模拟 GPU 处理。ffx emu start --gpu guest
SwiftShader使用 SwiftShader 库来模拟 GPU 处理。ffx emu start --gpu swiftshader_indirect
自动如果有可用的 GPU 硬件,则解析为 host,如果没有可用的 GPU 硬件,则解析为 swiftshader_indirectauto 是当前默认值。ffx emu start --gpu auto
+ +### 重启 FEMU {#reboot-femu} + +要重启 FEMU,请运行以下 `ffx` 命令: ```posix-terminal ffx target reboot ``` + +### 停止 FEMU {#stop-femu} + +要停止 FEMU,请运行以下 `ffx` 命令: ```posix-terminal ffx emu stop ``` + +### 配置 IPv6 网络 {#configure-ipv6-network} + +本节提供关于在 Linux 设备上使用 [TUN/TAP][tuntap]{: .external} 为 FEMU 配置 IPv6 网络的方法说明。 * {Linux} + + 注意:这必须在每台设备上完成一次。 + + 要使用 [TAP 网络][tap-networking]{: .external} 在 FEMU 中启用网络,请执行以下操作: + + 1. 设置 `tuntap`: ```posix-terminal sudo ip tuntap add dev qemu mode tap user $USER ``` + + 1. 为 `qemu` 启用网络: ```posix-terminal sudo ip link set qemu up @@ -313,18 +572,25 @@ for FEMU on Linux machine using [TUN/TAP][tuntap]{: .external}. * {macOS} + + macOS 不需要额外的 IPv6 网络设置。 + + [用户网络(SLIRP)][slirp]{: .external}是 macOS 上 FEMU 的默认网络设置——虽然此设置不支持 Fuchsia 设备发现,但您仍然可以使用 `fx` 工具(例如,`fx ssh`)与您的 FEMU 实例进行交互。 [get-fuchsia-source]: /get-started/get_fuchsia_source.md [build-fuchsia]: /get-started/build_fuchsia.md [femu-overview]: /development/build/emulator.md +[ffx-emu-reference]: https://fuchsia.dev/reference/tools/sdk/ffx#emu [hypervisor-framework]: https://developer.apple.com/documentation/hypervisor [explore-fuchsia]: /get-started/explore_fuchsia.md [swiftshader]: https://swiftshader.googlesource.com/SwiftShader/ diff --git a/glossary-translation.md b/glossary-translation.md index 8cf6039a..18fd15b3 100644 --- a/glossary-translation.md +++ b/glossary-translation.md @@ -12,6 +12,7 @@ | 英文原文 | 中文翻译对应词 | 备注 | | ------------------------------ | ---------------------- | ----------------------------------------------------- | +| accessibility | 无障碍功能 | G | | application | 应用
应用程序 | | | ArchiveAccessor | 档案访问器 | i | | archivist | 归档器 | i | @@ -22,9 +23,14 @@ | automatic retry | 自动重试 | G | | backoff | 退避 | G | | best practice | 最佳做法 | G & i | +| board | 板型 | i | +| build | 构建 | G | +| capability | 能力 | i | | caveats | 注意事项 | G | | cleanup | 清理 | G | -| consume | 使用
消耗 | G
后者在结算系统中使用 | +| compile | 编译 | G | +| consume | 使用
消耗 | G
后者在结算系统中使用 | +| contribute changes | 贡献更改 | i | | control plane | 控制层面
控制平面 | G | | data plane | 数据平面
数据层面 | G | | deprecated | 已弃用(的) | G | @@ -35,7 +41,9 @@ | ergonomics | 工效学 | i & G | | escalate | 上报 | G | | execute-only memory | 只执行内存 | G | +| expose | 公开
显示 | G
具体选择取决于语境,亦有“公开显示”译法 | | fault injection | 故障注入 | G | +| fully qualified URL | 完全限定的网址 | G | | get stared | 使用入门
入门 | G
前者更常用 | | get started with | 开始使用
使用入门 | G
二者均常用 | | guidance | 指导 | | @@ -46,16 +54,29 @@ | in-tree | 树内 | G
此处指源码树 | | infrastructure | 基础架构 | G | | inspect | 审视 | Fuchsia 专有名词
i | +| installer | 安装程序 | G | +| job | 作业 | G | | just-in-time (JIT) compilation | 即时(JIT)编译 | G | +| legacy | 旧版 | G | +| moniker | 代称 | i | | mount | 装载 | G | | namespace | 命名空间 | G | +| node | 节点 | G & i | | out-of-tree | 树外 | G
此处指源码树 | +| parse | 解析 | G | +| parser | 解析器 | G | | path | 路径 | G | | pave | 铺设 | i | | policy | 政策 | G | +| prerequisites | 前提条件 | G | +| print | 输出
打印 | G
后者**只**用于有“印刷”含义的具体情况 | +| product | 产品 | i & G | | proxy | 代理 | | +| realm | 领域 | i | | remote | 远程 | | | robust | 可靠的 | G | +| sandbox | 沙盒 | G | +| sandboxing | 沙盒 | G | | sanity check | 健全性检查 | G | | service | 服务 | | | service account | 服务帐号 | G | @@ -63,12 +84,16 @@ | set up / setup | 设置 | | | settings | 设置 | | | sidecar | Sidecar | 首字母大写,不译
G | +| source code | 源代码 | G | | span | Span
跨 | 作名词时首字母大写,不译
作动词时译为“跨”
G | | strategy | 策略 | G | | suite | 套件 | G | +| tap | 点按 | G | | traffic | 流量 | G | | unmount | 卸载 | G | +| URL | 网址 | G | | validate | 验证 | G | +| Next steps | 后续步骤 | G | ## 文档中未出现术语的翻译参考表