Android에서 init.rc 파일의 분석 공유

8952 단어 init.rc파일해석
네, init.rc의 해석은parse_config (): [system/core/init/init_parser.c]에서 진행되었습니다.init 전 과정 중 어느 단계에서 발생했는지 분석하려면 을 참조하십시오.1. 해석 과정 1.init를 스캔합니다.rc의 token에서 EOF/텍스트 TEXT/새 줄 NEWLINE을 종료하는 파일을 찾으면 공백','\t','\r'가 무시되고 #처음 줄도 무시됩니다.TEXT의 경우 공백','\t','\r','는 모두 TEXT의 종료 표지이다.2. 모든 TEXT token에 대해args[]수조에 넣기3.새 줄('')을 만났을 때,args[0]로lookup_keyword () 검색 일치 키워드;1) Section(on 및 서비스), parse_ 호출new_section () 해석: - on section, parse_ 호출action(), 해석 함수 설정parse_라인은parse_line_action () - 서비스 섹션, parse_ 호출서비스 (), 해석 함수 설정parse_라인은parse_line_서비스 ()2) 다른 키워드에 대한 행 (on이나 서비스가 아닌 곳, 즉 섹션을 전환하지 않음) 호출parse_line () 즉, - on section 내의 명령줄에 대해parse_ 호출line_action () 해석;- 서비스 섹션의 명령행에 parse_ 호출line_서비스 () 해석2. 핵심 데이터 유형의 원형 및 핵심 데이터 정의 2.1 Token의 정의 [cpp]#defineT_EOF 0   #defineT_TEXT 1   #defineT_NEWLINE 2  #defineT_EOF 0#defineT_TEXT 1#defineT_NEWLINE 2 2.2 키워드 정의 [cpp] KEYWORD(capability, OPTION, 0, 0) KEYWORD(chdir, COMMAND, 1, do_chdir) KEYWORD(chroot, COMMAND, 1, do_chroot) KEYWORD(class, OPTION, 0, 0) KEYWORD(class_start, COMMAND, 1, do_class_start) KEYWORD(class_stop, COMMAND, 1, do_class_stop) KEYWORD(class_stop) YWORD(console, OPTION, 0, 0) KEYWORD(critical, OPTION, 0, 0)  KEYWORD(disabled,    OPTION, 0, 0)  KEYWORD(domainname,  COMMAND, 1, do_domainname)  KEYWORD(exec,        COMMAND, 1, do_exec)  KEYWORD(export,      COMMAND, 2, do_export)  KEYWORD(group,       OPTION, 0, 0)  KEYWORD(hostname,    COMMAND, 1, do_hostname)  KEYWORD(ifup,        COMMAND, 1, do_ifup)  KEYWORD(insmod,      COMMAND, 1, do_insmod)  KEYWORD(import,      COMMAND, 1, do_import)  KEYWORD(keycodes,    OPTION, 0, 0)  KEYWORD(mkdir,       COMMAND, 1, do_mkdir)  KEYWORD(mount,       COMMAND, 3, do_mount)  KEYWORD(on,          SECTION, 0, 0)  KEYWORD(oneshot,     OPTION, 0, 0)  KEYWORD(onrestart,   OPTION, 0, 0)  KEYWORD(restart,     COMMAND, 1, do_restart)  KEYWORD(service,     SECTION, 0, 0)  KEYWORD(setenv,      OPTION, 2, 0)  KEYWORD(setkey,      COMMAND, 0, do_setkey)  KEYWORD(setprop,     COMMAND, 2, do_setprop)  KEYWORD(setrlimit,   COMMAND, 3, do_setrlimit)  KEYWORD(socket,      OPTION, 0, 0)  KEYWORD(start,       COMMAND, 1, do_start)  KEYWORD(stop,        COMMAND, 1, do_stop)  KEYWORD(trigger,     COMMAND, 1, do_trigger)  KEYWORD(symlink,     COMMAND, 1, do_symlink)  KEYWORD(sysclktz,    COMMAND, 1, do_sysclktz)  KEYWORD(user,        OPTION, 0, 0)  KEYWORD(wait,        COMMAND, 1, do_wait)  KEYWORD(write,       COMMAND, 2, do_write)  KEYWORD(copy,        COMMAND, 2, do_copy)  KEYWORD(chown,       COMMAND, 2, do_chown)  KEYWORD(chmod,       COMMAND, 2, do_chmod)  KEYWORD(loglevel,    COMMAND, 1, do_loglevel)  KEYWORD(ioprio,      OPTION, 0, 0)      KEYWORD(capability,  OPTION, 0, 0)    KEYWORD(chdir,       COMMAND, 1, do_chdir)    KEYWORD(chroot,      COMMAND, 1, do_chroot)    KEYWORD(class,       OPTION, 0, 0)    KEYWORD(class_start, COMMAND, 1,do_class_start)    KEYWORD(class_stop,  COMMAND, 1, do_class_stop)    KEYWORD(console,     OPTION, 0, 0)    KEYWORD(critical,    OPTION, 0, 0)    KEYWORD(disabled,    OPTION, 0, 0)    KEYWORD(domainname,  COMMAND, 1, do_domainname)    KEYWORD(exec,        COMMAND, 1, do_exec)    KEYWORD(export,      COMMAND, 2, do_export)    KEYWORD(group,       OPTION, 0, 0)    KEYWORD(hostname,    COMMAND, 1, do_hostname)    KEYWORD(ifup,        COMMAND, 1, do_ifup)    KEYWORD(insmod,      COMMAND, 1, do_insmod)    KEYWORD(import,      COMMAND, 1, do_import)    KEYWORD(keycodes,    OPTION, 0, 0)    KEYWORD(mkdir,       COMMAND, 1, do_mkdir)    KEYWORD(mount,       COMMAND, 3, do_mount)    KEYWORD(on,          SECTION, 0, 0)    KEYWORD(oneshot,     OPTION, 0, 0)    KEYWORD(onrestart,   OPTION, 0, 0)    KEYWORD(restart,     COMMAND, 1, do_restart)    KEYWORD(service,     SECTION, 0, 0)    KEYWORD(setenv,      OPTION, 2, 0)    KEYWORD(setkey,      COMMAND, 0, do_setkey)    KEYWORD(setprop,     COMMAND, 2, do_setprop)    KEYWORD(setrlimit,   COMMAND, 3, do_setrlimit)    KEYWORD(socket,      OPTION, 0, 0)    KEYWORD(start,       COMMAND, 1, do_start)    KEYWORD(stop,        COMMAND, 1, do_stop)    KEYWORD(trigger,     COMMAND, 1, do_trigger)    KEYWORD(symlink,     COMMAND, 1, do_symlink)    KEYWORD(sysclktz,    COMMAND, 1, do_sysclktz)    KEYWORD(user,        OPTION, 0, 0)    KEYWORD(wait,        COMMAND, 1, do_wait)    KEYWORD(write,       COMMAND, 2, do_write)    KEYWORD(copy,        COMMAND, 2, do_copy)    KEYWORD(chown,       COMMAND, 2, do_chown)    KEYWORD(chmod,       COMMAND, 2, do_chmod)    KEYWORD(loglevel,    COMMAND, 1, do_loglevel)    KEYWORD(ioprio, OPTION, 0, 0)2.3 struct action 및 struct command [cpp]

struct action { 
        /* node in list of all actions */ 
    struct listnode alist; 
        /* node in the queue of pending actions*/ 
    struct listnode qlist; 
        /* node in list of actions for atrigger */ 
    struct listnode tlist; 

    unsigned hash; 
    const char *name; 

    struct listnode commands; 
    struct command *current; 
}; 

struct action {
        /* node in list of all actions */
    struct listnode alist;
        /* node in the queue of pending actions*/
    struct listnode qlist;
        /* node in list of actions for atrigger */
    struct listnode tlist;

    unsigned hash;
    const char *name;

    struct listnode commands;
    struct command *current;
};
[cpp]
view plaincopyprint?

struct command 

        /* list of commands in an action */ 
    struct listnode clist; 

    int (*func)(int nargs, char **args); 
    int nargs; 
    char *args[1]; 
}; 

struct command
{
        /* list of commands in an action */
    struct listnode clist;

    int (*func)(int nargs, char **args);
    int nargs;
    char *args[1];
};
2.4 list action_list 및 action_queueaction_list 해석 init.rc 시 on action을 만나면act->alist를 통해 가입합니다.    queue_builtin_action () 실행 함수를command로 구성하고 action을 만듭니다.action_리스트에action_queue 실행 action_for_each_trigger(),act->qlist를 통해 가입;    queue_builtin_action () 실행 함수를command로 구성하고 action을 만듭니다.action_list에 추가, action_queue의 팀 끝.3. 액션에 대한 해석은 init의 시작 과정과 앞에서 설명한 init를 결합시킨다.rc의 해석, init 대 init에 대한 정리.rc리action의 해석.3.1 on section 내 action의 해석 1.3.1에서 새로운 on section 호출parse_로 해석action() 시 struct action*act를 신청했습니다. 설정: 1)act->name은onsection의 이름(예:boot/fs/)입니다.2) list act->commands 초기화;3) act->alist를 action에 추가_list의 열 끝에 action이 만들어지고 action에 추가됩니다_리스트 중.3.2 on section 내 action의command에 대한 해석 on section 내 action의command,parse_ 호출line_action()1) 키워드를 찾아서COMMAND인지, 파라미터 수가 정확한지 확인한다.2) structcommand*cmd-cmd->func를 keyword표에서 신청한다.- cmd->nargs에 매개 변수 개수를 설정하고 cmd->args에 매개 변수를 복사합니다.-cmd->clist를 act->commands의 열 끝에 넣으면,command가 action에 추가됩니다.3.3 action_list의 action action 가입_queue 중 action_for_each_trigger () 대기열 action_list에 일치하는 액션, 액션에 추가_queue의 팀 끝;    queue_builtin_action () 실행 함수를command로 구성하고 action을 만듭니다.action_list에 추가, action_queue의 팀 끝.3.4 명령 실행 Init의 무한 순환 중 execute_one_command():system/core/init/init.c 1) 액션으로_queue에서 structaction*act를 떼어cur_action;2)cur_로부터action 획득 struct command * 부여cur_command;3) 실행cur_command->func(cur_command->nargs,cur_command->args) 위 단계에서 1, 2 & 3은 한 번에 실행되고, 4는 무한순환으로 실행되며, action_queue에서 액션을 떼고 액션에서command를 얻은 다음command를 실행합니다.4. init.rc 문법 소결 시스템/core/init/Readme에 init가 있습니다.rc 문법의 설명.이전에 필자는 init 원본을 분석하지 않았을 때도 이 Readme 파일을 읽었지만 일부 개념 경계에 대해 잘 알지 못했다.현재 init를 분석했습니다.rc의 해석 후, 다음 면접에서 init를 맞춥니다.rc문법 정리 좀 해주세요.1. # 시작하는 줄도 무시되고 주석에 사용됩니다.2.','\t','\r'는 무시되기 때문에 속성에 빈칸이 있으면 뒤에 식별되지 않습니다.모든 Action에서command 전의 축소는 문법의 요구가 없고 읽기에 편리할 뿐이다.3.''은 줄 바꿈의 표지이고 init 문법에서 새로운 해석의 시작은 모두 새로운 줄의 시작을 바탕으로 하는 것이고 한 줄씩 스캔하여 해석하는 것이다.4. 일부 개념: Section/Action/Command/Trigger-Init.rc에서 on 또는 서비스 []*행을 만나면 새로운 섹션의 시작을 상징합니다. [2.2리 키워드 정의 참조, SECTION의 유형은 on과 서비스뿐입니다]; -on를 만나면trigger는 촉발 조건, 발생 시기입니다.early-init/init/early-fs/fs/post-fs/early-boot/boot;property: =, 속성 의 값이 로 설정되었을 때;device-added-/device-removed-장치 노드가 가입하거나 제거될 때;서비스-exited- 서비스가 종료될 때입니다. -on가 발생할 때 액션, 즉 on 뒷부분을 실행합니다. 여러 개의command를 포함할 수 있습니다. -command는 줄마다 어떤command를 지원하는지 2.2리 키워드 정의에서 COMMAND의 키워드 유형을 보십시오.
형식은 다음과 같습니다. [cpp]
onon이 모든 것이 하나의 섹션입니다.모든 를 액션이라고 합니다.본문을 총결하여 init를 해석하였다.rc의 기본 문법은 on 섹션의 해석, 서비스의 해석과property의 지원을 중점적으로 토론하고 후속 주제에서 상세하게 토론한다.

좋은 웹페이지 즐겨찾기