[轉]QNX系統開發-鏡像製作及燒錄分析

如果你認爲本系列文章對你有所幫助,請大家有錢的捧個錢場,點擊此處贊助,贊助額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 is located at 0x2840000    

 * Therefore, we don't require an image_download_8250 function

 */

    image = image_scan (0x2840000, 0x2841000);

/*

 * Copy startup to ram; it will do any necessary work on the image

 */

    image_setup (image);

/*

 * Set up link register and jump to startup entry point

 */

    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的文件系統好?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章