AM335X的應用程序自啓動流程以及U盤更新應用程序記錄 AM335X的SD卡更新系統學習記錄 AM335X的SD卡更新系統學習記錄 AM335X的SD卡更新系統學習記錄

AM335X的SD卡更新系統學習記錄中最後更新完系統後,之後運行應用程序都會從EMMC中取出Linux系統運行。接着介紹Linux系統是怎麼本身啓動咱們編寫的應用程序的。html

一、在AM335X的SD卡更新系統學習記錄中已經詳細介紹了整個系統的啓動流程,這裏在複述一下。AM335X上電後,根據Boot Sequence啓動配置(LCD0-LCD15引腳,具體可參考TI官方的335X參考手冊),從相應的存儲設備啓動,這裏配置的是從SPI啓動。內部的ROM從SPI的flash中拷貝鏡像到RAM中運行。而後啓動u-boot,u-boot啓動後會從MMC的/sys分區的/boot目錄下取出uImage鏡像再到RAM中運行。Linux啓動後,會接着掛接EMMC的/sys分區,啓動BusyBox裏的Init進程。init進程首先主要對/etc/inittab文件進行解析,而後按照它的指示建立各類子進程。inittab文件的內容主要如下幾部分。其中系統運行後最早執行的是/etc/rc.d/rcS進程,而且它只執行一次,因此應用程序的啓動是在這裏運行的。shell

 

::sysinit:/etc/rc.d/rcS
::respawn:/sbin/getty 9600 tty1
::ctrlaltdel:/sbin/reboot
::shutdown:/etc/rc.d/rcS stop
::restart:/sbin/init

 

二、接着分析/etc/rc.d/rcS文件,這是一個腳本文件。這個文件的分析在AM335X的SD卡更新系統學習記錄已經分析過了這裏再也不重複。直接看到這個腳本運行的另外一個腳本/etc/rc.d/rc.local start。下面是它的內容,能夠看到它的工做主要是啓動daemon守護進程,應用程序由它啓動,而且守護,所謂守護進程,就是不依賴於控制檯會話的進程,它能夠在應用程序意外退出時從新啓動應用程序。若是把daemon換成應用程序,這樣應用程序就能自啓動了。app

#!/bin/sh
mode=${1:-start}
if [ $mode = "start" ]
then

#set sgtl5000 volume 0~127
amixer cset numid=5 65

#set power led light
echo 1 > /sys/class/leds/user_led0/brightness

#start daemon
daemon                               # 啓動守護進程

fi

 

三、接着分析daemon程序,它的配置文件存放在/opt/Daemon/config/daemon.xml中。主要配置的是須要啓動的程序路徑與名稱。而且能夠添加多條,其中/opt/App爲目錄,xxx.out爲可執行文件名。而且能夠設置多個路徑與文件。post

<ProcList Path="/opt/App" Name="xxx.out" args=""/>

 

四、分析到這裏。能夠知道一下幾點。學習

a、存在在一個名爲/opt的分區加密

b、其中應用程序存放在/opt/App中url

c、其中daemon程序的配置文件存放在/opt/Daemon/config/daemon.xml中spa

d、daemon程序被放在/usr/sbin中rest

插上U盤後,會出現PID爲13673的進程,進而出現1367五、13683的進程。從這一現象能夠發現./Daemon.out的另一個做用,檢測有無U盤插入,如有U盤插入的話運行/shell/udisk腳本。接下來跟着這個腳本慢慢分析。code

  PID  PPID USER     STAT   VSZ %VSZ CPU %CPU COMMAND
13577
1 root S 28776 3.7 0 0.0 ./Daemon.out 13673 13577 root S 2936 0.3 0 0.0 sh -c ./shell/udisk mount /dev/sda1 13675 13673 root S 2936 0.3 0 0.0 {udisk} /bin/sh ./shell/udisk mount /dev/sda1 13683 13675 root S 2936 0.3 0 0.0 {update} /bin/sh ./shell/update ./download/xxx.bin

 

五、開始分析如下腳本,其中$1=mount;$2=/dev/sda1。能夠看到其中有一句./shell/update ./download/xxx.bin。這個腳本將在接下來分析

sh -c ./shell/udisk mount /dev/sda1
          $0        $1       $2
#!/bin/sh

case "$1" in
    mount)                        #掛載U盤
        if [ ! -b $2 ]            #是否存在/dev/sda1塊設備裝置
        then
            echo "$2 not exist!"  #若是不存在打印出不存在,而後退出
            exit 0
        fi
        
                #cd /opt/Daemon
                echo "Current Path " $(pwd) "..."        #當前路徑已經在Daemon中切換到/opt/Daemon中了
        echo "mount $2 to /mnt/udisk..."
        echo 1 > /sys/class/leds/user_buzzer/brightness  #打開蜂鳴器
        mkdir /mnt/udisk                                 #建立/mnt/udisk目錄
        mount -t vfat $2 /mnt/udisk                      #以fat文件系統格式掛接/dev/sda1到/mnt/udisk
        
        echo 0 > /sys/class/leds/user_buzzer/brightness  #關閉蜂鳴器?

        if [ -x /mnt/udisk/xxx.bin ]                     #若是U盤裏的xxx.bin文件可執行
        then
            echo "exist firmware file[xxx.bin], auto update self..."
                        - rm /log/x.log
            cp -a /mnt/udisk/xxx.bin ./download/xxx.bin  #以遞歸、保留符號連接的方式拷貝文件到/opt/Daemon/download中
            chmod +x ./download/xxx.bin                  #加上可執行權限
            ./shell/update ./download/xxx.bin            #解壓出xxx.bin文件到相應的目錄下
            ./shell/hmkill 1                             #運行/shell/hmkill 1腳本,用於殺掉如今運行的進程
            ./daemon.sh                                  #運行新更新的守護進程
        fi

        ;;
    umount)                                 #卸載U盤
        if [ -d /mnt/udisk ]                #若是/mnt/udisk存在
        then
            echo "umount /mnt/udisk..."
            umount /mnt/udisk                #卸載/mnt/udisk
            rm -rf /mnt/udisk                #刪除/mnt/udisk
        fi
        ;;
    *)
        echo "Usage: /shell/udisk {mount|umount}"    #其它
        echo 
        exit 1
        ;;
esac                            #case語句結束

exit 0

對以上腳本功能作一個總結:

a、掛載U盤到/mnt/udisk

b、讀出U盤的MD5文件xxx.bin。而且解壓出xxx.bin文件到相應的目錄下。

c、殺掉如今運行的如今運行的daemon進程、app進程

d、運行新的daemon進程,這個進程會運行新的app進程

 

六、分析./shell/update ./download/xxx.bin。主要做用是讀出U盤的MD5文件xxx.bin。而且解壓出xxx.bin文件到相應的目錄下,分析以下:

#!/bin/sh
#

if [ ! -f $1 ]                             #檢測文件是否存在
then
    echo "$1 not exist!"
    exit 0
fi

echo 1 > /sys/class/leds/user_buzzer/brightness  #打開蜂鳴器

chmod +x $1                               #加可執行權限

dd if=$1 of=env.sh bs=1 count=128             #從xxx.bin讀入文件放入env.sh中,每次讀1字節,一共讀128字節

. env.sh                                 #執行env.sh腳本

# 生成原始打包文件
dd if=$1 of=$NAME bs=1 count=$SIZE skip=128     #從xxx.bin讀入文件放入NAME中,每次讀1字節,一共讀SIZE字節,跳過前128個字節
# 執行腳本
MD5=`md5sum $NAME | awk '{print $1}'`          #MD5校驗
if [ "$SIGN" = "$MD5" ]                      #若是校驗成功
then
    tar -zxvf $NAME -C /                    #解壓
    chmod +x /opt/Daemon/Daemon.out             #加上可執行權限
    chmod +x /opt/Daemon/shell/x               #加上可執行權限
    chmod +x /opt/App/x.out                     #加上可執行權限
    sync                                 #同步,馬上寫入磁盤
fi

rm env.sh                    #刪除以前生成的文件
rm $NAME                     #刪除以前生成的文件
rm $1                        #刪除以前生成的文件

echo 0 > /sys/class/leds/user_buzzer/brightness #關閉蜂鳴器

exit 0                                     #退出

 

七、製做xxx.bin的MD5文件,其中opt裏存放的是App目錄與Daemon目錄,pack.sh是一個腳本文件,用於打包成加密的MD5格式。這個三步以後生成xxx.bin文件。放入FAT32格式的U盤,將這個U盤插入到335X的USB口便可實現更新。

a、sudo tar -czvf ./xxx.tar.gz ./opt

b、sudo chmod 755 ./xxx.tar.gz

c、sudo ./pack.sh ./xxx.tar.gz

 

八、分析pack.sh腳本,這個腳本的前面128字節爲其餘數據。與/shell/update腳本對應,/shell/update腳本會先取出前128字節。而後取出MD5簽名,而後解密文件。

 1 # !/bin/sh
 2 #
 3 
 4 [ $# != "1" ] && echo "Usage: $0 tarfile" && exit 0   #參數個數是否爲1
 5 
 6 FILE="reader.bin"                                     #加密後的文件名
 7 NAME="$1"                                             #待加密的文件名
 8 SIZE=`wc -c $1 | awk '{print $1}'`                    #以字節方式計算出待加密文件大小
 9 SIGN=`md5sum $1 | awk '{print $1}'`                   #加密,MD5簽名生成  awk處理輸入的整行數據的某個字段(以空格分開)、sed處理輸入的整行數據
10 
11 echo "NAME=$NAME" >> $FILE                          # 被打包文件名稱
12 
13 echo "SIZE=$SIZE" >> $FILE                          # 被打包文件大小
14 
15 echo "SIGN=$SIGN" >> $FILE                          # 被打包文件MD5簽名
16 
17 chmod +x $FILE                                      # 加上可執行權限
18 
19 dd if=$1 of=$FILE bs=1 count=$SIZE seek=128         # 在被打包文件前面加上$FILE內容,共計128字節
相關文章
相關標籤/搜索