<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Linux基礎架構在晶心平臺上的移植研究

Linux基礎架構在晶心平臺上的移植研究

作者: 時(shí)間:2012-04-10 來(lái)源:網(wǎng)絡(luò ) 收藏

鑒于越來(lái)越多使用者將移植到晶心平臺(Andes Embedded™)上(AndesCore™ N12或N10),本文的目的在協(xié)助使用者快速、有效率的將 移植到自建的板子上(CPU是AndesCore™ 的 N12或N10)。筆者曾協(xié)助多家公司工程師進(jìn)行移植到晶心平臺的工作,將Linux移植過(guò)程容易遭遇的問(wèn)題與盲點(diǎn)進(jìn)行實(shí)際說(shuō)明,期望能對使用者有所幫助,也希望讀者不吝指教提供您寶貴的意見(jiàn)。

本文引用地址:http://dyxdggzs.com/article/257587.htm

在進(jìn)行Linux移植時(shí)會(huì )發(fā)現,使用者的晶心平臺可能會(huì )有各式各樣的組合,除了CPU是使用N12或N10外,使用者對于其他的周邊(如RAM,ROM,Timer…..)之搭配各有所好,為了有系統性說(shuō)明Linux移植的要領(lǐng),將選定一明確的硬件,軟件,與開(kāi)發(fā)工具(toolchain)環(huán)境做演練說(shuō)明,除了讓讀者可以實(shí)作明了文中的敘述,當使用者的周邊非原設計的硬件(用戶(hù)自己的IP)時(shí),可以運用移植的基本原則,更改希望移植IP的Linux驅動(dòng)程序,其他原始碼不動(dòng),逐一的將使用者的周邊驅動(dòng)程序移植到晶心的平臺。

在Linux移植過(guò)程中,使用者須建立一基本觀(guān)念,那就是整個(gè)Linux OS可分為兩部分,第一部分是與硬件相關(guān)的HW dependence code,這部分的程序代碼會(huì )因對應不同的硬件而造成軟件部分需做不同程度的改寫(xiě);第二部份是與硬件無(wú)關(guān)的generic code,這部分的程序代碼與硬件無(wú)關(guān),純軟件運作,不會(huì )因平臺(Andes, X86, Arm..)的改變而有差別。移植Linux的工程師第一步需要能區分出哪一部分程序代碼是 HW dependence code,另外部分的程序代碼就是generic code,如果在這階段對程序代碼判斷錯誤(HW dependence code/generic code)會(huì )拖延Linux移植的進(jìn)程并增加調試時(shí)的困難。

Linux移植到晶心平臺過(guò)程中,首先須先做到Linux移植成功。在調試時(shí),Linux的組件是CPU,timer,interrupt與UART,當CPU與這3項周邊移植成功后,scheduler可以運行了,printk也可以運行了Linux系統已經(jīng)可以正常的運作了。接下來(lái)的工作只需將需移植的驅動(dòng)程序一個(gè)一個(gè)移植即可,基礎骨架移植完成后,調試也有printk可用,接下來(lái)只需將肉 (需要加的device drivers) 填上即可。Linux移植比較困難的地方是Linux尚未完成之前(Linux移植的初期階段)的調試,所幸晶心提供的標準調試工具與AndeShape™的調試器AICE,可以一步一步找出問(wèn)題之所在,讓初期移植Linux的調試也變得很簡(jiǎn)單,具體得作法,后文會(huì )詳細說(shuō)明。本文敘述重點(diǎn)是如何在晶心平臺上建立Linux基礎架構,至于個(gè)別Linux 驅動(dòng)程序的移植,坊間有許多的書(shū)在介紹,本文就不多加贅述。

1. 開(kāi)發(fā)環(huán)境與程序

使用者開(kāi)始進(jìn)行Linux移植到晶心平臺,首先須先選定一版晶心的Linux原始碼作為基準再進(jìn)行軟件移植,修改原始碼以符合使用者的開(kāi)發(fā)平臺,經(jīng)由工具鏈的compile與link所產(chǎn)生的Linux的映像文件,再放到板上以驗證程序編寫(xiě)的正確與否,依此開(kāi)發(fā)程序:軟件編寫(xiě)->板驗證,再回到軟件編寫(xiě)程序直到所有周邊IP在FPGA板上驗證完全,Linux 移植才完成,如圖表 1所示,Linux移植過(guò)程中,AICE調試可以有效加快Linux移植的速度。

圖表 SEQ 圖表 * ARABIC 1 Linux 移植的開(kāi)發(fā)流程

本文選定一組Linux原始碼、工具鏈、FPGA 板和netlist作為晶心的平臺(于1.1,1.2,1.3中所述)進(jìn)行linux的移植。讀者可將自己的平臺與晶心的平臺做類(lèi)比,從而有效縮短產(chǎn)品開(kāi)發(fā)進(jìn)程。

1.1 晶心版Linux原始碼

目前晶心最新版本的Linux原始碼在A(yíng)ndeSoft™的BSP310中,Linux原始碼在BSP310套件中的位置為: BSPv310/source/Linux/linux-2.6.tgz。使用BSP310中的ramdisk ”xc5_glibc_ramdisk.img”作為filesystem。

1.2 工具鏈

此晶心平臺選用的工具鏈是AndeSoft™的nds32le-linux-glibc-v2。

1.3 FPGA 板子與 netlist

FPGA板子是晶心AndeShape™的 XC5 開(kāi)發(fā)板。Netlist 為晶心AndesCore™的N10 production version.

移植平臺是指使用者要移植Linux的平臺,也就是移植Linux的目標平臺。將移植平臺與晶心平臺的比較列表如下: (其中所列之軟件皆屬于BSP310中之套件)。


移植平臺

晶心平臺

說(shuō)明

Linux原始碼

linux-2.6.tgz

linux-2.6.tgz

使用者應從晶心版原始碼進(jìn)行開(kāi)發(fā)

工具鏈

nds32le-linux-glibc-v2

nds32le-linux-glibc-v2

使用者如用新版的AndesCore™,可更換新的對應工具鏈

FPGA板子

使用者設計

XC5

Netlist

使用者生成

N10 production version

圖表 SEQ 圖表 * ARABIC 2平臺與晶心平臺的比較表

2. Boot loader

如果使用者有自己慣用的boot loader,可以使用慣用的boot loader以加快開(kāi)發(fā)時(shí)程,如果沒(méi)有boot loader的開(kāi)發(fā)經(jīng)驗,可以選用u-boot作為系統的boot loader.。u-boot的source ocde位置在BSPv310/source/Standalone/u-boot/u-boot.tgz。

2.1 U-boot

AndeSoft™的BSP310中u-boot source code是需要EBIOS boot up后再執行的u-boot版本。直接boot up不需要其他軟件協(xié)助的U-boot版本(ROM版)是比較符合使用者的需要,晶心版的u-boot使用方法請參考BSP310 User Manual。如果要ROM版的u-boot需要在BSP310中的u-boot軟件做patch,其指令如下:

# patch -p1

n patching file arch/nds32/cpu/n1213/ag101/cpu.c

n patching file arch/nds32/cpu/n1213/start.S

n patching file arch/nds32/include/asm/u-boot-nds32.h

n patching file arch/nds32/lib/board.c

n patching file board/AndesTech/adp-ag101p/config.mk

n patching file include/configs/adp-ag101p.h

patch 完成的u-boot source code 可以產(chǎn)生ROM版的u-boot image,直接開(kāi)機后的執行結果如圖表3所示。

圖表 SEQ 圖表 * ARABIC 3 u-boot 執行結果圖

3. 調試環(huán)境

在移植Linux到晶心平臺之前,先架設好調試的環(huán)境,尤其對底層Linux原始碼的移植,有莫大的幫助,在 printk尚未正常運作前,需依靠AndeShape™的AICE與 AndeSoft™的GDB來(lái)進(jìn)行調試。

3.1設定Linux kernel 調試選項

Linux Kernel 需要設定一些調試選項,才能順利的運用AndeSoft™的GDB進(jìn)行調試。晶心平臺中Linux kernel 調試選項設定如圖表4所示,增加這些選項會(huì )增加kernel 映像文件的空間,如果空間占用過(guò)大以至于不符合設計需求時(shí),可在調試工作完畢后將調試選項關(guān)閉以節約不必要的空間浪費。

圖表4設定Kernel hacking 中調試選項勾選

3.2 Linux kernel 調試的程序

Build成kernel bootpImage (含kernel debug message如圖表四選項) 后,Linux的映像檔放到FPGA板子上,PC host 端的AndeSoft™的GDB透過(guò)網(wǎng)絡(luò )(socket)與AICE連接至FPGA板子,進(jìn)行調試的工作。

3.2.1. 編譯鏈結成映像檔

設定好AndeSoft™的 cross-compiler 路徑后,利用下列指令經(jīng)由compiler and linker后可以得到 bootpImage,指令如下:

#CROSS_COMPILE=nds32le-linux- ARCH=nds32 make xc5_defconfig

#CROSS_COMPILE=nds32le-linux- ARCH=nds32 make menuconfig

# CROSS_COMPILE=nds32le-linux- ARCH=nds32 make bootpImage INITRD=xc5_glibc_ramdisk.img

將生成的bootpIamge放到FPGA板子上,將AICE連接到FPGA板子啟動(dòng)ICEman,指令如下:

#C:AndestechAndeSight200MCUice>ICEman.exe --p 1234

PC host端的AndeSoft™的GDB透過(guò)網(wǎng)絡(luò )(socket)與AICE連接至FPGA板子,進(jìn)行調試的工作,示范指令如下:

#ddd --debugger nds32le-linux-gdb vmlinux

gdb>target remote 10.0.2.164:1234

其中IP值 10.0.2.164是一個(gè)應用范例,用戶(hù)可依環(huán)境實(shí)際IP值進(jìn)行設定。環(huán)境設定完成后,可以開(kāi)始進(jìn)行調試工程。

4. 移植Linux至晶心平臺關(guān)鍵點(diǎn)經(jīng)驗傳承

4.1 Kernel加載程序調試實(shí)作

kernel加載程序目的將kernel主程序進(jìn)行解壓縮并加載正確位置,此程序與kernel主程序是兩個(gè)不同程序,但會(huì )一起包在zImage中只是kernel加載程序會(huì )attached在zImage的前面。調試時(shí)需 file不同的 ELF file才能進(jìn)行正確的調試工作,kernel加載程序的位置在arch/nds32/boot/compressed/vmlinux,指令如下所示。

#ddd --debugger nds32le-linux-gdb arch/nds32/boot/compressed/vmlinux

kernel主程序的ELF file “vmlinux”在kernel source code的根目錄下指令如下所示。

#ddd --debugger nds32le-linux-gdb vmlinux

4.2 Linux kernel 調試實(shí)作

kernel加載程序執行完畢后會(huì )跳到kernel主程序執行。進(jìn)入點(diǎn)是arch/nds32/kernel/head.S的assembly code執行完后會(huì )進(jìn)入 kernel 的主要函數 “start_kernel”。

4.2.1. RAM offset patch

晶心版Linux原始碼搭配XC5平臺,RAM的起始位置(指的是PA)是0x0,使用者FPGA開(kāi)發(fā)板的RAM起始位置如果不是0x0,必須要修改FPGA板子中RAM的起始位置,做法是在晶心版的Linux原始碼中進(jìn)行RAM address patch,將原始碼中RAM位置調整到FPGA開(kāi)發(fā)板中RAM的真實(shí)位置。

4.2.2. PA/VA remap table

當FPGA板子IO的PA設定正確后,使用者需要設定PA/VA remap table,作法可參考arch/nds32/include/asm/spec-ag101.h,依照apec-ag101.h中PA/VA對應的關(guān)系去增減使用者自己IO device的 PA/VA remap table。

4.2.3. Kernel 解壓縮與software breakpoint

在進(jìn)行kernel 調試時(shí),如果在低地址處,例如:head.S中進(jìn)行調試,當設定 software breakpoint時(shí),會(huì )有breakpoint無(wú)法停下來(lái)與AICE 斷線(xiàn)的情況發(fā)生。原因是當使用者設定software breakpoint時(shí),breakpoint處的instruction會(huì )修改并加入break instruction。但kernel解壓縮時(shí)會(huì )將調試的程序代碼覆蓋造成與GDB調試不一致性而產(chǎn)生錯誤。解決的方法就是原設定software breakpoint改為hardware breakpoint,這樣就可以避免因kernel解壓縮所造成調試的錯誤,降低調試時(shí)的困難度。

4.2.4. PA/VA 觀(guān)念說(shuō)明與調試要領(lǐng)

在原始碼arch/nds32/kernel/head.S中

la $lp, __mmap_switched

mtsr $lp, $IPC

iret

執行完iret后,系統就會(huì )從PA轉成VA,MMU translation status從translation off轉為translation on在此分界處調試規則如下所述,如果觀(guān)念不清楚及容易產(chǎn)生調試時(shí)的錯誤,請務(wù)必牢記。

4.2.4.1. MMU translation off 時(shí)期調試

在這個(gè)時(shí)期調試,VA是不存在的。所有的IO address與memory都是PA沒(méi)有VA,如果調試地址設成VA,容易hit illegal address 而造成exception。

4.2.4.2. MMU translation on 時(shí)期調試

在這個(gè)時(shí)期調試,PA是不存在的。所有的IO address與memory都是VA沒(méi)有PA,如果調試地址設成PA,容易hit illegal address 而造成exception.

4.2.5. 移植Linux的基礎組件

MMU translation on后,很快就會(huì )進(jìn)入start_kernel 函數,接下來(lái)移植的重點(diǎn)就是移植Linux基礎組件,那就是interrupt,timer and UART。當這3個(gè)device移植成功后,Linux的架構就建立起來(lái)了,printk也可以用了,Linux已經(jīng)可以正常的運作。如果沒(méi)有意外,可以執行完kernel甚至將filesystem帶起來(lái)。接下來(lái)用戶(hù)可以將自己的周邊組件一個(gè)一個(gè)的device driver移植入系統。當周邊組件移植完成后,Linux系統移植到晶心平臺就完成了。

5. 結語(yǔ)

Linux操作系統運作在晶心平臺已有多年的時(shí)間。各式各樣的Linux軟件運作在晶心平臺不計其數。皆可證明Linux操作系統運作結合晶心平臺是一個(gè)穩定與成熟的產(chǎn)品,只要能明了熟悉Linux 移植的技巧與重點(diǎn),使用晶心平臺開(kāi)發(fā)Linux的產(chǎn)品將是一件愉快與簡(jiǎn)單的工作。

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


關(guān)鍵詞: FPGA Linux 基礎架構

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>