seL4微内核入门-代码下载运行及资料

原创 thatway 那路谈OS与SoC嵌入式软件 2022-09-27 07:30

不废话,老一套:  

编译环境
准备,代码下载
,代码编译
,qemu代码运行
。本文介绍的内容都是好东西,提供全方位的微内核入门指导,就看毅力怎么样了,就像那句话:笨鸟先飞

1. sel4简介

sel4  

微内核
操作系统,号称世界上
最安全
最高效
的微内核。提供非posix
兼容的编程接口,它只提供了少量的服务,创建和管理虚拟地址空间、线程以及进程间通信
(IPC)
。亮点是capability机制
,管理每个进程所拥有的资源。这个机制的引入也导致了
sel4

难理解
和应用
开发
。关于微内核的介绍参考上一篇:

seL4微内核入门-微内核介绍

thatway,公众号:OS与AUTOSAR研究seL4微内核入门-微内核介绍

2. Turorial练习

从官网提供的学习教程hello world
开始练习,

https://docs.sel4.systems/Tutorials/hello-world.html


2.1 环境准备

这里同样,采用的开发方式为
VitrualBox+Ubuntu
,下载
VitrualBox

Ubuntu
镜像(版本

= 20.04
),安装虚拟机,具体不再描述。
sel4
开发环境搭建:参考
https://docs.sel4.systems/projects/buildsystem/host-dependencies.html

环境搭建是否正常,以能运行第一个
hello world
工程为准,
详细步骤为
:

1)repo工具安装

mkdir ~/bin
PATH=~/bin:$PATH

curl  https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

2)lib依赖库和编译工具安装

#The basic build package on Ubuntu is the build-essential package. To install run:
sudo apt-get update
sudo apt-get install build-essential

#Additional base dependencies for building seL4 projects on Ubuntu include installing:
sudo apt-get install cmake ccache ninja-build cmake-curses-gui
sudo apt-get install libxml2-utils ncurses-dev
sudo apt-get install curl git doxygen device-tree-compiler
sudo apt-get install u-boot-tools
sudo apt-get install python3-dev python3-pip python-is-python3
sudo apt-get  install protobuf-compiler python3-protobuf

sudo apt-get install qemu-system-arm qemu-system-x86 qemu-system-misc
sudo apt-get install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi
sudo apt-get  install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

3)Python 依赖库

pip3 install--user setuptools
pip3 install--user sel4-deps
# Currently we duplicate  dependencies for python2 and python3 as a python3 upgrade is in process
pip install--user setuptools
pip install--user sel4-deps

4) 编译库依赖

sudo apt-get install clang gdb
sudo apt-get install libssl-dev libclang-dev libcunit1-dev libsqlite3-dev
sudo apt-get install qemu-kvm

5)证明依赖

sudo apt-get install\
python3 python3-pip python3-dev \
gcc-arm-none-eabi build-essential libxml2-utils ccache \
ncurses-dev librsvg2-bin device-tree-compiler cmake \
ninja-build curl zlib1g-dev texlive-fonts-recommended \
texlive-latex-extra texlive-metapost texlive-bibtex-extra \
mlton-compiler haskell-stack

2.2**下载代码**

下载代码前安装
python
依赖用于编译教程

pip install --user aenum
pip install --user pyelftools

下载代码前配置
repo
邮箱信息

git config --global user.email "you@example.com"
git config --global user.name "Your Name"

下载代码(这里使用
sel4
官方的代码进行练习,从
github
上下载)

mkdir sel4-tutorials-manifest
cd sel4-tutorials-manifest
repo init -u  https://github.com/seL4/sel4-tutorials-manifest
repo sync

2.3 Hello World**应用生成**

初始化
hello-world
文件夹

./init --tut hello-world  --solution

hello-world

是示例名字,练习其他示例更换这个名字就可以,命令加--solution
后缀,可以补全代码。可以看到生成了下面的
hello-world
文件夹,里面有
c
代码。

2.4 代码编译

cd hello-world_build
ninja

编译成功后显示:

2.5 代码运行

# In build directory, hello-world_build
./simulate

成功后显示:

运行后Ctrl-A, X
退出
qemu
模拟工具。

3. Hello World代码分析

编译的时候,我们使用了**ninja**  

这个命令,
Ninja
Google
的一名程序员推出的注重速度的构建工具,一般在
Unix/Linux
上的程序通过
make/makefile
来构建编译,而
Ninja
通过将编译任务并行组织,大大提高了构建速度。

可见ninja跟makefile同级别的都是构建工具,生成编译器使用的规则。

在sel4-tutorials-manifest/hello-world_build/build.ninja文件中可以看到

执行ninja命令就会通过这个build.ninja进行编译,会找到hello-world的代码

cmake是makefile之上的一层封装。

CMakeLists.txt – cmake
使用的脚本,将根任务合并到更广泛的
seL4
构建系统中的文件。

src/main.c -
初始任务的单个源文件。

hello-world.md -
为教程生成的自述文件。

int main(int argc, char *argv[]) {
     printf("Hello, World!\n");

     printf("Second hello\n");
    return  0;
}

如果修改了应用的源码,重新运行重建项目
:

Bash
# In build directory, hello-world_build
ninja

然后再运行
simulator:

# In build directory, hello-world_build
./simulate

4. 学习资料

sel4
原理熟悉,主要从两条路进行学习:

一边

sel4
的参考手册:

https://gitee.com/18855162320/sel4_reference_manual/blob/master/sel4.0.9.pdf

另一边
就是基于
Tutorials
教程开始一步一步的做实验,这样可以做到理论和实践结合。

turorials

camkes
相关
的例子可以先不学习)

辅助库介绍:

tutorials
工程中,其他辅助库的介绍,除了
sel4
微内核之外,还需要提供一些库,才能让你的应用程序运行起来。

sel4
内核
:首先是
sel4
内核。单单的一个内核运行起来,是没法运行一个例如
hello world
这样的程序的,因为这个程序需要链接其他的库,比如
stdio
中的
printf
,而且该程序和内核交互,就需要知道内核提供的标准
API
有哪些。

libsel4

sel4
内核提供的
api
都用内核源码工程里面的
libsel4
这个库来描述。里面是
sel4
内核支持的标准
api

sel4_libs
:当一个程序连接了这个
libsel4
之后,就可以使用
sel4
内核的标准
api
了,这个和
Linux
内核提供的标准
api
类似,是和操作系统密切关联的。非
posix
标准的。另外这个
libsel4
库不是很好用,因此在这之上又堆叠了一个
sel4_libs
库,这个库是对
sel4
标准
api
的进一步功能性的封装,比如分配一个
cap
对象,调用者无需知道更下层的
sel4
标准
api
调用的细节。

musllibc
:这个是开源的一个
libc
库,和
sel4
是没有直接关系的。用到这个工程里面来,主要是提供标准的符合
posix
标准的
api
,其他的操作系统也是可以使用的。因此应用程序可以直接使用
libsel4
中的函数,也可以使用
sel4_libs
中的函数,比较标准的功能就可以使用
muscllibc
中的功能了。为了打通
muslibc

sel4_libs

sel4_libs
中提供了一个
libsel4muslcsys
这样的一个库,
muslibc
中的一些功能通过
sys call
的方式调用到
libsel4muslcsys
这个接口库中,这个接口库就会调用
sel4_libs
中的相应函数。当然
muslibc
中的有些函数可能会直接调用
libsel4
的函数接口(目前还没有看到
muslibc
中或者
libsel4
中有对这两个库的对接口的实现,可能这个猜测不对)

sel4runtime
:一般程序里面都有一个
main
函数,作为该程序的入口位置,但是,这个程序的运行并不是从
main
开始的,在运行
main
之前,其实还做了其他的一些工作,比如堆栈指针的设置,环境变量的获取,其他的一些准备工作等等。一般编译器,比如
gcc
编译器编译一个比如
hello world
这样的一个代码的时候,会指定该程序的入口地址是
_start,
就是会找寻源码,把
_start
开始的代码放在该程序代码段的最开始位置,
hello_world.c
源码中并没有
_start
这个函数或者标号,所以这个标号是其他地方的,且是会被
hello_world.c
链接进来的源码,在
sel4 tutorial
工程里,我们用
sel4runtime
(里面是源码)和
lshello_world.c
一起编译,链接。这个
sel4runtime
工程里面提供了各个架构的
_start
入口标号,该标号紧跟着的是该架构的一些汇编语言,处理堆栈等等,之后跳转到一个简单的
c
函数处,该
c
函数收集环境变量,传入参数等,并最终调用
main
函数。

其他资料:

seL4内核启动分析:

https://www.jianshu.com/p/f741d26de6c4

CSDN中sel4教程:

https://blog.csdn.net/Mr0cheng/article/details/104352613

sel4源码注释:

https://gitee.com/laokz/sel4-comment/tree/abc/src

后记:

本文中搭环境的部分比较多,  

可以加我微信thatway1989
,备注进群
。然后拉你进本公众号的交流群
:OS与AUTOSAR研究-交流群,可以讨论搭环境、汽车软件、操作系统软件等知识,一起学习。
最近回想下我学技术的过程,
如下:

啥都懂一点
啥都不精通

干啥都能干
干啥啥不是

专业入门劝退
堪称程序员杂家
”。

后续会继续更新,  

纯干货
分析,无广告,不打赏,欢迎
转载
,欢迎
评论交流

results matching ""

    No results matching ""