您尚未登录。

楼主 #1 2018-11-06 14:35:19

晕哥
管理员
注册时间: 2017-09-06
已发帖子: 9,342
积分: 9202

camdroid 下的 "不死" 进程 vold 如何实现的?

root@camdroid:/ # kill 171
[  784.291790] init: waitpid returned pid 171, status = 0000000f
root@camdroid:/ # [  784.300328] init: process 'vold', pid 171 exited
[  784.307033] init: process 'vold' killing any children in process group
[  784.320106] init: starting 'vold'
[  784.325261] init: Created socket '/dev/socket/vold' with mode '660', user '0', group '1009'

杀死 vold 之后, 又重新建立了一个





离线

楼主 #2 2018-11-06 14:49:07

晕哥
管理员
注册时间: 2017-09-06
已发帖子: 9,342
积分: 9202

Re: camdroid 下的 "不死" 进程 vold 如何实现的?

看了一下, vold 的 PPID 是 /init 进程

root@camdroid:/ # ps
USER     PID   PPID  VSIZE  RSS     WCHAN    PC         NAME
root      1     0     312    180   c0031a80 0001a398 S /init
root      2     0     0      0     c0046c08 00000000 S kthreadd
root      3     2     0      0     c0033d74 00000000 S ksoftirqd/0
root      6     2     0      0     c004265c 00000000 S khelper
root      7     2     0      0     c01a19c0 00000000 S kdevtmpfs
root      8     2     0      0     c007df88 00000000 S sync_supers
root      9     2     0      0     c007ecdc 00000000 S bdi-default
root      10    2     0      0     c004265c 00000000 S kblockd
root      11    2     0      0     c0198044 00000000 S sytem
root      12    2     0      0     c01de184 00000000 S khubd
root      14    2     0      0     c004265c 00000000 S cfg80211
root      16    2     0      0     c006494c 00000000 S khungtaskd
root      17    2     0      0     c0079924 00000000 S kswapd0
root      18    2     0      0     c00c1c20 00000000 S fsnotify_mark
root      19    2     0      0     c0043260 00000000 S kworker/u:1
root      28    2     0      0     c004265c 00000000 S SunxiDisCommit
root      29    2     0      0     c004265c 00000000 S Sunxi_WB
root      30    2     0      0     c019493c 00000000 S kapmd
root      31    2     0      0     c004265c 00000000 S spi.0
root      36    2     0      0     c01c4414 00000000 S mtdblock0
root      37    2     0      0     c01c4414 00000000 S mtdblock1
root      38    2     0      0     c01c4414 00000000 S mtdblock2
root      39    2     0      0     c01c4414 00000000 S mtdblock3
root      40    2     0      0     c01c4414 00000000 S mtdblock4
root      41    2     0      0     c01c4414 00000000 S mtdblock5
root      42    2     0      0     c01c4414 00000000 S mtdblock6
root      43    2     0      0     c01c4414 00000000 S mtdblock7
root      50    2     0      0     c004265c 00000000 S f_mtp
root      51    2     0      0     c01ff924 00000000 S file-storage
root      52    2     0      0     c025e17c 00000000 S cfinteractive
root      53    2     0      0     c004265c 00000000 S binder
root      54    2     0      0     c004265c 00000000 S switch_resume
root      55    2     0      0     c004265c 00000000 S codec_init
root      56    2     0      0     c004265c 00000000 S deferwq
root      59    1     348    188   c00a1044 0000efd8 S /sbin/ueventd
root      60    1     392    240   c00a1044 0000efd8 S /init
root      61    2     0      0     c00f6cdc 00000000 S jffs2_gcd_mtd3
root      63    2     0      0     c004265c 00000000 S sw_wq
system    64    60    888    320   c02869fc 400f20d8 S /system/bin/servicemanager
root      66    60    38092  3832  ffffffff 400df0d8 S /system/bin/mediaserver
root      68    60    22260  4452  ffffffff 40156260 S /system/bin/ccdr
root      69    60    3448   180   ffffffff 000160cc S /sbin/adbd
root      70    60    932    388   c02be3b8 400d5b88 S /system/bin/debuggerd
root      71    60    4300   1604  ffffffff 4013f0d8 S /system/bin/standbyservice
root      75    60    820    476   c0012d74 40137a64 S /system/bin/sh
root      267   2     0      0     c0043260 00000000 S kworker/0:0
root      278   2     0      0     c0043260 00000000 S kworker/u:2
root      423   60    3784   736   ffffffff 40142884 S /system/bin/vold
root      484   2     0      0     c0043260 00000000 S kworker/0:2
root      584   2     0      0     c0043260 00000000 S kworker/0:1
root      585   2     0      0     c00afd2c 00000000 S flush-mtd-unmap
root      812   75    1104   404   00000000 40118e68 R ps





离线

楼主 #3 2018-11-06 14:51:51

晕哥
管理员
注册时间: 2017-09-06
已发帖子: 9,342
积分: 9202

Re: camdroid 下的 "不死" 进程 vold 如何实现的?

grep 搜了一下整个 camdroid 的开发目录,

vold 的启动位置在这里

camdroid/out/target/product/tiger-cdr/root/init.rc

# Copyright (C) 2012 The Android Open Source Project
#
# IMPORTANT: Do not create world writable files or directories.
# This is a common source of Android security bugs.
#

import /init.${ro.hardware}.rc

on early-init
    # Set init and its forked children's oom_adj.
    start ueventd

on early-fs

# create mountpoints
    mkdir /mnt 0775 root root
    mkdir /mnt/sdcard 0755 root root
    mkdir /mnt/extsd 0755 root root

on init

sysclktz 0

loglevel 6

# setup the global environment
    export PATH /sbin:/system/bin:/system/xbin
    export LD_LIBRARY_PATH /system/lib
    export ANDROID_ROOT /system
    export ANDROID_DATA /data

# Backward compatibility
    symlink /system/etc /etc
    symlink /sys/kernel/debug /d

# Right now vendor lives on the same filesystem as system,
# but someday that may change.
    symlink /system/vendor /vendor

    mkdir /system 0777 root root
    mkdir /data 0777 root root
    mkdir /data/camera 0777 root root
    mkdir /system/etc/hawkview 0777 root root

on fs
# mount mtd partitions
# Mount /system rw first to give the filesystem a chance to save a checkpoint
    wait /dev/block/mtdblock2
    setupfs /dev/block/mtdblock2
    mount squashfs /dev/block/mtdblock2 /system

    wait /dev/block/mtdblock3
    mount jffs2 /dev/block/mtdblock3 /data

on post-fs
   mount rootfs rootfs / shared rec


on post-fs-data
    # We chown/chmod /data again so because mount is run as root + defaults
    chown compass compass /data
    chmod 0771 /data
    chmod 0771 /data/camera
    mkdir /data/property 0700 root root
    # We restorecon /data in case the userdata partition has been reset.
    restorecon /data
    mkdir /data/misc 01771 system misc
    mkdir /data/local 0751 root root

on boot
#   basic network init
    ifup lo
    hostname localhost
    domainname localdomain

# set RLIMIT_NICE to allow priorities from 19 to -20
    setrlimit 13 40 40

# Memory management.  Basic kernel parameters, and allow the high
# level system server to be able to adjust the kernel OOM driver
# parameters to match how it is managing things.

    chown root radio /proc/cmdline

    class_start core
    class_start main

on nonencrypted
    class_start late_start

## Daemon processes to be run by init.
##
service ueventd /sbin/ueventd
    class core
    critical


service console /system/bin/sh
    class core
    disabled
    console
    user root
    group log

on property:ro.debuggable=1
    start console

service servicemanager /system/bin/servicemanager
    class core
    user system
    group system
    critical

# adbd is controlled via property triggers in init.<platform>.usb.rc

service vold /system/bin/vold
    class core
    socket vold stream 0660 root mount
    ioprio be 2

service debuggerd /system/bin/debuggerd
    class main
    disabled

service media  /system/bin/mediaserver
    class core
    root media
    group audio camera  drmrpc mediadrm
    ioprio rt 4




离线

楼主 #4 2018-11-06 14:53:08

晕哥
管理员
注册时间: 2017-09-06
已发帖子: 9,342
积分: 9202

Re: camdroid 下的 "不死" 进程 vold 如何实现的?

接着搜了一下 android 的 init.rc 脚本规范:  https://blog.csdn.net/nokiaguy/article/details/9109491

init.rc文件并不是普通的配置文件,而是由一种被称为“Android初始化语言”(Android Init Language,这里简称为AIL)的脚本写成的文件。在了解init如何解析init.rc文件之前,先了解AIL非常必要,否则机械地分析init.c及其相关文件的源代码毫无意义。

     为了学习AIL,读者可以到自己Android手机的根目录寻找init.rc文件,最好下载到本地以便查看,如果有编译好的Android源代码,在<Android源代码根目录>out/target/product/generic/root目录也可找到init.rc文件。

AIL由如下4部分组成。

1.  动作(Actions)
2.  命令(Commands)
3. 服务(Services)
4.  选项(Options)





离线

楼主 #5 2018-11-06 15:11:36

晕哥
管理员
注册时间: 2017-09-06
已发帖子: 9,342
积分: 9202

Re: camdroid 下的 "不死" 进程 vold 如何实现的?

终于找到实现的代码了: https://github.com/qq516333132/camdroid/blob/master/camdroid/system/core/init/signal_handler.c

/init 进程注册了 SIGCHLD 信号的软中断处理程序, 当子进程退出的时候 /init 进程会收到 SIGCHLD 信号,
然后调用 wait_for_one_process() 重启一个新的进程.

所以, 只要 /init 进程在,init.rc 里面service属性的进程只要挂掉都会被 /init 扶正.





离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn