Magenta: devmgr进程的线程分布

来源:互联网 发布:qq三国活力涨不停算法 编辑:程序博客网 时间:2024/06/04 19:18

devmgr和devhost的关系我们以后再说,今天先看看devmgr的线程有哪些功能。最新的Magenta版本在Qemu上跑起来之后,运行命令“ps -T”后有如下的层次结构:

$ ps -TTASK             PSS PRIVATE  SHARED   STATE NAMEj: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                 fuchsiaTASK             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此设备。

原创粉丝点击