您尚未登录。

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

晕哥
管理员
所在地: wechat: whycan_cn
注册时间: 2017-09-06
已发帖子: 9,473
积分: 9207

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

晕哥
管理员
所在地: wechat: whycan_cn
注册时间: 2017-09-06
已发帖子: 9,473
积分: 9207

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

晕哥
管理员
所在地: wechat: whycan_cn
注册时间: 2017-09-06
已发帖子: 9,473
积分: 9207

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

晕哥
管理员
所在地: wechat: whycan_cn
注册时间: 2017-09-06
已发帖子: 9,473
积分: 9207

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

晕哥
管理员
所在地: wechat: whycan_cn
注册时间: 2017-09-06
已发帖子: 9,473
积分: 9207

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 扶正.





离线

#6 2018-11-06 15:17:49

arphone
会员
注册时间: 2017-11-03
已发帖子: 92
积分: 83.5

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

感谢, 学习了

离线

#7 2018-11-07 00:01:04

playflash
会员
注册时间: 2018-09-14
已发帖子: 91
积分: 91

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

厉害, 学习一下。

离线

页脚

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

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


东莞哇酷科技有限公司开发