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