分析シナリオファイルAndroid InitProcess分析心得(1)

5972 ワード

この記事は、分析スクリプトファイルに関する投稿です.
 
  

     ,Android Init process Android . Android Init process Linux Kernel . device , Bootloader Kernel, Kernel Android Init process. Linux , :

 

    kernel_init===> init_post ==> run_init_process ==> Android Init process.

 

     AndroidInit process , kernel_init, init_post,run_init_process .

 

        Android Init process .

    1. init.rc

    2. devicenode file

    3.

     .

     init.rc

        init.rc Android , . action list service list. ,

        1. "on" actionlist ,

        2. "Services" servicelist .

     init.rc AIL(Android Init Language) .AIL , Action, Commands, Services, Option. system\core\init\readme.txt . , system\core\init\readme.txt.

        Action Services Section, Section Command Option .Command .Option ServicesSection . .

        init.rc init_parse_config_file . init.rc .

// \system\core\init\init_parser.c

int init_parse_config_file(const char *fn)

{

    char *data;

    data = read_file(fn, 0);

    if (!data) return -1;



    parse_config(fn, data);

    DUMP();

    return 0;

}



static void parse_config(const char *fn, char *s)

{

   struct parse_state state;

   // ...

   state.filename = fn;

   state.line = 0;

   state.ptr = s;

   state.nexttoken = 0;

   state.parse_line = parse_line_no_op;

   // ...

   for (;;) {

      switch (next_token(&state)) {

      case T_EOF:

          state.parse_line(&state, 0, 0);

          goto parser_done;

      case T_NEWLINE:

            state.line++;

            if (nargs) {

                int kw = lookup_keyword(args[0]);

                if (kw_is(kw, SECTION)) {

                    state.parse_line(&state, 0, 0);

                    parse_new_section(&state, kw, nargs, args);

                } else {

                    state.parse_line(&state, nargs, args);

                }

                nargs = 0;

            }

            break;

        case T_TEXT:

            if (nargs < INIT_PARSER_MAXARGS) {

                args[nargs++] = state.text;

            }

            break;

      }

   }

}

void parse_new_section(struct parse_state *state, int kw,

                       int nargs, char **args)

{

    printf("[ %s %s ]
", args[0], nargs > 1 ? args[1] : ""); switch(kw) { case K_service: state->context = parse_service(state, nargs, args); if (state->context) { state->parse_line = parse_line_service; return; } break; case K_on: state->context = parse_action(state, nargs, args); if (state->context) { state->parse_line = parse_line_action; return; } break; case K_import: parse_import(state, nargs, args); break; } state->parse_line = parse_line_no_op; }


は にとって、そびえ つ だが、 は にすぎず、 から を しているが、 を くことはできない. の で くの のパスワードは、 で する があります. の の で、 も しい を るには、 に する と の 、 と の の を します.
のプログラムコードからはっきり えるのはinitだけです.rcスクリプトファイルのsectionのcommandとoptionの はactionlistとservice listを えて する. したアクションはparse_を できます.アクションとparse_サービスの の れはここまでで、 でparse_を に ます.アクションとparse_サービスの
はinitです.rcスクリプトファイルの プロセス、init.rcスクリプトファイルの プロセスはexecute_one_commandは を えて する.
// \system\core\init\init.c

void execute_one_command(void)

{

    int ret;



    if (!cur_action || !cur_command || is_last_command(cur_action, cur_command)) {

        cur_action = action_remove_queue_head();

        cur_command = NULL;

        if (!cur_action)

            return;

        INFO("processing action %p (%s)
", cur_action, cur_action->name); cur_command = get_first_command(cur_action); } else { cur_command = get_next_command(cur_action, cur_command); } if (!cur_command) return; ret = cur_command->func(cur_command->nargs, cur_command->args); INFO("command '%s' r=%d
", cur_command->args[0], ret); }

この は にcurを して されます.commandが つfunctionはactionlistのcommandを する.このcur_commandが っているfunctionは から までですか? のコール get_first_commandとget_next_commandが く
// \system\core\init\init.c

static struct command *get_first_command(struct action *act)

{

    struct listnode *node;

    node = list_head(&act->commands);

    if (!node || list_empty(&act->commands))

        return NULL;



    return node_to_item(node, struct command, clist);

}



static struct command *get_next_command(struct action *act, struct command *cmd)

{

    struct listnode *node;

    node = cmd->clist.next;

    if (!node)

        return NULL;

    if (node == &act->commands)

        return NULL;



    return node_to_item(node, struct command, clist);

}

ここで たちはこの2つの の がaction listからactioncommand nodeのデータを り しただけであることを っていますが、このcommand nodeが っているfunctionについてはどうやって たのか かりません.
の れにクモの を すしかない. プロセスでparseを するまで します. のための ですrcの に、parse_を び す があるnew_sectionの にlookupを する があります.keyword はkeywordをパラメータとして する.この の から を めます
は わってみんなに のプログラマーのいくつかのジョークの を かち います: くのいわゆる もただこのようにして、あなたを れて、マイクロソフトはまだマイクロソフトで、GoogleはまだGoogleで、アップルはやはりアップルで、 はやはり で、これらの は を れて、 は もありません.