莱昂氏unix内核源码分析 pdf_如何移植RTT微内核到树莓派3B

点击蓝字

关注我们

作者是第一次接触微内核,目前也没有深入去了解。很高兴参与RTT在树莓派上搭建的微内核的体验版。这篇文章描述如何移植,以及体验。该工程我目前在ubuntu16.04和ubuntu18.04上编译运行都没问题。

2efdc0c31dbaec96695ddbe4c249be96.pngRTT构建的混合内核的看法2efdc0c31dbaec96695ddbe4c249be96.png

一般的在 ARM Cortex-A 等处理器中,代码都是会被加载到 DRAM 中执行,而不是直接在 Flash 上执行,所以系统的启动时间将大部分的受加载时间的影响。

而在一些情况下,如果系统启动时间可以足够短时,设备低功耗也将易于实现(例如主控处理器在不使用的情况下直接进行掉电,当需要的时候再迅速启动进行工作)。

同时,RT-Thread在面向资源丰富类型的处理器时也需要一个更完善、完整的 POSIX 平台,能够更好的兼容 Linux 等 UNIX 操作系统的代码。

基于这些原因的情况下,所以RT-Thread引入了类微内核方式的架构,而考虑到微内核IPC性能的缘故,最终考虑采用混合内核的架构,这个新的架构被命名成 RT-Thread Smart 。因为类微内核架构的引入,也带来了更多的优点:

  • 整体系统更为安全,应用与内核、与服务之间可以有内存的安全隔离;

  • 应用与内核分离来进行开发、调试,在开发、维护的角度上更方便,更容易;

在支持的硬件平台上,RT-Thread Smart被设计成主要支持 ARM Cortex-A 处理器,同时兼顾 ARMCortex-M 、 RISC-V 等处理器架构。对于可以 XIP 执行的硬件平台(例如 ARM Cortex-M 系列),主要看中其独立开发性,并具备一定的安全隔离功能(通过 MPU 内存保护单元)。

81bf9875cb2ed0c3dbed40237a1bd7e1.pngRT-Thread Smart的框架81bf9875cb2ed0c3dbed40237a1bd7e1.png

RT-Thread Smart 框架图:

85d6451959c446ca0f592b233bfeb06b.png

在整体系统中,运行状态被分离成内核态和用戶态,内核中只包含基础性的服务
  • 进程管理(及多线程调度);

  • 文件系统接口( DFS );

  • BSD socket 接口( SAL/socket );

  • 设备驱动框架接口;

  • 可选的设备驱动(如 UART , GPIO , IIC 等);

如下图:

3708b4ea70f38a7b6dbe504d83d89a20.png

而在用戶态中,也包括了一些具体的实现,例如文件系统的实现,网络协议栈的实现等:
  • 具体的文件系统实现,例如 FAT 文件系统 elmFATKit ;

  • 具体的 TCP/IP 网络协议栈实现,例如 lwIP 轻型网络协议栈 lwIPKit ;

  • 图形用戶界面( GUI )实现 - PersimKit ;

  • 音频流媒体播放器服务 - AudioKit ;

  • 以及一些用戶态驱动: USB 、 LCD 等驱动;

134201abbfd4c1cc215cce74b724d074.pngRT-Thread Smart的工程134201abbfd4c1cc215cce74b724d074.png

目前RTT还没将内核源码开源,不过据RTT的老大说,RT-Thread Smart的内核源码后续将开源8547347fbb9c2443c8c53dd8187e7462.png8547347fbb9c2443c8c53dd8187e7462.png8547347fbb9c2443c8c53dd8187e7462.png。目前的内核是官方编译好的镜像。目前内测版本,还没开源,如果大家想尝试,敬请期待。作者会同步更新最新的版本。其工程目录如下:

rice@rice:~/rtt/rtthread-microkernel-v2$ tree -L 2.├── apps                //应用程序│   ├── hello│   ├── JsKit│   ├── ping│   ├── pong│   └── thread├── build│   ├── hello│   ├── JsKit│   ├── ping│   ├── pong│   └── thread├── cconfig.h├── docs│   └── rt-thread微内核 树莓派开发环境搭建.pdf├── kernel            //树莓派微内核镜像│   ├── kernel7.img│   └── qemu├── root│   └── bin├── rtconfig.h├── SConstruct├── sdk│   ├── crt│   ├── libc│   └── SConscript├── tools│   └── env-cli└── Uconfig22 directories, 7 filesrice@rice:~/rtt/rtthread-microkernel-v2$ 

默认的工程中提供几个应用程序例子:

目录说明
hellohello world例子
pingping客户端程序
pongpong服务器程序,需要ping开启后才能运行
thread创建线程例子
JsKitjs开发工具

d2e9f3a82722e6ce7ed7e186d6b92765.pngRT-Thread Smart的工程d2e9f3a82722e6ce7ed7e186d6b92765.png

  • RT-Thread Smart工程:下载地址(待开源)

  • 交叉编译链:下载地址(https://launchpad.net/gcc-arm-embedded/+download)

dcc163c3b0b5da253ba36df5daf35eb9.png

  • 树莓派镜像:下载地址(链接: https://pan.baidu.com/s/1IqFiGdZXmLzWgqHTL3B8Vw 提取码: i6wi )或者从官网下载。

  • scons工具:

$ sudo apt-get install scons
  • pip工具:

$ sudo apt-get install python-pip

cb82c48a8add916b6c49e9659ff84f66.png工程编译cb82c48a8add916b6c49e9659ff84f66.png

编译env-cli环境(进入RT-Thread Smart的内核源码):

rice@rice:~/rtt/rtthread-microkernel-v2$ cd tool/env-clirice@rice:~/rtt/rtthread-microkernel-v2/tool/env-cli$ makerice@rice:~/rtt/rtthread-microkernel-v2/tool/env-cli$ cd ../rice@rice:~/rtt/rtthread-microkernel-v2/tool$ sudo pip install -e env-cli.....Successfully installed env-clirice@rice:~/rtt/rtthread-microkernel-v2/tool$

修改交叉编译链的GCC路径:

将上面的下载的交叉编译链解压,然后copy到opt目录:

rice@rice:~/rtt$ tar -xvf gcc-arm-none-eabi-5_4-2016q3-20160926-linux.tar.bz2rice@rice:~/rtt$ rice@rice:~/rtt/rtthread-microkernel-vmv gcc-arm-none-eabi-5_4-2016q3-20160926-linux gcc-arm-none-eabirice@rice:~/rtt$ sudo cp gcc-arm-none-eabi /opt
修改工程目录下的.config。
## Automatically generated file; DO NOT EDIT.# Configuration#CONFIG_CORTEX_A=y# CONFIG_CORTEX_M is not setCONFIG_ARCH="Cortex-A"CONFIG_GNU_GCC=y# CONFIG_GNU_GCC_MUSL is not set# CONFIG_GNU_GCC_NEWLIB is not setCONFIG_Toolchain="gcc"CONFIG_EXEC_PATH="/opt/gcc-arm-none-eabi/bin"  #交叉编译链的路径# CONFIG_CUSTOM_PREFIX is not setCONFIG_PREFIX="arm-none-eabi-"CONFIG_TARGET_FILE=""

应用程序编译(目前内核还没开源,所以不用编译,内核镜像已包含在工程目录下,直接使用):

rice@rice:~/rtt/rtthread-microkernel-v2$ env-cli

4f33ae019a4bed74d55a8789961de42c.png烧录树莓派镜像4f33ae019a4bed74d55a8789961de42c.png

插入sd盘,如果是虚拟机,需要将sd挂载虚拟机上。然后执行命令:

rice@rice:~/rtt$ sudo dd if=2019-09-26-raspbian-buster-full.img of=/dev/sda bs=4M

f24471410dfd73219a81fbd7b685a68d.png替换RT-Thread Smart内核镜像f24471410dfd73219a81fbd7b685a68d.png

树莓派镜像烧录成功之后,将树莓派sd卡中的kernel7.img微内核版本的kernel录中的kernel7.img替换即可。RT-Thread Smart内核目录(rtthread-microkernel-v2/kernel/kernel7.img),然后将sd插到树莓派上。

37c3a7f403d065f57d405e3e112e3ade.png

81bf9875cb2ed0c3dbed40237a1bd7e1.png连接串口81bf9875cb2ed0c3dbed40237a1bd7e1.png

树莓派gpio14和gpio15作为串口信号线,连接如下:

7c95f265835e826a3ef19be29c314c85.png

串口参数:
  • 波特率:115200

  • 数据位:8

  • 停止位:1

  • 奇偶校验:无

  • 流控:无

然后插上电源,启动。

5942c1dc49c31d83a9d1e85adb3d7687.png

显示出RTT的logo就说明成功了。

ae49ad96aa506cdb505461402866ccdb.png应用例子示范ae49ad96aa506cdb505461402866ccdb.png

上面我们提到, RT-Thread Smart工程中提供了几个例子。直接拿例子来演示。重新将sd插到电脑。然后将hello例子拷贝到sd卡(hello world可执行文件( hello.elf)路径: rtthread-microkernel-v2/root/bin)然后重新将sd卡插到树莓派上。 验证:

182be7ddb938bcb7481f52f24fac39e0.png

个人体验:

听熊老大说目前还在开发,接下来会开源,我还是蛮期待的。初体验的感觉还出错,启动速度挺快的,提供的例程,让我们简单入门。挺不错的,一个好的地方,就是配置的东西从目前来看比较少,不知道后续编译内核的配置复杂不?期待中。后续会根据 RT-Thread Smart 的版本。多写一些相关文章。如果大家有共同兴趣的,可以持续关注本公众号的动态。 c83bbf2a3eef8783533db13750b94c58.gif 3964bb8ca69214f9f7cc383811a4e7c2.gif d7d92eb64f205284ceddbccf128e26b0.gif

我将持续更新文章和学习资料

可加作者的微信一起交流学习

d7d92eb64f205284ceddbccf128e26b0.gif

---作者微信号:wueroo1314---

获取交流群,请添加作者微信

饭仔DIY

微信号 : Rice_DIY

技术 | 开源 | 分享 

长按关注。。。

f6e4bb6e9ec725f3edde904800c2b0e7.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目 录 献辞 致谢 序(一) 序(二) 历史注记 上篇 UNIX操作系统版本6源代码 UNIX操作系统过程分类索引 3 UNIX操作系统文件及过程 5 UNIX操作系统定义的符号列表 7 UNIX操作系统源代码交叉引用列表 9 第一部分 初始化、进程初始化 25 第二部分 陷入、中断、系统调用和 进程管理 75 第三部分 程序交换、基本输入/输出、 块设备 109 第四部分 文件和目录、文件系统、管道 133 第五部分 面向字符的特殊文件 181 下篇 莱昂UNIX源代码分析 前言 207 第1章 绪论 209 1.1 UNIX操作系统 209 1.2 公用程序 209 1.3 其他文档 210 1.4 UNIX程序员手册 210 1.5 UNIX文档 211 1.6 UNIX操作系统源代码 211 1.7 源代码中各部分 212 1.8 源代码文件 212 1.9 分析的使用 212 1.10 对程序设计水平的一条注释 212 第2章 基础知识 214 2.1 处理机 214 2.2 处理机状态字 214 2.3 通用寄存器 214 2.4 指令集 215 2.5 寻址方式 216 2.5.1 寄存器方式 217 2.5.2 寄存器延迟方式 217 2.5.3 自动增1方式 217 2.5.4 自动减1方式 217 2.5.5 变址方式 217 2.5.6 立即方式 218 2.5.7 相对方式 218 2.6 UNIX汇编程序 219 2.7 存储管理 219 2.8 段寄存器 220 2.9 页说明寄存器 220 2.10 存储分配 220 2.11 状态寄存器 221 2.12 “i”和“d”空间 221 2.13 启动条件 221 2.14 专用设备寄存器 221 第3章 阅读“C”程序 222 3.1 某些选出的例子 222 3.2 例1 222 3.3 例2 223 3.4 例3 223 3.5 例4 225 3.6 例5 225 3.7 例6 227 3.8 例7 227 3.9 例8 228 3.10 例9 228 3.11 例10 229 3.12 例11 229 3.13 例12 230 3.14 例13 230 3.15 例14 231 3.16 例15 231 3.17 例16 232 3.18 例17 233 第4章 概述 235 4.1 变量分配 235 4.2 全局变量 235 4.3 “C”预处理程序 235 4.4 第一部分 236 4.4.1 第1组“.h”文件 236 4.4.2 汇编语言文件 237 4.4.3 在第一部分中的其他文件 237 4.5 第二部分 237 4.6 第三部分 238 4.7 第四部分 238 4.8 第五部分 239 第一部分 初始化、进程初始化 第5章 两个文件 241 5.1 文件malloc.c 241 5.1.1 列表维护规则 241 5.1.2 malloc(2528) 242 5.1.3 mfree(2556) 243 5.1.4 结论 244 5.2 文件prf.c 244 5.2.1 printf(2340) 244 5.2.2 printn(2369) 245 5.2.3 putchar(2386) 246 5.2.4 panic(2419) 247 5.2.5 prdev(2433)、deverror(2447) 247 5.3 包含的文件 247 第6章 系统初启 249 6.1 操作员的动作 249 6.2 start(0612) 249 6.3 main(1550) 251 6.4 进程 252 6.5 proc〔0〕的初始化 252 6.6 sched(1940) 253 6.7 sleep(2066) 253 6.8 swtch(2178) 253 6.9 再回到main 254 第7章 进程 256 7.1 进程映像 256 7.2 proc结构(0358) 257 7.3 user结构(0413) 257 7.4 每个进程数据区 258 7.5 段 258 7.6 映像的执行 258 7.7 核心态执行 259 7.8 用户态执行

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值