Google Magenta Micro-kernel Survey
Posted on 週六 17 六月 2017 in Archive
Introduction
Google設計了一個跨平台的OS Fuchsia (wiki) 他的主要的基礎micro-kernel OS就是Magenta (codebase & doc) 裡面加了很多Security相關的設計
先放重點: - Based on Little Kernel - With user/kernel space - Object-based resource management, syscall --> for security
Security Design
Magenta裡面多加了很多設計以補足LK的安全問題 主要是資源(e.g. memory)的權限管理等 refs: https://fuchsia.googlesource.com/magenta/+/HEAD/docs/concepts.md
Handle & Right
增加Security最主要的設計。 基本概念就是,user-space要去access任何kernel的資源 都不是直接取得某個資源的位置之類的,而是要透過handle 並且在執行某些system call時,檢查這些handle上所帶的權限等資訊 避免user-space去做危險動作(?)
每個Handle上都有Right
訂定可以用該handle做哪些動作
MX_RIGHT_DUPLICATE Allows handle duplication via mx_handle_duplicate
MX_RIGHT_TRANSFER Allows handle transfer via mx_channel_write
MX_RIGHT_READ Allows inspection of object state
Allows reading of data from containers (channels, sockets, VM objects, etc)
MX_RIGHT_WRITE Allows modification of object state
Allows writing of data to containers (channels, sockets, VM objects, etc)
MX_RIGHT_EXECUTE
MX_RIGHT_DEBUG Placeholder for debugger use, pending audit of all rights usage
對同個kernel object可以有多個handle,right可以不同 藉此就可以管理不同應用的資源使用: 有些app只能read, 只有特定app可以write等等 避免惡意攻擊或是bug(?
System call
就像其他OS,Magenta也有system cal來讓user-space使用kernel-space的功能 主要分三種type: - 創造handle的 - 拿handle做事的 - 可以直接使用的(很少
當system call被call的時候,會嚴格檢查handle type, handle rights, process是不是真的有這個handle等
Process & Thread
有支援multi-thread! 這很重要因為Trusty, Trustonic之類的TEE OS都沒有啊哈哈 在某些平台(咳咳...)Single thread就會是效能瓶頸
hierarchy: Job > Process > Thread Job: 規定各項resource的權限,可以有子job Process: 包含在Job內,獨立Virtual address space, data, handles Thread: 包含在Process內,獨立Register & stack
類似Android,一開始會有一個User-Root Job userboot作為第一個user-space process,再由他fork出其他process 他有所有其他app的job object,所以可以fork出其他job
/kernel/lib/magenta/user_thread.cpp
Inter-Process Communication &
Sockets
- Streamming,以bytes為單位
Channel
- Datagram(msg based) 一次固定size read/write。
- 可以傳handle,還會自動reference/dereference
Synchronization
Hmmm 這邊官方文件有點抽像,不過大致上應該要歸類為這兩種方法:
Signal
Thread可以blocking wait某些Object上的Signal 目前最多有32個signal(因為是32-bits),大部分是系統保留使用的,有些可以user自訂 https://fuchsia.googlesource.com/magenta/+/HEAD/docs/generic_signals.md
Event是最基本可以被wait的object
有些object有成對的handle (e.g. channel, socket, fifo, or eventpair 當另一個handle被signal(object_signal_peer的時候,另一端就會被通知
Port
可以一口氣等多個event 並且可以傳送資料payload(Packet) 一邊create port(port_create)之後,可以傳給另一邊 之後就類似event,一邊可以wait(port_wait),另一邊則是enqueue(port_enqueue) packet NOTE: APIs are still changing frequently.
Address Space Management & Shared Memory
每個Process會有一個Virtual Memory Address Regions (VMARs) Object 可以用它來alloc和free某個大小的memory(類似heap) 也可以用來map/unmap別的process傳過來的Virtual Memory Object(VMO) handle Virtual Memory Objects represent a set of physical pages of memory. 除了map/unmap以外,也可以直接用API對VMO讀寫 利用VMO可以實現Shared Memory的機制
和LK的比較
- Magenta has first class user-mode support. LK does not.
- Magenta is an object-handle system. LK does not have either concept.
- Magenta has a capability-based security model. In LK all code is trusted.