新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 嵌入式linux的移植的理論問題

        嵌入式linux的移植的理論問題

        作者: 時間:2010-12-26 來源:網絡 收藏
          的基本概念:

          是指將軟件從一個平臺遷移到另一個平臺

          * 從一個硬件平臺到另一個硬件平臺

          * 從一個操作系統移植到另一個操作系統

          * 從一種軟件庫環境移植到另一個軟件庫環境

          軟件進行移植的容易程度即可移植性

          硬件平臺:

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

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

          統稱sub-architecture。以arm體系結構舉例

          * variants 包括arm7tdmi, arm926ejs, strongarm,xscale

          * machine 包括edb7312, smdk2410, omap-h2

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

          處理器字長,定義為處理器一次能處理的位數。

          字長等于處理器內部通路的寬度,一般可以通過通用寄存器的寬度來判斷

          處理器字長會影響int, long等C類型的長度

          C代碼當中需要使用確定大小的類型,可以使用顯式長度的類型u8, s8, u16, s16, u32, s32, u64, s64

          數據對齊:

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

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

          * 頁對齊n*PAGESIZE

          * Cache line對齊n*CLINESIZE

          數據訪問要求至少是字對齊的,多數情況下編譯器會處理數據訪問的對齊。不對齊訪問的例子

          * char a[10];

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

          * unsigned l = *pl;

          字節順序:

          字節順序byte order是指一個字中字節排列的順序

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

          * x86 little-endian

          * ppc big-endian

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

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

          * u23 __cpu_to_be32(u32);

          * u32 __cpu_to_le32(u32);

          * u32 __be32_to_cpu(u32);

          * u32 __le32_to_cpus(u32);

          時間:

          軟件中的與時間相關的代碼也會影響移植

          采用平臺無關的時間表達方法可以提高代碼可移植性

          Linux內核里面采用HZ來表示每秒鐘有多少個內部時鐘滴答,以下對時間的描述是平臺無關的

          * HZ

          * (2*HZ)

          * (HZ/2)

          * (HZ/100)

          * (2*HZ/100)

          內存頁面大小:

          Linux使用虛擬內存機制來管理內存,內存的使用基于頁面。

          不同的體系結構有不同的頁面大小

          常用的32位處理器使用4kB頁面大小

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

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

          * PAGE_SIZE表示頁面大小

          * PAGE_SHIFT表示頁面號在地址中的偏移量

          * 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內核的平臺相關代碼:

          Linux內核對多平臺有很好的支持 內核的對外部接口是統一的,并且與平臺無關

          內核的大多數代碼也是與平臺無關的主要的體系結構相關代碼存在于

          * arch/architecture

          * include/asm-architecture

          比如arm體系的平臺相關代碼主要是

          * arch/arm

          * include/asm-arm

          已有代碼向Linux內核移植:

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

          * 內核中沒有標準C庫支持

          * 內核中沒有象用戶程序那樣的內存保護

          * 內核中不便使用浮點操作

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

          * 在內核中需要編程者考慮并發帶來的競爭與冒險,以及同步問題

          Linux內核移植:

          Linux內核代碼可以分為平臺相關部分和平臺無關部分

          Linux內核絕大部分代碼是平臺無關的,

          可以被各種平臺所共享

          * 調度算法

          * 存儲器管理

          * I/O子系統

          * 網絡協議棧

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

          * ARCH = x86 即打開x86特有的代碼

          * ARCH = arm 即打開arm特有的代碼

          Linux內核的arch目錄:

          進入arch目錄,每個體系結構代碼都有一個子目錄

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

          實現sub-arch:

          在sub-arch子目錄下,以mach-s3c2410為例 一個硬件平臺支持需要實現以下幾個硬件相關的文件

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

          * 同時在include/asm-arm/arch-s3c2410要實現

          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中,我們要定義以下幾個內容

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

          在這個板描述文件中還要定義

          .phys_ram

          .phys_io

          .io_pg_offst

          .boot_params

          .map_io

          .init_irq

          .timer

          map_io:

          map_io里面需要實現設備io的初始化

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

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

          init_irq:

          在這個調用里面,關于中斷的初始化將會被完成

          * 清除中斷pending寄存器

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

          * 設置系統中的設備中斷

          timer:

          timer是一個sys_timer類型的結構,它包含以下成員

          -init 調用執行硬件相關的timer初始化

          -offset 調用返回自從上次timer中斷以來經過的微秒數

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

          應用程序移植:

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

          * busybox

          * bash

          * sysv init

          依賴某些平臺特性的應用程序移植起來往往難度更大

          * 圖形庫

          * 為速度進行優化的代碼,比如編解碼器

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

          軟件協議/源代碼的開放程度

          應用程序移植常見問題:

          1依賴軟件造成移植性問題

          * C庫版本問題

          * 圖形庫帶來的問題

          * 軟件依賴某些服務帶來問題

          2網絡應用在little-endian平臺上的處理

          * 網絡傳遞數據是big-endian的

          3軟件依賴特定平臺的特性

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

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


        關鍵詞: 移植 Linux 數據

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 塔城市| 吕梁市| 晴隆县| 乳山市| 舞钢市| 宁城县| 合阳县| 赞皇县| 静安区| 贵州省| 奇台县| 新巴尔虎右旗| 孝义市| 昌黎县| 鞍山市| 喀喇沁旗| 安化县| 肥城市| 濉溪县| 晋中市| 宁晋县| 吉隆县| 平乐县| 信丰县| 溧水县| 龙陵县| 遂平县| 娱乐| 南澳县| 读书| 玉溪市| 黄山市| 凭祥市| 平谷区| 醴陵市| 宜宾市| 宜良县| 南京市| 勃利县| 凉城县| 乌拉特前旗|