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