0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

将Circle驱动框架移植到一个自制微内核操作系统的过程

安芯教育科技 来源:嵌入式客栈 2023-07-21 09:14 次阅读

一 前言

什么是Circle?

Circle是一个叫rsta2的大佬用C++写的bare-metal的树莓派驱动框架,同时支持现存的几乎所有版本树莓派,能够驱动树莓派上的大部分设备,包SD控制器、有线和无线网卡、GPIO、USB控制器及一些常用USB设备等。

这些设备驱动中有一些是rsta2参考Linux或其它bare-metal的实现自己写的,还有一些是他直接从其它系统移植过来的。各驱动对外封装成了C++类的形式,可以按需对其实例化和使用。对于在树莓派上编写自制操作系统并且希望尽快驱动一些设备的场景,将Circle整个移植过来是非常值得考虑的选项。当然,需要注意的是,Circle的开源协议是GPLv3,具有传染性,应该把它作为系统的非必要组件来使用。

本文干了什么?

本文将简要记述将Circle驱动框架移植到一个自制微内核操作系统(实际上是实验室项目),作为用户态驱动进程的过程。

由于只是简要地记录移植过程和经验总结,本文不会深入到每一个具体的细节,如果你恰好有相似的需求,除了参考本文,还需要具体地去研究Circle的代码,并根据具体情况具体分析。

二 确定需求

首先一开始不要盲目移植,先确定一下自己需要Circle中的哪些设备驱动,比如说,如果你只是需要USB相关驱动,那么在移植过程中可以不关心WLAN那块是否有不兼容。

然后跑一些Circle提供的sample,确定Circle确实可以满足需求。

三 移植基本部分

这部分包括一些非常必要的组件,比如mailbox访问,许多驱动都需要通过mailbox获取信息或申请资源等。这部分移植完成后,将可以在启动时获取机器信息,并点亮LED灯。

具体地,主要需要做下面这些事情:

1.修改Rules.mkMakefile,去掉任何boot相关的代码。

2.重新实现一些模块,去除需要特权指令的地方,并使用用户态lib提供的功能代替:

assert:assert失败后不要真的关机或重启,可以exit;

interrupt:一开始可简单打印点内容,不用真的实现;

logger:改为printf输出;

new:使用malloc分配;

sysinit:提供假实现;

timer:使用nanosleep实现SimpleusDelay;

memory:CMemorySystem类可以直接去掉,一开始会有地方用到CMemorySystem::GetCoherentPage;

改用系统提供的分配物理上连续的non-cacheable内存的接口

3.Circle进程启动时将物理地址的外设区域直接对等映射到当前进程的虚拟地址空间,这样将不需要改动Circle中通过MMIO访问外设时使用的地址。

经过一些调试后,可以点亮LED灯,输出日志到stdout,然后退出(需要编写适当的kernel.cpp,可参考sample),这意味着简单的MMIO已经可以了。

四 驱动屏幕

这一步同样需要重新实现一些模块:

synchronize:主要是刷cache相关操作;

bcmframebuffer:向GPU申请frame buffer后需要将其映射到当前进程的虚拟地址。

经过一些调试后,可以通过HDMI输出内容到屏幕。

模拟实现Timer

对于一些稍复杂的驱动,例如USB和WLAN,会依赖timer获取当前tick,因此需要重新实现timer模块。

具体地,可以在CTimer::Initialize中创建一个新的线程,每隔10ms(利用nanosleep等函数)调用一次CTimer::InterruptHandler,其它代码几乎不用改动。此外,还需要实现CTimer::GetClockTicks以获得当前 tick数。

经过一些调试后,输出的日志中能够包含当前时间,此时说明timer基本实现对了。

六 解决内存相关的一系列问题

许多驱动在运行的过程中需要分配内存以供外设进行DMA,同时又需要在进程内访问这块内存以读写跟外设交互的数据。因此,这块内存既需要能通过虚拟地址访问,又需要能获取到物理地址,同时在物理地址上连续且non-cacheable。malloc是不能满足这个需求的,因为malloc只保证分配出的内存虚拟地址连续,不能保证物理地址连续,也无法配置成non-cacheable。

要解决这个问题,需要内核提供分配物理上连续且non-cacheable的内存并映射到虚拟地址空间的相关系统调用,然后再在Circle中利用这些系统调用重新实现内存相关模块。其实在前面已经粗略地实现了,但在这一步需要确保实现的正确性。对Circle的修改主要涉及CMemorySystem::GetCoherentPage、DMA_BUFFER、BUS_ADDRESS、new(HEAP_DMA)的定义及使用它们的地方。

七 用户态处理中断

对于像USB和WLAN这些需要利用中断通知操作系统发生了特定事件的设备,还需要把之前虚假实现的interrupt模块实现对。

首先要求内核提供让特定用户态进程处理特定IRQ的能力,具体来说就是驱动进程要能够通过系统调用注册一个函数作为特定编号的IRQ的用户态处理函数,然后内核在收到IRQ后调用此函数来处理。

接着重新实现interrupt模块,把CInterruptSystem::ConnectIRQ改为使用上述注册IRQ处理函数的系统调用,暂时用不到的函数可以不实现,比如与FIQ相关的。

八驱动USB

Timer、DMA buffer、中断这几个重要的部分移植完成后,比较容易就可以驱动USB控制器,进而可以检测并驱动USB键盘、鼠标、存储、串口转换器等设备,对于树莓派3,还可以驱动有线网卡(LAN7800)。

九其它驱动

到目前为止已经移植了大部分驱动所需的运行环境,之后的移植工作主要看具体的需求了,比如如果需要网络协议栈,还要重新实现sched模块,里面包括线程抽象、调度、线程同步机制等。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制器
    +关注

    关注

    112

    文章

    16332

    浏览量

    177812
  • Linux系统
    +关注

    关注

    4

    文章

    593

    浏览量

    27392
  • GPIO
    +关注

    关注

    16

    文章

    1204

    浏览量

    52054
  • C++语言
    +关注

    关注

    0

    文章

    147

    浏览量

    6989
  • 树莓派
    +关注

    关注

    116

    文章

    1706

    浏览量

    105608

原文标题:移植树莓派驱动框架Circle到自制操作系统

文章出处:【微信号:Ithingedu,微信公众号:安芯教育科技】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    为了学习内核开发,大佬手搓了轻量级操作系统YiYiYa OS

    、gpio、i2c、spi驱动系统移植教程 作者本人及团队自制的开源掌机FunKey所采用的操作系统就是基于Linux
    发表于 08-27 10:08

    为了学习内核开发,大佬手搓了轻量级操作系统YiYiYa OS

    作者:evilbinary(鸭佬) YiYiYa操作系统朴实无华的操作系统,追求快速开发,最小实现,同时遵循SOLID原则。编码简洁明了,非常适合学习
    发表于 08-30 14:57

    微内核操作系统在嵌入式平台上的应用

    的功能。而随着微内核(microkernel)操作系统的理论和实现越来越成熟,微内核操作系统开始成为嵌入式平台很好的选择。图1 嵌入式平
    发表于 09-01 13:41

    微内核操作系统有什么好处?

    。可见Windows在内核之上来说的确是很干练的系统。其实这是微软的贯作风,就算是目前我们使用的Win 7旗舰版其
    发表于 01-11 13:11

    实时操作系统移植Linux系统应用

    操作系统一个操作系统应用程序的移植即使在最
    发表于 07-15 07:25

    如何Linux操作系统移植目标平台上?

    如何Linux操作系统移植目标平台上?Linux交叉编译环境的建立及内核配置和编译Linux移植
    发表于 04-22 07:04

    ThreadX内核的IAR方式移植和设计框架

    第6章 ThreadX操作系统移植(IAR)本章节将为大家介绍ThreadX内核的IAR方式移植和设计框架,理论上不建议初学者直接学习,因为
    发表于 08-10 06:47

    基于NET+50 ARM7的DeltaOS操作系统内核移植

             嵌入式实时操作系统内核移植是嵌入式系统开发的瓶颈之
    发表于 09-09 10:33 13次下载

    实时操作系统Linux系统移植

    操作系统一个操作系统应用程序的移植即使在最
    发表于 05-06 10:27 1318次阅读

    微内核操作系统在嵌入式平台上的应用

    微内核操作系统的可靠性、实时性和安全性特点很好得匹配了嵌入式平台对操作系统的需求。所谓嵌入式系统是指为特定应用而设计的专用电脑系统,通常执行的是带有特定要求的预先
    发表于 12-26 11:24 1371次阅读
    <b class='flag-5'>微内核操作系统</b>在嵌入式平台上的应用

    为什么要选择微内核操作系统

    例如原来在宏内核操作系统中,用户应用程序是通过系统调用,陷入内核中,然后再读取、访问文件。而在微内核操
    的头像 发表于 06-03 14:35 4116次阅读

    RT-Thread Smart微内核操作系统发布!

    9月1日,由上海睿赛德电子科技有限公司举办的RT-Thread Smart微内核操作系统发布会于北京圆满落幕,发布会以见微为主题,邀请到中国工程院院士、产业专家、高校教授及行业从业人员100余位莅临
    的头像 发表于 09-09 10:49 2678次阅读

    RT-Thread定义款新形态操作系统——混合微内核操作系统

    RT-Thread Smart开源混合微内核操作系统横空出世,替换智能设备中的Linux! 来源:嵌入式资讯 随着嵌入式系统软件开发复杂度的不断攀升,嵌入式操作系统越来越多地被应用于软件开发。当前
    的头像 发表于 09-10 15:04 3704次阅读

    如何实现微内核操作系统的设计

    设计并实现了运行在Bochs虚拟机上的微内核结构的操作系统, 详细描述了系统中进程管理、进程间通讯、基本内存管理、磁盘服务器以及文件服务
    发表于 11-13 17:28 28次下载
    如何实现<b class='flag-5'>一</b><b class='flag-5'>个</b><b class='flag-5'>微内核操作系统</b>的设计

    睿赛德科技微内核操作系统rt-smart已支持Arm Mali GPU

    睿赛德科技今日宣布,其微内核操作系统 RT-Thread Smart(简称:rt-smart)已支持Arm Mali GPU,为实时操作系统在汽车、消费电子等GUI应用领域提供新的
    的头像 发表于 09-29 10:42 2069次阅读