Magenta
来源:互联网 发布:淘宝个性主题 编辑:程序博客网 时间:2024/06/05 05:08
Magenta是按照微内核的思路打造的,但不同于学院派的微内核,看上去没那么美,走的是一条实用化的道路。
本想自己写点东西,但magenta自带的文档已经挺完善,以下的内容的一部分来自对文档的引用。
Magenta - 概述
基于微内核的特性,Magenta只负责管理如下资源:
- scheduler,继承自LK并增强;
- 中断,处理(一部分,另一部分可在user space处理)
- memory space
- Handles,句柄管理
- object,对象管理
其他关键的的OS元素,比如文件系统、驱动等等,在user space实现。
有些微内核只负责schedule和object管理,从这点看,magenta并不那么纯粹。
Magenta是基于object的kernel,将各种资源以object的方式组织,并以Handle的方式提供给user。user从而可以通过Handle访问并操作object;kernel负责object的生命周期管理。
下图是用户句柄、kernel句柄和object的关系的一个简单表示。
| handleuser-space |------------------------------ sys-callkernel-space | +++ + ========== | Handle | ========== | +++ + ========== | Object | ==========
user handle
定义为
typedef int32_t mx_handle_t;
可见是32bit的整形变量。代表在process中,对kernel Handle 的索引。
user handle只在本process内有效。同样的user handle value,在其他process中,或指向另一个object,或就是无效的索引。
kernel Handle
定义为
class Handle final : public mxtl::DoublyLinkedListable<Handle*> { 。。。}
在kernel中,接收到user handle后,将此32bit的变量移位、计算后,可得到Handle一个实例的基地址,从而可得到一个Handle。可见user handle和kernel Handle是一一对应的。
Handle中保存着如下成员:
* dispatcher_, 指向object的指针* rights_, 访问object所需权限* process_id_, 所属process的ID* base_value_, 本Handle的基地址
kernel会检查当前process是否有权限可以访问此Handle;是否有权限可以访问此Handle指向的Object。
不是所有的kernel Handle,对user都是可见的。当kernel Handle处于in-transit状态时,此Handle对user不可见。此种情况一般发生在handle转移时。举例如下:
- 当A process想将1个Handle 传递给B process,A process调用 mx_channel_write , 并以1个user handle为参数。
- kernel接收到此handle后,将其转换为kernel Handle, 将 process_id_ 赋值为0,表示此Handle和kernel绑定,不在属于A Process, 处于in-transit状态;最后将Handle从A Process的Handle space中去除。此时此Handle对A process和B Process的user都是不可见的。
- B Process调用 mx_channel_read 后,kernel会将此Handle映射至B Process的Handle space,且process_id_ 重新赋值为B Process的ID。此时,此handle对B Process的user可见。
- 如果在B Process调用mx_channel_read 之前, A Process就关闭了此channel,则此Handle也自动关闭。
Object
Object在实现上,都会继承Class Dispatcher,从而所有的object实例都有统一的header。此header记录object的ID、被Handle引用的次数、object类型、object name等等。利用Handle得到object后,可从header查询到object的info,从而可以判断Handle是否是合法的访问此object。
object本身是不带任何security信息的,即默认可以被任意访问。 user的访问权限,是在Handle中做的检查。一个进程的2个带不同的权限的Handle是可以指向同一个object。
object的生命周期和其被引用的次数有关。当object被创建时,有1个Handle指向此object,则其被引用次数为1; 当后期有其他Handle也指向此object,则其被引用次数+1。当Handle被关闭时,object的被引用次数-1;当被引用次数达到0时,此object自动被释放。
当1个Handle有效时,其指向的object也肯定有效;而当Handle关闭时,其指向的object不一定也被关闭,因为其他Handle或kernel code仍在引用此object。
Magenta是围绕着object运转的,object可分为2大类:面向App和面向driver。
面向App的object
1/ 用于执行code
* Job* Process* Thread* Task
Thread属于Process;Process属于Job。而Task是对3者的统称。在user可使用Task相关的sys-call控制Thread/Process/Job。
2/ 用于传递消息和数据
* Socket* Channel* Fifo
3/ 事件通知
* Event* Event pair* Futext
4/ Waiting
* WaitSet* Port
5/ 虚拟内存管理
* VMO, Virtual Memory Object* VMAR,Virtual Memory Address Region
面向driver的object
* Interrupt request* Resource* Log
Devmgr和Devhost
如果magenta只有1个裸核的话,那毫无用处。完整的系统,缺一不可。所以在user space实现了设备管理(Devmgr)和驱动管理(Devhost)。
下一次从userboot开始讲起。
- Magenta
- Magenta
- Magenta
- Magenta
- Magenta
- Magenta
- Magenta
- 编译Magenta
- Magenta Demos Magenta 实战代码
- Magenta- Qemu + bootloader
- Magenta- 支持虚拟化
- 安装 magenta 失败:rtmidi
- Fuchsia使用的内核Magenta
- Magenta与LK的关系
- 在qemu中运行magenta
- Magenta: devmgr进程的线程分布
- 树莓派3上运行Fuchsia/Magenta OS
- Magenta源代码笔记(3) —— 内存管理
- 论文阅读:Touching Tooth Segmentation from CT Image Sequences Using Coupled Level Set Method
- RecyclerView+OkHttp展示网络数据
- 对应用程序启动时所有方法的调用顺序分析
- JavaScript内置对象Array的扩展(去重,排序,合并)
- Java读取一行空格隔开的数字字符串并求出这些数字的和
- Magenta
- NLP︱中文分词技术小结、几大分词引擎的介绍与比较
- hadoop中Partitioner、WritableComparator的自己总结
- 使用IPVS实现Kubernetes入口流量负载均衡
- 文章标题
- 20170416_后台开发_腾讯一面
- 网络层核心:路由和路由生成算法
- ADO教程(执行带参数存储过程)
- 数据库函数用法