Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3170423
  • 博文数量: 685
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5303
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-19 14:17
个人简介

文章分类

全部博文(685)

文章存档

2015年(116)

2014年(569)

分类: 嵌入式

2014-10-14 10:04:48

preinit:/etc/preinit
boot_hook_init preinit_essential
boot_hook_init preinit_main
boot_hook_init failsafe
boot_hook_init initramfs
boot_hook_init preinit_mount_root

for pi_source_file in /lib/preinit/*; do
        . $pi_source_file
done

boot_run_hook preinit_essential

pi_mount_skip_next=false
pi_jffs2_mount_success=false
pi_failsafe_net_message=false

boot_run_hook preinit_main
=========================================================
boot_hook_init:/lib/functions/preinit.sh
boot_hook_init() {
        local hook="${1}_hook"
        export -n "PI_STACK_LIST=${PI_STACK_LIST:+$PI_STACK_LIST }$hook"
        export -n "$hook="
}
boot_hook_add() {
        local hook="${1}_hook${PI_HOOK_SPLICE:+_splice}"
        local func="${2}"

        [ -n "$func" ] && {
                local v; eval "v=\$$hook"
                export -n "$hook=${v:+$v }$func"
        }
}

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"
                        $func "$1" "$2"
                }
        done
}

pivot() { #
        /bin/mount -o noatime,move /proc $1/proc && \
        pivot_root $1 $1$2 && {
                /bin/mount -o noatime,move $2/dev /dev
                /bin/mount -o noatime,move $2/tmp /tmp
                /bin/mount -o noatime,move $2/sys /sys 2>&-
                /bin/mount -o noatime,move $2/overlay /overlay 2>&-
                return 0
        }
}

fopivot() { #
        /bin/mount -o noatime,lowerdir=/,upperdir=$1 -t overlayfs "overlayfs:$1" /mnt
        pivot /mnt $2
}

ramoverlay() {
        mkdir -p /tmp/root
        /bin/mount -t tmpfs -o noatime,mode=0755 root /tmp/root
        fopivot /tmp/root /rom 1
==================================================
/etc/preinit脚本只是对preinit_mount_root这类函数初始化,这类函数的真正的执行还是在该do_mount_root()函数中----》该函数
又在[ "$INITRAMFS" = "1" ] || boot_hook_add preinit_main do_mount_root中被添加到preinit_main中通过执行preinit_main间接被执行到:
do_mount_root() {
        mount_root
        boot_run_hook preinit_mount_root
        [ -f /sysupgrade.tgz ] && {
                echo "- config restore -"
                cd /
                mv sysupgrade.tgz /tmp
                tar xzf /tmp/sysupgrade.tgz
                rm -f /tmp/sysupgrade.tgz
                sync
        }
}

[ "$INITRAMFS" = "1" ] || boot_hook_add preinit_main do_mount_root
注:在/etc/preinit脚本中会将/lib/preinit目录下的所有脚本中的函数都进行分类:
preinit_essential
preinit_main
failsafe
initramfs
preinit_mount_root-------------->
for pi_source_file in /lib/preinit/*; do
        . $pi_source_file
done
=========================================================
preinit_main和preinit_mount_root等不是某个具体的函数,而是一类函数
preinit_main类函数中最后执行pi_init_cmd,即执行了busybox的init进程启动系统。
pi_init_path="/bin:/sbin:/usr/bin:/usr/sbin"
pi_init_cmd="/sbin/init"
=========================================================
标准内核将mtd挂载root的流程:
1.1系统执行指向busybox的init---->init_main.c----->/etc/inittab---->/etc/rc.S
----->mount -a//加载文件/etc/fstab文件中的选项;mdev -s//在/dev 目录下建立必要的设备节点。
fstab:将内核sysfs、proc和tmpfs中的内容分别挂载到/sys、/proc等目录。
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
temps /tmp tmpfs defaults 0 0
temps /dev tmpfs defaults 0 0

1.2boot_hook_init preinit_mount_root:
在preinit_mount_root这类脚本中本来有大量启动脚本函数,现在在/lib/preinit目录下找不到一个添加到
preinit_mount_root中的脚本函数---->因为被搬到procd或ubox的代码中实现了。

阅读(2180) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~