搜索
当前位置: 678彩票官网 > 低级互斥 >

如何写一个微内核

gecimao 发表于 2019-05-01 09:35 | 查看: | 回复:

  有时常关注我博客的朋友知道,去年我自己开发过一个很简单的微内核 Totoro,目前已经暂时停止更新。从开发到能真正运行花了一两个月的时间,当然都是我在业余时间做的啦。还记得当时那种兴奋的心情,可能跟 Linux 的最初开发者 Linus 差不多,有兴趣可以看这篇文章 Linux - a free unix-386 kernel 。

  当然了,水平毕竟不是一个层次的。不过今天,我想把如何开发这样一个简单的内核给记录下来,一来是让有兴趣的后来者可以很快的摸到门路,二来是做一个阶段性的总结,再来就是看看自己还有没有兴致继续把它做得更好,毕竟现在漏洞百出,也不可能给别人拿去用。总的来说,出来做了三年的软件开发,没做过什么高端的有难度的东西,这样一个作品让我自己还是比较开心的!

  从单片机(又称单板机)玩过来的同学应该知道,我们刚开始写代码的时候,几乎都是裸奔在处理器上的。写个流水灯,点亮数码管,高端点的来个串口打印。这对刚接触的同学其实就有很多东西可以学了。但是人也总不会一直停步不前,写了太多的单线程代码的菜鸟开始思考,多线程到底多了什么了呀?说到这其实我很想笑,假如你去问一问那些入门语言是 Java,Python 的同学,他们一定会说,多线程有什么了不起啊!对呀,对这些这些高级语言来说,多线程?开玩笑,随便调个接口,要几十个线程,甚至几百个,分分钟给你造好了。在这些人眼里,这个东西,没什么了不起。但对于出身即低端又比较吝啬的嵌入式的同学们来说,这个多线程词汇,却魔咒般的充满了太多的神秘感。那么多线程到底指的是什么?我们不去讨论太复杂的东西,不去讨论进程空间,虚拟内存等等高端神秘的词汇。我们只关注上下文环境。这个对于容易满足的嵌入式开发者来说,以及很知足了。时常感慨,是不是嵌入式开发做久了,人也会对自己变吝啬。

  上下文(Context)环境,指的是这个线程运行时的一些状态,比如局部变量的值,寄存器里保存的值,比如,PC 指针指向那里,代表程序即将运行到那里,SP 指针,记录了调用信息,LR 记录了回去的路(返回地址)等等。那么要实现这个多线程我们需要做些什么?

  保存上下文。我们在做线程调度的时候,将当前线程的上下文环境保存在那个线程申请的“栈”内存里(其实就是一个大数组)。然后通过一系列的底层操作,将要被调度的线程唤出来。其实也就是把之前保存的上下文从内存里读到寄存器上啦,只不过这个过程需要一些技巧,我们会在代码解析里面讲到。其实多线程就是这样的啦,那么我的这篇文章是不是该完结了?不尽然,我们要做到微内核的基本功能,那还得有调度器呀。

  我们要实现这样一个调度器。对于平级线程,也就是优先级一样的应用线程,我们会去分片(Time-sharing)执行它们。对于高优先级应用线程,我们会义无反顾的一直执行它,直到它愿意自己挂起。我觉得这是最自然的调度器,因为优先级既然高,那么也就得优先执行。当然,也是很傻逼的调度器啦。我们现在的目标是,保持一切尽量的简单。这样才有兴趣继续干下去嘛。这样约定好了以后,我们开辟了两个队列,一个用于保存处于准备态的线程,一个用于保存挂起的线程。而当前运行的进程会由一个 current 任务结构体指针来标记。所以一个任务执行完之后会有两种状态,一个是挂起,一个是再次处于准备状态。这样我们就需要一个链表接口模块。

  这个接口做任务迁移,将挂起任务迁移到准备态或者反过来。注意到,我们采用了二级指针来管理这个单链表,这样可以省掉很多不必要的条件判断。

  看到这里,聪明的同学一定能看到了,我都帮你们注释好了每个成员的作用,因此也不赘述,大家如果看了代码应该不难发现,大部分关键的地方都 加上了注释。

  对的,我们实现了两个漂亮的宏来做任务结构体内存申请和释放,史上最小的 MM。

  这份代码是从 GCC 分支拷贝下来的,没有一行注释,大家可以去看 ARM 分支里面的同一个文件,写全了注释,我这个人很懒,不喜欢写太多注释。 以换行为分界,这段代码有六段。

  1,关全局中断,保存程序栈指针,调整栈指针,保存当前线,保存当前运行线,加载即将运行线,加载即将运行线,恢复程序栈指针;

  等等,一个内核最基本的东西是什么?很明显,它需要线程切换,肯定也要一个线程同步机制啦。我们根据 POSIX 规范的接口实现了这样一个模块。

  大家看名字就知道干嘛用的。我们也不再贴代码了,要玩就自己去看了。好的,整个微内核玩下来就是这么个流程。说简单也很简单,但要一步一步自 己做起来,还是需要花时间,耐心。我们现在只注重优雅的实现,简单,漂亮。

  终于来到了个人时间了,大家有这样的感觉吗,看自己以前写的代码,竟然感觉很美妙。特别是用 plain text 模式浏览的时候,我仿佛在查阅某 上世纪大神写出来的神作。呵呵,开个玩笑。好了,这篇文章差不多就这样了,未来会怎样,我暂时也没什么想法。

  微内核:提供操作系统核心功能的内核的精简版本,它设计成在很小的内存空间内增加移植性,提供模块化设计,以使用户安装不同的接口与,如DOS、WorkplaceOS、WorkplaceUnix等。IBM、M...博文来自:

  浅谈微内核微内核是什么谈到微内核,其实是与宏内核相比所称为微内核。宏内核大家应该再熟悉不过了,也称为集成式核心、单体式核心。像Linux就是典型的宏内核,它除了时钟中断、进程创建与销毁、进程调度、进程...博文来自:

  单体内核:大内核,将OS的全部功能都做进内核中,包括调度、文件系统、网络、设备驱动器、存储管理。比如设备驱动管理、资源分配、进程间通信、进程间切换管理、文件系统、存储管理、网络等。单体内核是指在一大块...博文来自:

  操作系统内核可能是微内核,也可能是单内核(后者有时称之为宏内核Macrokernel)。按照类似封装的形式,这些术语定义如下:单内核:也称为宏内核。将内核从整体上作为一个大过程实现,并同时运行在一个单...博文来自:

  MCU的微内核,如ucos-ii在编译的时候已经确认了所有的Task的代码段,堆栈段,常量端等等而且这些端都是直接和物理地址绑定,这里可以称之为编译物理地址绑定这样就会产生一个问题,如:我先开发一个L...博文

  微内核源自操作系统设计,例如“Linusvs.Tanenbaum微内核论战”。就像许多编程语言、框架从操作系统设计中借鉴技术一样,JBoss和Spring中也有微内核的概念。JBoss中的microk...博文来自:

  为什么需要插件化系统“编程就是构建一个一个自己的小积木,然后用自己的小积木搭建大系统”。但...博文来自:

  1微内核和宏内核的差异微内核在我理解是一种宏内核的精简版,它将所有可以不在内核实现的功能都移出内核,同时将移出内核的系统服务变成独立的过程,内核、系统服务和软件之间可以通过IPC进行通信,模块化程度更...博文来自:

  操作系统的体系结构是一个开放的问题。正如上文所述,操作系统在核心态为应用程序提供公共的服务,那么操作系统在核心态应该提供什么服务、怎样提供服务?有关这个问题的回答形成了两种主要的体系结构:大内核和微内...博文来自:

  在网上看到这段代码,所以自己尝试了,可以跑起来,但是没有精确的定时功能,仅仅是任务的调度而已。数组中是11,而不是12。这里写错了。。。/*简单的多任务操作系统其实只有个任务调度切换,把说它是OS有...博文来自:

  你好,这里是风筝的博客,欢迎和我一起交流。上一章自编STM32轻量级操作系统(一)------操作系统实现 讲了那么多,终于到了实战环节。现在来开始动手码程序。根据之前分析的,我们先写下分析流程:上帝...博文来自:

  从零开始学习UCOSII操作系统15--总结篇前言:在大学的时候,我们班级上面都有很多人觉得学习UCOSII(包括UCOSIII)是没什么厉害的,因为很多人都喜欢去学习Linux操作系统,但是,但是,...博文来自:

  1、注意:任务函数内部定义局部变量的内存大小不能大于此任务堆栈内存的大小。2、FreeRTOS定义任务优先级时,0优先级(空闲中断占用)和最高优先级31级(定时器占用)不能用。3、用start_tas...博文来自:

  在写完面向对象的单片机编程,就特别想在单片机编程引入一个多线程多任务的编程,把这个思想引入单片机。后发现如下好文,后面再把它封装成类的话,就更方便使用了,我觉得这将会使很多只有操作系统能做的工作,普通...博文来自:

  微内核技术与QNX实时操作系统李林 一、QNX和微内核QNX实时操作系统是一个基于微内核概念设计的、符合POSIX1003.13标准的多任务多用户系统,其内核只有8K字节,可装入486芯片的在片高...博文来自:

  越大的系统潜在的bug就越多,所以微内核在减少bug方面很有优势,seL4是世界上最小的内核之一。如今,安全越来越成为一个新兴嵌入式设备的关键要素,如智能手机。...博文

  单内核:设计简单,把内核从整体上作为一个单独的大的过程来实现,内核所有服务都运行在同一地址空间,内核可以直接调用函数,就好像用户空间的应用程序一样。微内核:依据功能划分为多个独立的过程,每个过程叫做一...博文来自:

  微内核架构模式(有时被称为插件架构模式)是实现基于产品应用程序的一种自然模式。基于产品的应用程序是已经打包好并且拥有不同版本,可作为第三方插件下载的。然后,很多公司也在开发、发布自己内部商业应用像有版...博文来自:

  单内核是个很大的进程。它的内部又能够被分为若干模块(或是层次或其他)。但是在运行的时候,他是个单独的二进制大映象。其模块间的通讯是通过直接调用其他模块中的函数实现的,而不是消息传递。在运行效率上,单内...博文来自:

  把操作系统中更多的成分和功能放到更高的层次(即用户模式)中去运行,而留下一个尽量小的内核,用它来完成操作系统最基本的核心功能,称这种技术为微内核技术。在微内核中通常提供了进程/线程管理 低级存储器管理...博文来自:

  正好在做相关的项目,就把知道的说说,程序猿的一大特点就是说话不利索,将就着看。CPU指令集取决于CPU的体系架构,目前主流的就是两类,ARM和X86,其他的也有,当然非主流。指令集上有啥不一样呢,小例...博文来自:

  嵌入式处理器的体系架构与内核详解当我们谈及嵌入式处理器的体系架构时,一般都是想到Intel的X86架构和ARM公司的ARM架构。X86架构和ARM架构最大的不同点就是使用的指令集不同,前者使用的CIS...博文来自:

  写本篇主要是用来后面写一篇可扩展性软件设计打好基础。[b]微内核定义:[/b]微内核是内核的一种精简形式。将通常与内核集成在一起的系统服务层被分离出来,变成可以根据需求加入选件这样就可提供更好的可扩展...博文来自:

  版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明:什么是微内核?A:微内核结构由一个非常简单的...博文来自:

  我发现我一直是一个后知后觉的人。不知道是心里的浮躁还是自己脑子小装不下那么多知识。不过幸好我还是一个善于思考的人。现在重新想到了要区分一下这两个概念。也不至于稀里糊涂的过着。了解了如下的问题之后更有利...博文来自:

  银行家算法(Banker’sAlgorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略...博文来自:

  微内核和单内核      Linux大部分都是单内核的操作系统内核可能是微内核,也可能是单内核(后者有时称之为宏内核Macrokernel)。按照类似封装的形式,这些术语定义如下:l微内核(M...博文来自:

  微内核架构(MicrokernelArchitecture),也被成为插件化架构(Plug-inArchitecture),是一种面向功能进行拆分的可扩展性架构,通常用于实现基于产品(原文为produ...博文来自:

  Q:什么是微内核?A:微内核结构由一个非常简单的硬件抽象层和一组比较关键的原语或系统调用组成,这些原语仅仅包括了建立一个系统必需的几个部分,如线程管理,地址空间和进程间通信等。微核的目标是将系统服务的...博文来自:

  1、内核概述Kernel是OS的核心,提供了硬件级的抽象,它向外部提供了对计算机设备的核心管理调用。我们将操作系统的代码分成2部分。内核所在的地址空间称作内核空间。而在内核以外的统称为外部管理程序,它...博文来自:

  死锁的定义   如果一组进程中的每一个进程都在等待仅由该组进程中的其他进程才能引发的事件,那仫该组进程就是死锁的.产生死锁的必要条件   1).互斥条件:进程对所分配到的资源进行排它性使用,即在一...博文来自:

  举个例子,起初硬盘某个分区是空白的,写入三个文件A、B和C。显然这个时候,三个文件都是顺次占用三个簇段(这个说明存放文件所用的文件系统应该是类似FAT这样的文件系统,具体参看注释1)。故而三个文件不会...博文来自:

  微内核与第二代微内核 第一代微内核 微内核的概念是由RichardRashid在卡内基梅隆(Carnegie-Mellon)大学开发Mach操作系统时提出的,目标是建立一个基于消息传送(message...博文来自:

  在搜索rtos相关资料时候,无意中在知乎论坛上看到一片“写一个操作系统内核有多难?大概的内容、步骤是什么?”的文章,感触颇深。自己现有的技术远远不能达到这种水平,欠缺的技术甚多,需要弥补的比较多。为深...博文来自:

  转自:【IT168评论】说到操作系统,大家可能不会陌生,在桌面操作系统中经常...博文来自:

  程序语言并不和自然语言有联系,而是另外一种独立的符号系统。「别人都是用英文编程的」这个概念是错误的,程序语言就是程序语言。对于编译器来说,语义分析本质上是一个数学过程,使用什么关键字都不影响分析过程。...博文来自:

  微内核(Microkernel)是提供操作系统核心功能的内核的精简版本,它设计成在很小的内存空间内增加移植性,提供模块化设计,以使用户安装不同的接口,如LUNIX、DOS、WorkplaceOS、Wo...博文来自:

  帐号相关流程注册范围 企业 政府 媒体 其他组织换句话讲就是不让个人开发者注册。 :)填写企业信息不能使用和之前的公众号账户相同的邮箱,也就是说小程序是和微信公众号一个层级的。填写公司机构信息,对公账...博文来自:

  layer弹窗插件官方API并没有给出图标和按钮同时改变的写法,今天我硬是给试出来了,我自己都怕自己。 代码如下:firm(进行实名认证,{icon:3,btn:[实名认...博文来自:

  本篇文章是根据我的上篇博客,给出的改进版,由于时间有限,仅做了一个简单的优化。相关文章:将excel导入数据库2018年4月1日,新增下载地址链接:点击打开源码下载地址十分抱歉,这个链接地址没有在这篇...博文来自:

  看到很多朋友配置vsftpd时不能使用匿名用户上传和下载(创建目录或删除、重命名文件夹),本文主要解决vsftpd的匿名用户权限配制问题。...博文来自:

  最近比较有空,大四出来实习几个月了,作为实习狗的我,被叫去研究Docker了,汗汗! Docker的三大核心概念:镜像、容器、仓库 镜像:类似虚拟机的镜像、用俗话说就是安装文件。 容器:类似一个轻量...博文来自:

  webService学习(二)—— 调用自定义对象参数 本文主要内容: 1、如何通过idea进行webService Client的简单实现(不再使用wsimport的方式,其实是ide帮我们做了...博文来自:

  为了把现实中的数学公式利用到计算机里面,所以在库中已经实现了很多数学函数的代码,我们直接调用就可以了! 用的时候需要加入头文件#include 或者#include   using name...博文来自:

  一、组合模式适用场景把部分和整体的关系用树形结构来表示,从而使客户端可以使用统一的方式对部分对象和整体对象进行管理。二、组合模式结构 抽象构件(Conponent)角色:所有类的共有接口,定义了叶子和...博文来自:

  一、Window简介 (1)Window表示一个窗口的概念,一般用不到,当在某些特殊的时候我们需要在桌面上显示一个类似悬浮窗的东西就需要Window来实现。 (2)Window是一个抽象类...博文来自:

  Java中的ThreadLocal类允许我们创建只能被同一个线程读写的变量。因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个线程同时执行这段代码,它们也无法访问到对方的Thread...博文来自:

  强连通分量: 简言之 就是找环(每条边只走一次,两两可达) 孤立的一个点也是一个连通分量   使用tarjan算法 在嵌套的多个环中优先得到最大环( 最小环就是每个孤立点)   定义: int Ti...博文来自:

  安装oracle 9i后,居然把刚刚更改的数据库管理员密码给忘了,又不重新安装,太麻烦了,试了好久,终于修改成功了。1、运行到C盘根目录2、输入:SET ORACLE_SID = 你的SID名称3、输...博文来自:

  2016 SWPU比赛结束了,但是web7还是有点没有搞太懂,于是根据官方的wp来复现了一下,官方的wp地址:首先搭建...博文来自:

  SQL Server查询和检索操作。 一道例题学会查询和检索操作: 1、在SQL SERVER 2008上附加teaching数据库,其中三张表的含义解释如下: 学生表dbo...博文来自:

  jquery/js实现一个网页同时调用多个倒计时(最新的) 最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦! //js ...博文来自:

  三菱FX系列PLC与PC通讯的实现之专有协议(计算机联接)的程序设计之一

  阅读内容为:FX系列微型可编程控制器用户手册(通讯篇)中计算机链接功能章节。 采用本方法通信,pc端的实现,其实就是,把操作按照协议(2种)翻译成相应的字符串,通过串口发送给plc。 编写一应用程...博文来自:

本文链接:http://windsorflowers.net/dijihuchi/173.html
随机为您推荐歌词

联系我们 | 关于我们 | 网友投稿 | 版权声明 | 广告服务 | 站点统计 | 网站地图

版权声明:本站资源均来自互联网,如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

Copyright @ 2012-2013 织梦猫 版权所有  Powered by Dedecms 5.7
渝ICP备10013703号  

回顶部