openwrt中boot_hook函数的一些说明

来源:互联网 发布:淘宝怎么找不到高仿表 编辑:程序博客网 时间:2024/06/16 23:49

一、基础函数

1.    boot_hook_init

boot_hook_init(){

        local hook="${1}_hook"

        export -n"PI_STACK_LIST=${PI_STACK_LIST:+$PI_STACK_LIST }$hook" #加入到PI_STACK_LIST,以空格分隔

        export -n "$hook="   #保存到环境变量中,以参数_hook命名

}

2.    boot_hook_add

boot_hook_add(){

        localhook="${1}_hook${PI_HOOK_SPLICE:+_splice}"                           

        local func="${2}"                                                          

       

        [ -n "$func" ] && {

                local v; eval "v=\$$hook"

                export -n "$hook=${v:+$v}$func"   #以参数1作为变量名,将参数2作为值存储,以空格分割

        }                                                                          

}

 

3.    boot_hook_shift

boot_hook_shift(){

        local hook="${1}_hook"                                                      

        local rvar="${2}"                                                          

       

        local v; eval"v=\$$hook"                                                  

        [ -n "$v" ] && {

                local first="${v%%*}"                        #取出第一个变量                     

               

                [ "$v" != "${v#*}" ] && \

                        export -n"$hook=${v#* }" || \      #去除第一个值,将剩余的值作为变量的值,值是用空格分割的

                        export -n"$hook="   #如果取完值,将变量设置为空

               

                export -n"$rvar=$first"  #将值赋值给func                                         

                return 0                                                           

        }                                                                           

       

        return 1                                                                   

}

逐个取变量值

4.    boot_run_hook

boot_run_hook(){

        local hook="$1"

        local func

 

        while boot_hook_shift "$hook"func; do  #逐个去变量值

                local ran; eval"ran=\$PI_RAN_$func"

                [ -n "$ran" ] || {

                        export -n"PI_RAN_$func=1" #设置为1,标识该变量

                        $func "$1""$2"  #运行对应变量所对应的宏

                }

        done

}

二、例子

openwrt初始化了如下变量

boot_hook_init preinit_essential

boot_hook_init preinit_main

boot_hook_init failsafe

boot_hook_init initramfs

boot_hook_init preinit_mount_root

比如preinit_main变量

l  执行boot_hook_init

环境中会存在

preinit_main_hook=  #该变量未赋值

PI_STACK_LIST=preinit_main_hook

在执行完上面几个初始化后

PI_STACK_LIST= preinit_essential preinit_main failsafe initramfspreinit_mount_root

l  执行boot_hook_add

preinit_main_hook=define_default_set_state preinit_ip pi_indicate_preinitpreinit_ip pi_indicate_preinit do_sysinfo_generic failsafe_waitrun_failsafe_hook indicate_regular_preinit initramfs_test do_mount_rootrun_init

l  执行boot_hook_run

在该步骤中,他会逐个取出preinit_main_hook的值,然后调用它

三、用途

归类,类似于如初始化阶段,要做哪些动作,然后到另一个阶段,又要做哪一些动作,而这些阶段,这里由这些定义

boot_hook_init preinit_essential

boot_hook_init preinit_main

boot_hook_init failsafe

boot_hook_init initramfs

boot_hook_init preinit_mount_root

原创粉丝点击