<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Barrelfish 操作系统 on 日日是好日-我的生活记录</title>
    <link>http://www.ririshihaori.com:80/tags/barrelfish-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/</link>
    <description>Recent content in Barrelfish 操作系统 on 日日是好日-我的生活记录</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Mon, 25 Nov 2019 00:23:55 +0800</lastBuildDate>
    <atom:link href="http://www.ririshihaori.com:80/tags/barrelfish-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Barrelfish操作系统 (1)系统介绍 </title>
      <link>http://www.ririshihaori.com:80/posts/2019/11/barrelfish-overview/</link>
      <pubDate>Mon, 25 Nov 2019 00:23:55 +0800</pubDate>
      <guid>http://www.ririshihaori.com:80/posts/2019/11/barrelfish-overview/</guid>
      <description>&lt;p&gt;　　网上貌似没有Barrelfish的中文文档，正好最近在写文献综述，所以这里整理一下，为以后想要研究这个系统的童鞋省一点时间。&lt;/p&gt;&#xA;&lt;h2 id=&#34;简介&#34;&gt;简介&lt;/h2&gt;&#xA;&lt;p&gt;　　Barrelfish是微软剑桥研究院和苏黎世理工大学提出的一个面向异构、众核体系的操作系统，其旨在解决异构、众核体系结构上操作系统的可扩展性问题。系统基于&lt;a href=&#34;https://zh.wikipedia.org/wiki/%E5%BE%AE%E5%85%A7%E6%A0%B8&#34;&gt;微内核&lt;/a&gt;和多内核(Multikernel)的思想设计。      &lt;br&gt;&#xA;　　多内核是指在每一个处理器核心上都运行一个操作系统内核实例，内核之间不共享任何内存（即使在有共享内存的硬件上），系统的其余部分是构建在这些内核之上的单核进程，可以视为一个分布式系统，系统节点之间基于显式的消息进行通信。即共享内存只用于显式的消息传递、数据传递以及动态启动其他内核时。用户级应用进程可以跨核部署并共享地址空间，但这个功能是由Barrelfish用户空间的运行时库提供的。下面是Barrelfish的架构示意图。其中的UMP(User Message Passing)和LMP(Local Message&#xA;Passing)是Barrelfish内的两种消息通信方式，UMP是跨核的消息通信，LMP是核内消息通信。&lt;/p&gt;&#xA;&lt;!-- raw HTML omitted --&gt;&#xA;&lt;!-- raw HTML omitted --&gt;&#xA;&lt;h2 id=&#34;内核cpu-driver&#34;&gt;内核(CPU Driver)&lt;/h2&gt;&#xA;&lt;p&gt;　　CPU Driver是Barrelfish的内核，运行于Barrelfish所运行的机器上的单个处理器核心里，支持多种处理器架构。CPU Driver是单线程、不可抢占的，运行在关中断的模式下。可以认为它在连续地运行异常处理程序，比如中断(interrupt)、异常(fault)、来自用户空间的系统调用(system call)。如果没有可以运行的异常处理程序，它就执行一个用户空间的任务。&lt;/p&gt;&#xA;&lt;p&gt;　　CPU Driver的功能包括:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;负责时钟中断和全部异常，并将其他高级中断转发到用户层&lt;/li&gt;&#xA;&lt;li&gt;调度本核上的所有用户进程(Dispatchers）&lt;/li&gt;&#xA;&lt;li&gt;基于Capabiltiy提供一组最基本的系统调用接口为用户应用和高级系统服务应用提供服务&lt;/li&gt;&#xA;&lt;li&gt;负责本核上的进程间通信&lt;/li&gt;&#xA;&lt;li&gt;对硬件的安全访问(MMU、APIC等等)&lt;/li&gt;&#xA;&lt;li&gt;对内存和内核对象的访问(基于capability(权能)实现)&lt;/li&gt;&#xA;&lt;li&gt;启动初始化过程和调起第一个用户进程&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;CPU Driver提供的系统调用：&lt;/p&gt;&#xA;&lt;!-- raw HTML omitted --&gt;&#xA;&lt;p&gt;　　CPU驱动程序不提供内核线程，原因有二。首先，Barrelfish提供给用户空间程序的处理器抽象是一个dispatcher，而不是线程（一个Dispatcher内可以有多个用户线程）。其次，由于内核是单线程的且不可抢占的，因此它仅为所有操作使用一个静态分配的堆栈。在执行完单个异常处理程序之后，将丢弃并重置此堆栈的内容。&lt;/p&gt;&#xA;&lt;p&gt;　　Barrelfish目前提供两种在编译时指定的调度方式：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;轮转调度(RR)&lt;/li&gt;&#xA;&lt;li&gt;基于速率的最早截止期调度法(rate-based earliest deadline scheduler) (具有更好的实时性)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;进程dispatcher&#34;&gt;进程(Dispatcher)&lt;/h2&gt;&#xA;&lt;p&gt;　　Dispatcher是内核调度的单元，相当于Unix中进程的概念。一个应用程序(在Barrelfish里称为domain)可以分布在多个核上，在每个核上都有一个dispatcher。Dispatcher不能在核间迁移。  &lt;br&gt;&#xA;　　当内核根据调度结果决定运行某一个dispatcher时，内核需要“upcall”该dispatcher，系统从内核态进入用户态，之后与该dispatcher对应的用户级代码开始执行用户空间的线程调度，以及处理其他事件（比如来自内核的缺页错误、或者Domain间消息）。  &lt;br&gt;&#xA;　　内核为每个dispatcher维护一个DCB (dispatcher控制块)，如图所示，DCB里面包含了这个dispatcher的各种信息，包括&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;CSpace（Capability空间，即所拥有的所有Capabiltiy，在内核中的形式是一个二级capability查询表）&lt;/li&gt;&#xA;&lt;li&gt;VSpace（页表，以vode类型的capability形式实现）&lt;/li&gt;&#xA;&lt;li&gt;一些调度参数&lt;/li&gt;&#xA;&lt;li&gt;指向用户空间dispacher结构体的指针（用于调度dispatcher内部的线程）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;!-- raw HTML omitted --&gt;&#xA;&lt;p&gt;　　每一个dispatcher可以有两种模式，分别是enabled和disabled，当处于enabled模式下时，该dispatcher运行dispatcher下的用户线程，当处于disabled模式下时，该dispatcher运行dispatcher自身代码（如管理TCB、运行线程队列中的线程）。     &lt;br&gt;&#xA;　　Dispatcher定义了一组upcall的接口，以供内核对自身进行调度。其中最主要的upcall是run()，当内核决定调度某个dispatcher时，它以指向该dispatcher的页表基址的capability为参数调用该dispatcher的run()，然后该dispatcher决定运行哪一个用户线程，恢复该线程的状态，并运行该线程。在dispatcher被run()之后，以及用户线程被执行之前，该dispatcher都是disable模式，在用户线程开始运行后，该dispatcher处于enabled模式。 &lt;br&gt;&#xA;　　当处于enabled模式下的disaptcher被抢占时，内核把所有寄存器状态存在该dispatcher的“enabled区域”（见上图），当该dispatcher之后重新被调度时，它可以从enabled区域恢复之前的寄存器状态，继续运行之前的用户线程，也可以调度另外一个用户线程来运行，但在执行另外一个用户线程之前必须先把之前的用户线程的寄存器状态存到TCB里。  &lt;br&gt;&#xA;　　当处于disabled模式下的dispatcher被抢占时，内核把所有寄存器状态存在该dispatcher的“disabled区域”（见上图）,当内核调度一个处于disabled模式下的dispatcher时，内核不会调用其run()类型的upcall，而是从disabled区域恢复之前的寄存器状态，允许之前被打断的dispatcher自身代码从被抢占处继续运行。&lt;/p&gt;&#xA;&lt;h2 id=&#34;运行时库runtime-library&#34;&gt;运行时库(Runtime library)&lt;/h2&gt;&#xA;&lt;p&gt;　　Barrelfish提供两个基本的库:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;标准C库&lt;/li&gt;&#xA;&lt;li&gt;lib barrelfish&#xA;　&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;　　后者实现了以下系统功能:&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
