天天看點

[轉]QNX系統開發-鏡像制作及燒錄分析引言1.       FLASH分區2.       系統建立流程3.       系統災難恢複方法4.       附錄5.             問題探讨

如果你認為本系列文章對你有所幫助,請大家有錢的捧個錢場,點選此處贊助,贊助額0.1元起步,多少随意

聲明:本文隻用于個人學習交流,若不慎造成侵權,請及時聯系我,立即予以改正

鋒影

email:[email protected]

引言

1.1      文檔内容

    本文主要就探讨如下問題:

    需求如下:

1.需要制作整盤flash鏡像,提供給産線,批量燒錄FLASH晶片。

2.産品使用過程中,不拆機情況下,将全部系統重裝。

3.産品使用過程中,不拆機情況下,将系統重裝,但保留使用者資料。

涉及到的知識點有:

啟動IPL如何開發,OS鏡像如何制作,應用和資料檔案系統如何制作,系統OS如何更新全部,如何保留資料更新os/apps。

通過本文檔可以了解系統的啟動過程,IPL,OS的定制,燒錄和更新方式。

1.2适用平台

軟體環境:QNX CAR2

1.      

FLASH分區

分區 格式 大小 描述
OS FAT32 2M 系統核心
rootfs QNX6 10M 根檔案系統
Apps QNX6 10M 應用程式分區
Datas QNX6 Left all 應用資料分區

n         啟動時先将程式分區和資料分區分别挂載到目錄 /opt/apps和/opt/datas目錄下面。

Mount /dev/fs0p2 /opt/apps

Mount /dev/fs0p3 /opt/datas

n         

Rootfs中的/opt/datas /opt/apps同樣存在一份能初始的能正常運作的備份,以便在系統挂載兩個分區失敗時也能正常的啟動。

n         挂載失敗後的處理

系統中的異常檢測子產品監測分區挂載情況,在分區挂載失敗後,自動進行分區的格式化并将根分區的初始資料拷貝到對應的分區。

如果分區修複成功,則通知系統進行重新開機。如果分區修複失敗,則需要界面報錯系統資料分區異常,需要檢修。最好在主界面上有警告圖示,在系統資訊中可查詢到詳細的錯誤資訊(顯示分區挂載狀态)。

n         分區異常時功能減化

當系統的資料分區挂載失敗時,需要置相關系統标記,通知所的子產品系統不再支援大資料量的存儲(包括歌曲清單掃描,藍牙電話本同步等),當使用者使用此操作時,需要提示使用者資料分區異常,功能暫不支援。

2.      

系統建立流程

2.1制作引導程式(IPL)

l         

IPL的作用和功能

最低化的初始化相關硬體環境,讓OS能運作起來。

1.從硬複位向量中第一個被執行。

2.設定存儲控制器,包括片選和PCI控制器等。

3.配置時鐘。

4.建立RAM記憶體堆棧,進行OS檔案系統校驗和拷貝OS啟動程式到RAM中,将控制權跳轉到OS的啟動程式中。

l         

IPL支援SD/USB卡啟動

1.初始化硬體(via assembly-language code),存儲控制器,時間等。

2.查找啟動鏡像(via image_scan()).,查找順序為SD/USB/FLASH,如果SD/USB存在啟動鏡像,則從SD/USB啟動,否則從FLASH啟動。

3.拷貝啟動鏡像中的啟動部分到RAM中(via image_setup())。

4.跳轉到RAM中的啟動部分,将控制權交由OS鏡像。(via image_start()).

5.附上啟動OS的校驗/拷貝和跳轉代碼

checksum (image_paddr, startup_size)

checksum (image_paddr + startup_size, stored_size - startup_size)

copy (image_paddr, ram_paddr, startup_size)

jump (startup_vaddr)

l         

IPL的燒寫和更新

1.于系統ROM中,初始時可以需要進行晶片燒錄。

2.支援整片晶片的夾具燒錄。

3.支援UI界面燒錄:

開發SPI總結ROM晶片寫程式,在UI層調用此燒錄程式直接寫BIN檔案。

l         

IPL的開發用例

1.以下為IPL的源碼目錄結構

2.以下為IPL的用例代碼:

#include "ipl.h"

unsigned int image;

int main (void)

{

    image = image_scan (0x2840000, 0x2841000);

    image_setup (image);

    image_start (image);

    return (0);

}

2.2鏡像定義

QNX中鏡像分為:

1.啟動鏡像

内容包括:neutrino os,啟動單元,執行程式及相關的庫,資料和檔案。

每個QNX系統必需僅包含一個啟動鏡像,隻讀,啟動鏡像的格式如下:

l           Boot prefix的位址,通過virtual= or

physical= attribute屬性拽定FLASH中的實體起始位址。

l        boot prefix, startup header, startup, and startup trailer隻是帶啟動功能的鏡像中出現。

l        the startup trailer the image trailer中定義的相關的checksum。

2.非啟動鏡像

用于一些獨立的,獨立配置的場景。具體用處未知。隻讀。

2.3制作啟動鏡像(FLASH)

1.            

利用mkifs工具制作neutrino啟動鏡像。

2.            

利用mkefs工具制作apps程式分區鏡像。

3.            

利用mkefs工具制作datas資料分區鏡像。

4.            

利用mkimage工具将以下三個鏡像整合為一個鏡像。

5.            

利用mkrec工具進行鏡像的FLASH格式轉化。(可選)

6.            

利用cat或cp工具,将鏡像拷貝到FLASH中(/dev/fsp0)。

n        

設定環境變量

export PATH=/opt/bins:$PATH

export LD_LIBRARY_PATH=/opt/bins:$ LD_LIBRARY_PATH

n        

在buildfile腳本的檔案名前加入相關的權限

# 檔案權限設定

[uid=0 gid=0 perms=0666] file1

# 批量設定檔案權限

[uid=5 gid=1 perms=0666]

file1

file2

file3

file4

# 内嵌檔案的權限為執行mkifs的使用者權限。

n        

檔案目錄放置

# 将本地/release_1.0的目錄及所屬放置于目标版的/product目錄下。

/product=/release_1.0

n        

生成image

mkifs shell.bld shell.ifs

n        

顯示image内容

Dumpifs

n        

整合FLASH整片檔案系統

1.    

利用mkifs建立帶啟動功能的rootfs檔案系統.

mkifs rootfs.bld

rtoofs.ifs

2.   

利用mkefs建立FLASH APP和DATAS分區檔案系統

mkefs appfs.bld

app.ifs

mkefs datafs.bld

data.ifs

       mkimage nto.ifs fs.ifs > flash.ifs      
       mkrec -s 256k flash.ifs > flash.srec      

n        

擦除FLASH

       flashctl -p /dev/fs0 -e      

n        

FHASH燒寫

       cat ipl_image flash_image > /dev/fs0      
       cat flash_image > /dev/fs0p1      

3.      

系統災難恢複方法

1.            

整盤恢複(清空使用者資料)

n         制作核心鏡像,啟動鏡像,應用鏡像和資料鏡像,并将四個鏡像檔案合并為一個鏡像target.img。

n         制作SD/USB卡啟動鏡像,包含待更新的target.img;内置一個應用程式,功能為:利用cp工具讀取target.img檔案,并寫入到FLASH中,界面顯示更新進度條及相關風險提示資訊。

n         制作IPL,支援啟動順序為:SD/USB/FLASH。

n         插入SD卡啟動鏡像,自動完成更新,更新完成後拔出SD卡。

2.            

整盤恢複(保留使用者資料)

n         制作核心鏡像,啟動鏡像,應用鏡像。

n         制作SD/USB卡啟動鏡像,包含以上的三個鏡像;内置一個應用程式,功能為:利用cp工具将以上三個鏡像分别寫入相應的FLASH分區中,界面顯示更新進度條及相關風險提示資訊。

cat rootfs_image > /dev/fs0p3      
cat app_image > /dev/fs0p2      
cp os_image  /dev/fs0p1      

n         制作IPL,支援啟動順序為:SD/USB/FLASH。

n         插入SD卡啟動鏡像,自動完成更新,更新完成後拔出SD卡。

4.      

附錄

4.1制作啟動鏡像的腳本用例

[virtual=x86,bios +compress] .bootstrap = {      
    startup-bios      
    PATH=/proc/boot:/bin procnto      
}      
[+script] .script = {      
    devc-con -e -n5 &      
    reopen /dev/con1      
    devf-i365sl -r -b3 -m2 -u2 -t4 &      
    waitfor /fs0p0      
    [+session] TERM=qansi PATH=/proc/boot:/bin esh &      
}      
[type=link] /tmp=/dev/shmem      
[type=link] /bin=/fs0p0/bin      
[type=link] /etc=/fs0p0/etc      
libc.so      
[type=link] /usr/lib/ldqnx.so.2=/proc/boot/libc.so      
libsocket.so      
[data=copy]      
devf-i365sl      
devc-con      
esh      

5.      

      問題探讨

1.         根分區如何挂載和制作,還是直接規劃到OS image中。      
2.         應用和資料分區是做成QNX6檔案系統還是做成ETFS檔案系統(征對FLASH),如何制作。      
3.         以上為大體的方案,但是細節地方還是有些需要深入研究。比如:      
      FLASH分區有FAT,QNX6等,是否能将各分區的檔案系統合并成一個檔案進行燒錄?      
      比如資料和應用分區是用mkefs生成ffs3的檔案系統還是利用mketfs生成etfs的檔案系統好?      

繼續閱讀