devmgr和devhost的关系我们以后再说,今天先看看devmgr的线程有哪些功能。最新的Magenta版本在Qemu上跑起来之后,运行命令“ps -T”后有如下的层次结构:
$ ps -T
TASK PSS PRIVATE SHARED STATE NAME
j:1028 38.5M 37.0M root
p:1043 9894.0k 9892k 28k bin/devmgr
t:1046 blocked bin/devmgr
t:1084 blocked mxio-dispatcher
t:1100 blocked local-multiloader
t:1135 blocked service-starter
j:1075 26.4M 25.7M magenta-drivers
p:1168 430.0k 428k 28k /boot/bin/acpisvc
t:1218 blocked initial-thread
t:1370 blocked thrd_t:0x36b0ee2cfb30/TLS=0x4f8
t:1378 blocked thrd_t:0x36f9fdcb2b30/TLS=0x4f8
p:1539 202.0k 200k 28k devhost:root
t:1563 blocked initial-thread
p:1576 566.0k 564k 28k devhost:misc
t:1599 blocked initial-thread
t:1879 blocked debug-reader
t:1990 blocked i8042-kbd-irq
t:2107 blocked dmctl-multiloader
t:2290 blocked i8042-mouse-irq
p:1719 994.0k 224k 1564k devhost:pci#1:1234:1111
t:1742 blocked initial-thread
p:1781 24.3M 24.3M 28k devhost:pci#3:8086:2922
t:1823 blocked initial-thread
t:1945 blocked ahci-irq
t:1950 blocked ahci-watchdog
t:1955 blocked ahci-worker
j:1087 2456.0k 1672k magenta-services
p:1089 254.0k 252k 28k crashlogger
t:1122 blocked initial-thread
t:1363 blocked self-dump-thread
p:1157 1078.0k 308k 1564k virtual-console
t:1193 blocked initial-thread
p:1198 166.0k 164k 28k netsvc
t:1237 blocked initial-thread
p:2000 226.0k 224k 28k sh:console
t:2052 blocked initial-thread
p:2095 186.0k 184k 28k vc:sh
t:2130 blocked initial-thread
p:2167 186.0k 184k 28k vc:sh
t:2192 blocked initial-thread
p:2229 190.0k 188k 28k vc:sh
t:2254 blocked initial-thread
p:2424 170.0k 168k 28k /boot/bin/ps
t:2457 running initial-thread
j:1088 0B 0B fuchsia
TASK PSS PRIVATE SHARED STATE NAME
其中”j”表示Job,”p”表示Process,”t”表示Thread。可见在root job之下分为4类:
- process“bin/devmgr”: 设备管理
- magenta-drivers job :驱动类别
- magenta-services job :services类别
- fuchsia job : fuchsia的各个job和process
其中进程”bin/devmgr”有4个线程,其作用分列如下:
bin/devmgr
这是主线程,在初始化完毕后,作为daemon线程监听设备事件并处理。主要处理devhost发起的device的add、remove、bind等请求。
在实现上,采用的是监听一个特定的 port对象dc_port,回调处理函数是dc_handle_device。dc_port会监听devhost的请求channel,当依据devhost的请求创建了新的device后,又会监听device的请求channel,以响应deice的操作请求。
回调的对象类型是port_handler_t,包含了回调函数和回调参数。
mxio-dispatcher
也是采用监听port并处理相关事件的方法。主要处理文件的访问,请参见回调函数mxrio_handler和vfs_handler。其文件操作请求来自各个进程。
可参考 Magenta - 文件系统概述。
local-multiloader
在launchpad运行应用或服务时,需要请求loader service去加载文件,此service的初始化见mxio_loader_service。从此函数可见可有3种loader service:
- system loader service:这是全局的loader,由驱动dmctl创建。创建线程”dmctl-multiloader”监听请求。
- 默认的loader “mxio_multiloader_new_service”,会在调用者的进程内创建线程“local-multiloader”;
- 用户自定义的loader “local-custom-loader”,会在调用者的进程内创建线程“”local-custom-loader”;
在”bin/devmgr”发起loader service时,system loader还未加载,所以使用的是默认的“local-multiloader”,此线程利用port监听事件channel,回调函数是multiloader_cb,会调用default_load_object去加载文件。
service-starter
此线程的入口函数是service_starter,在启动一些service之后,作为daemon线程,监听文件夹”/dev/class/block”,如果有新文件出现在此文件夹中,则说明有新的block device增加。调用回调函数block_device_added处理此device,一般是mount此设备。