Tock是一个嵌入式操作系统,专为在基于 Cortex-M 的嵌入式平台上运行多个并发的,互不信任的应用程序而设计。本文介绍了如何使用源码构建 Tock 嵌入式系统。
Tock 是一个嵌入式操作系统,专为在基于 Cortex-M 的嵌入式平台上运行多个并发的,互不信任的应用程序而设计。Tock 的设计围绕着保护,无论是潜在的恶意应用程序还是设备驱动程序。Tock 使用两种机制来保护操作系统的不同组件。首先,内核和设备驱动程序是用 Rust 编写的,这是一种系统编程语言,它提供编译时内存安全性,类型安全性和严格别名。Tock 使用 Rust 来保护内核(例如调度程序和硬件抽象层)不受平台特定的设备驱动程序影响,也可以隔离设备驱动程序。其次,Tock 使用内存保护单元来隔离应用程序和内核。
在这里,我们需要的条件有:
rustup
,以让 Tock 自动选择合适的版本)cargo
封装,为嵌入式目标安装核心库)wget
,sed
,make
,cmake
macOS:
$ curl https://sh.rustup.rs -sSf | sh
$ brew tap ARMmbed/homebrew-formulae && brew update && brew install arm-none-eabi-gcc
$ pip3 install tockloader
Ubuntu:
$ curl https://sh.rustup.rs -sSf | sh
$ sudo add-apt-repository ppa:team-gcc-arm-embedded/ppa && sudo apt update && sudo apt install gcc-arm-embedded
$ pip3 install tockloader --user
$ grep -q dialout <(groups $(whoami)) || sudo usermod -a -G dialout $(whoami) # Note, will need to reboot if prompted for password
然后通过在 boards/<platform>
目录中运行 make
来构建内核。
这些步骤需要进一步深入。请注意,构建系统能够安装其中一些工具,但您也可以自行安装它们。
我们使用的是 rustc 1.24.0-nightly (8e7a609e6 2018-01-04)
。 我们建议使用 rustup
进行安装,以便可以管理 Rust 的多个版本,并继续使用其他 Rust 代码的稳定版本:
$ curl https://sh.rustup.rs -sSf | sh
这将在您的主目录中安装 rustup
,因此您需要获取 ~/.profile
或打开一个新的 shell 以将 .cargo/bin
目录添加到 $PATH
中。
然后安装正确的 nightly 版本的Rust:
$ rustup install nightly-2018-01-05
用于 ARM Cortex-M 目标的 Rust 核心库默认没有 rustup
,因此我们使用 xargo(cargo 包装)编译这些库。
$ cargo install xargo
arm-none-eabi
工具链我们通常会获取 ARM 发布的 arm-none-eabi-gcc
的最新版本。
arm-none-eabi-gcc
版本 5.1 及更早的版本或其他版本与早于 2.3 版本的 newlib 版本一起打包时存在已知问题,因为它们会遇到缺少 ARM 内部函数(例如 __aeabi_memclr
)的问题。 Tock 不支持这些版本。
编译的二进制文件
预编译的二进制文件可从 ARM 获得。 以下建议将设置操作系统的软件包管理器,以获取 ARM 的最新版本。
MacOS
使用 Homebrew(推荐):
$ brew tap ARMmbed/homebrew-formulae
$ brew update
$ brew install arm-none-eabi-gcc
或者 MacPorts:
$ port install arm-none-eabi-gcc
抬头!
make debug
目标会要求 Tock 生成系统生成列表(反汇编)文件。一些开发人员已经注意到,arm-none-eabi-objdump
在 mac 上花了很长时间(命令几分钟),而活动监视器报告 opendirectoryd
挂钩了 CPU。
这是一个已知问题,您可以通过从 /etc/auto_master
注释掉 /home
行然后运行 sudo automount -vc
来应用更改来解决这个问题。
Linux
如果你在安装二进制文件时遇到了 “"no such file or directory” 的错误,那么你很可能会丢失所需的库。检查您是否安装了 64 位版本的 libc
。
Ubuntu
$ sudo add-apt-repository ppa:team-gcc-arm-embedded/ppa
$ sudo apt update
$ sudo apt install gcc-arm-embedded
Arch
在 Arch Linux 上,pacman
中的 arm-none-eabi-newlib
软件包包含足够的最新版本的 newlibc。
$ sudo pacman -S arm-none-eabi-gcc arm-none-eabi-newlib arm-none-eabi-gdb
Windows
您可以从上面列出的 ARM 站点下载适用于 Windows 的预编译的二进制文件。虽然我们希望事情能够在 Windows 上运行,但目前还没有活跃的 Tock 开发人员在 Windows 上开发,所以可能会有一些意想不到的陷阱。
其它
或者,如果您想在 arm-none-eabi-gdb
中使用模拟器模式,则可以按照以下顺序在工具目录中使用构建脚本:build-arm-binutils
,然后使用 build-arm-gcc
然后使用 build-arm-gdb
。
Tock 为其支持的每个开发板构建了一个独特的内核。 电路板包括诸如将正确的芯片和引脚分配拉到一起的细节。要构建内核,首先选择一个开发板,然后导航到该开发板目录。 例如 cd boards/hail ; make
。
有些开发板有特殊的构建选项,只能在开发板的目录中使用。所有的开发板都有一些共同的目标:
每块开发板上的自述(README)文件提供了每个开发板的更多细节。
所有用户级代码都位于 userland
子目录中。 这包括一个专门编译的 newlib
版本,一个用于与内核通信的用户级库以及特定的驱动程序和各种示例应用程序。
编译的应用程序是特定于体系结构的(例如cortex-m4,cortex-m0),因为编译器为每个变体发出略微不同的指令。 编译的应用程序也可能取决于特定的驱动程序,并非所有的主板都提 如果您将应用程序加载到不支持所使用的每个驱动程序/系统调用的主板上,则会返回一些带有返回错误代码(ENODEVICE 或 ENOSUPPORT)的系统调用。
应用程序是针对 Tock 支持的所有体系结构构建的,目前为 cortex-m0 和 cortex-m4 。 上传代码时,开发板板选择适当的架构(例如 imix 电路板上的 SAM4L 的 cortex-m4)。
要编译应用程序,请转至所需的应用程序并制作。 例如:
$ cd userland/examples/blink/
$ make
这将构建应用程序并生成 Tock 二进制格式的二进制文件(使用 elf2tbf
实用程序):userland/examples/blink/build/cortex-m4/cortex-m4.bin
。
原文链接:https://github.com/helena-project/tock/blob/master/doc/Getting_Started.md
观光\评论区