<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的移植的理論問(wèn)題

嵌入式linux的移植的理論問(wèn)題

作者: 時(shí)間:2010-12-26 來(lái)源:網(wǎng)絡(luò ) 收藏
  的基本概念:

  是指將軟件從一個(gè)平臺遷移到另一個(gè)平臺

  * 從一個(gè)硬件平臺到另一個(gè)硬件平臺

  * 從一個(gè)操作系統移植到另一個(gè)操作系統

  * 從一種軟件庫環(huán)境移植到另一個(gè)軟件庫環(huán)境

  軟件進(jìn)行移植的容易程度即可移植性

  硬件平臺:

  在內核里,每一個(gè)處理器指令集對應一個(gè)獨立的體系結構architecture,比如alpha, arm,i386, mips, ppc

  每個(gè)體系結構可以有若干變種variant,或不同配置的硬件machine

  統稱(chēng)sub-architecture。以arm體系結構舉例

  * variants 包括arm7tdmi, arm926ejs, strongarm,xscale

  * machine 包括edb7312, smdk2410, omap-h2

  硬件平臺對C程序的影響:

  處理器字長(cháng),定義為處理器一次能處理的位數。

  字長(cháng)等于處理器內部通路的寬度,一般可以通過(guò)通用寄存器的寬度來(lái)判斷

  處理器字長(cháng)會(huì )影響int, long等C類(lèi)型的長(cháng)度

  C代碼當中需要使用確定大小的類(lèi)型,可以使用顯式長(cháng)度的類(lèi)型u8, s8, u16, s16, u32, s32, u64, s64

  數據對齊:

  數據對齊是指數據塊的地址是某個(gè)特定大小的整數倍

  * 32位處理器字對齊n*4

  * 頁(yè)對齊n*PAGESIZE

  * Cache line對齊n*CLINESIZE

  數據訪(fǎng)問(wèn)要求至少是字對齊的,多數情況下編譯器會(huì )處理數據訪(fǎng)問(wèn)的對齊。不對齊訪(fǎng)問(wèn)的例子

  * char a[10];

  * unsigned long* pl = (unsigned long *)(a+1);

  * unsigned l = *pl;

  字節順序:

  字節順序byte order是指一個(gè)字中字節排列的順序

  不同硬件可能采用不同byte order

  * x86 little-endian

  * ppc big-endian

  內核將硬件的byte order放在asm/byteorder.h> 里面定義,__BIG_ENDIAN或__LITTLE_ENDIAN

  在include/linux/byteorder /里面有幾個(gè)頭文件,定義了

  * u23 __cpu_to_be32(u32);

  * u32 __cpu_to_le32(u32);

  * u32 __be32_to_cpu(u32);

  * u32 __le32_to_cpus(u32);

  時(shí)間:

  軟件中的與時(shí)間相關(guān)的代碼也會(huì )影響移植

  采用平臺無(wú)關(guān)的時(shí)間表達方法可以提高代碼可移植性

  Linux內核里面采用HZ來(lái)表示每秒鐘有多少個(gè)內部時(shí)鐘滴答,以下對時(shí)間的描述是平臺無(wú)關(guān)的

  * HZ

  * (2*HZ)

  * (HZ/2)

  * (HZ/100)

  * (2*HZ/100)

  內存頁(yè)面大?。?/STRONG>

  Linux使用虛擬內存機制來(lái)管理內存,內存的使用基于頁(yè)面。

  不同的體系結構有不同的頁(yè)面大小

  常用的32位處理器使用4kB頁(yè)面大小

  部分體系結構可以支持多種頁(yè)面大小

  內核在asm/page.h>里面定義PAGE_SIZE,PAGE_SHIFT

  * PAGE_SIZE表示頁(yè)面大小

  * PAGE_SHIFT表示頁(yè)面號在地址中的偏移量

  * PAGE_SIZE=2^ PAGE_SHIFT

  Linux操作系統移植:

  工具鏈移植

  * binutils (assembler, linker..)

  * gcc (compiler, libgcc)

  * glibc/uclibc

  內核移植

  * arch implementation

  * drivers porting

  應用程序移植

  * C program recompile

  * Implement absent library

  Linux內核的平臺相關(guān)代碼:

  Linux內核對多平臺有很好的支持 內核的對外部接口是統一的,并且與平臺無(wú)關(guān)

  內核的大多數代碼也是與平臺無(wú)關(guān)的主要的體系結構相關(guān)代碼存在于

  * arch/architecture

  * include/asm-architecture

  比如arm體系的平臺相關(guān)代碼主要是

  * arch/arm

  * include/asm-arm

  已有代碼向Linux內核移植:

  將已有代碼向內核中移植有一些限制

  * 內核中沒(méi)有標準C庫支持

  * 內核中沒(méi)有象用戶(hù)程序那樣的內存保護

  * 內核中不便使用浮點(diǎn)操作

  * 內核的堆棧是固定大小的,并且比較有限

  * 在內核中需要編程者考慮并發(fā)帶來(lái)的競爭與冒險,以及同步問(wèn)題

  Linux內核移植:

  Linux內核代碼可以分為平臺相關(guān)部分和平臺無(wú)關(guān)部分

  Linux內核絕大部分代碼是平臺無(wú)關(guān)的,

  可以被各種平臺所共享

  * 調度算法

  * 存儲器管理

  * I/O子系統

  * 網(wǎng)絡(luò )協(xié)議棧

  依賴(lài)于特定硬件的代碼在Linux中采用條件編譯的方式區分

  * ARCH = x86 即打開(kāi)x86特有的代碼

  * ARCH = arm 即打開(kāi)arm特有的代碼

  Linux內核的arch目錄:

  進(jìn)入arch目錄,每個(gè)體系結構代碼都有一個(gè)子目錄

  進(jìn)入arm目錄,在arm體系結構下我們可以看到很多sub-arch的子目錄

  實(shí)現sub-arch:

  在sub-arch子目錄下,以mach-s3c2410為例 一個(gè)硬件平臺支持需要實(shí)現以下幾個(gè)硬件相關(guān)的文件

  * mach-s3c2410.c, irq.c, clock.c, dma.c, gpio.c, pm.c,sleep.c, time.c

  * 同時(shí)在include/asm-arm/arch-s3c2410要實(shí)現

  Low-level IRQ helper macros

  Debug output macros

  Irq number definations

  DMA definations

  Memory mapping/translation

  Reset operation

  IDLE function

  mach-smdk2410.c:

  在mach-smdk2410.c中,我們要定義以下幾個(gè)內容

  smdk2410_iodesc,描述了所有保留的設備io地址。這個(gè)描述符是我們移植一個(gè)特定目標板非常重要的地方

  在這個(gè)板描述文件中還要定義

  .phys_ram

  .phys_io

  .io_pg_offst

  .boot_params

  .map_io

  .init_irq

  .timer

  map_io:

  map_io里面需要實(shí)現設備io的初始化

  在這里要用到smdk2410_iodesc描述符。該描述符是一個(gè)數組,其中每一項都描述了一個(gè)設備的IO映射

  時(shí)鐘pll的設置、uart的設置都可以在map_io中調用

  init_irq:

  在這個(gè)調用里面,關(guān)于中斷的初始化將會(huì )被完成

  * 清除中斷pending寄存器

  * 注冊主要的中斷處理程序

  * 設置系統中的設備中斷

  timer:

  timer是一個(gè)sys_timer類(lèi)型的結構,它包含以下成員

  -init 調用執行硬件相關(guān)的timer初始化

  -offset 調用返回自從上次timer中斷以來(lái)經(jīng)過(guò)的微秒數

  -resume 調用執行系統喚醒后的timer恢復操作,一般實(shí)現上和init里面的初始化一樣

  應用程序移植:

  最理想情況下,程序可以不作更改,或僅僅打一些補丁,然后告訴編譯環(huán)境按照目標環(huán)境要求編譯即可

  * busybox

  * bash

  * sysv init

  依賴(lài)某些平臺特性的應用程序移植起來(lái)往往難度更大

  * 圖形庫

  * 為速度進(jìn)行優(yōu)化的代碼,比如編解碼器

  軟件編程語(yǔ)言的跨平臺性直接影響軟件的可移植性。此外還有其他因素

  軟件協(xié)議/源代碼的開(kāi)放程度

  應用程序移植常見(jiàn)問(wèn)題:

  1依賴(lài)軟件造成移植性問(wèn)題

  * C庫版本問(wèn)題

  * 圖形庫帶來(lái)的問(wèn)題

  * 軟件依賴(lài)某些服務(wù)帶來(lái)問(wèn)題

  2網(wǎng)絡(luò )應用在little-endian平臺上的處理

  * 網(wǎng)絡(luò )傳遞數據是big-endian的

  3軟件依賴(lài)特定平臺的特性

  4平臺的數據一致性模型差異

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


關(guān)鍵詞: 移植 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>