Magenta: devmgr进程的线程分布

xiaoxiao2021-02-28  69

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此设备。

转载请注明原文地址: https://www.6miu.com/read-73792.html

最新回复(0)