seL4操作系编程__2014_10_17.docx

  1. 1、本文档共165页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
seL4操作系编程__2014_10_17

seL4操作系统编程2015/71 seL4微内核介绍seL4是一个操作系统微内核,也就是说,seL4本身不是一个完整的操作系统。因为它是微内核,所以它提供很有限的API,没有提供象传统的操作系统Linux那样的内存管理、页内外交换、驱动程序等等。seL4是一组基于微内核架构的操作系统内核,澳大利亚研究组织NICTA.au/创造了一个新的L4版本,称为Secure Embedded L4(简写为seL4),宣布在世界上率先开发出第一个正规机器检测证明(formal machine-checked proof)通用操作系统。seL4微内核设计针对实时应用,可潜在应用于强调安全和关键性任务的领域内,如军用和医疗行业。形式证明在较小的内核中已经实现,但这次是首次在执行复杂任务的操作系统内核中实现。研究发现常用的攻击方法对seL4无效,如恶意程序经常采用的缓存溢出漏洞。seL4是第三代微内核操作系统,它基本是可以说是基于L4的,它提供了虚拟地址空间(virtual address spaces)、线程(threads)、IPC(inter-process communication)受EROS、KeyKOS、CAP等操作系统设计的影响,seL4的控制机制是基于capabilities的, capabilities机制提供了访问内核对象(kernel objects)的方法,这种机制使得seL4与其它L4比起来,显示出一定的高效率。1.1 基础概念1.1 1 内核对象(Kernel Objects)每个内核动态数据结构都表述为内核对象,内核并不为这些内核对象分配内存,seL4一旦起动,内核就不再需要新的内存,所有内存都是在用户态申请的。用户态程序为了申请内存,需要提供原始内存(untypedmemory),内存对象最终存储在这个原始内存中。原始内存无法直接被应用程序访问(access)。1.1.2 句柄(Capabilities)capability概念上类似于句柄(Handle),在操作系统这样的系统软件设计中,有一个可靠性的设计原则,就是下层软件不信任上层软件,而上层软件要无条件信任下层软件。那么,下层软件如何把自己的实现细节隐藏,不让上层软件通过“简单”方法就可以直接操作下层软件的资源呢,句柄是一个常用的设计。一个句柄指向一个内核对象,内核对象也只能通过与其绑定的句柄来操作它,无法直接访问。大多数的内核对象都有方法,用来操作这个对象的数据结构,就象是c++中的封装中的protect数据结构,方法自身可以访问数据结构中的数据,但是,使用这个对象的其它程序,只能通过API与这个对象打交道。举例来说,用户来以通过调用一个原始内存untyped-memory 句柄的invoke方法,用来在这个原始内存上创建内核对象。句柄存储在CNodes中,CNodes本身也是一个内核对象。有些内核对象只有方法,但自身没有什么状态(state)信息,这类对象的目的是为了让应用程序与内核打交道,这类对象没有自身的存储实例。下面泛义地讨论一下什么是句柄?为什么会有句柄?句柄是一个概念,Handler是一个句柄,seL4中的Capability也是一个句柄,打开文件,fopen得到的那个FILE *,open得到的那个int都是句柄。从广义上,能够从一个数值(或数据结构)拎起一大堆数据的东西都可以叫做句柄。句柄的英文是“Handle”,本义就是“柄”,只是在计算机科学中,被特别地翻译成“句柄”,其实还是个“柄”。从一个小东西拎起一大堆东西,这难道不像是个“柄”吗?然后,指针其实也是一种“句柄”,只是由于指针同时拥有更特殊的含义——实实在在地对应内存里的一个地址——所以,通常不把指针说成是“句柄”。但指针也有着能从一个32位的值(在32位硬件平台上)引用到一大堆数据的作用,这不是句柄又是什么?一个操作系统中,可能有许多内核对象(这里的对象不完全等价于“面向对象程序设计”一词中的“对象”,虽然实质上还真差不多),比如打开的文件,创建的线程,程序的窗口,等等。这些重要的对象肯定不是4个字节或者8个字节足以完全描述的,他们拥有大量的属性。为了保存这样一个“对象”的状态,往往需要上百甚至上千字节的内存空间,那么怎么在程序间或程序内部的子过程(函数)之间传递这些数据呢?拖着这成百上千的字节拷贝来拷贝去吗?显然会浪费效率。那么怎么办?当然传递这些对象的首地址是一个办法,但这至少有两个缺点:暴露了内核对象本身,使得程序(而不是操作系统内核)也可以任意地修改对象的内部状态(首地址都知道了,还有什么不能改的?),这显然是操作系统内核所不允许的。上面不是已经介绍过操作系统的可靠性设计原则了吗?操作系统有定期整理内存的责任,如果一些内存整理过一次后,对象被搬走了怎么办?1.1.3 虚

文档评论(0)

quechui388620 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档