999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

嵌入式Linux在SH4架構下的移植技術研究

2008-04-12 00:00:00關勝曉刁智華
現代電子技術 2008年24期

摘 要:SuperH系列微處理器是Renesas公司(原Hitachi)開發的采用了RISC系統指令集的32位系列微處理器。詳細介紹SH4系列交叉編譯平臺在新版本編譯器下的配置過程,提出一種適用于SuperH系列微處理器的通用的內核移植的方法并研究Linux 2.6內核在SH4系列微處理器SH7751上的移植方案。實驗證明該方法可行,移植過程也對其他平臺有借鑒作用。

關鍵詞:SuperH;Linux2.6;嵌入式系統;內核移植

中圖分類號:TN21;TP311文獻標識碼:A

文章編號:1004-373X(2008)24-058-03

Research of Porting Embedded Linux Based on SH4

WANG Ruo,GUAN Shengxiao,DIAO Zhihua

(USTC-Renesas Joint Library,University of Science and Technology of China,Hefei,230026,China)

Abstract: SuperH is a series of 32bit RISC MPU production of Renesas Company.The paper provides a method of porting embedded Linux kernel 2.6 to SH7751 and introduces the way of establishing crosstool in SH4 series MPU.The result proves it viable and helpful to other architecture of MPUs.And the migration process is also helpful to the other platform.The paper presents a common core transplant method applicable to series of SuperH microprocessor.

Keywords:SuperH;Linux2.6;embedded system;core transplant

1 引 言

Renesas公司的SuperH系列微處理器是由原Hitachi公司設計開發,由SuperH公司提供CPU技術支持。SH7751屬于微處理器SH4系列,有著較高的工作頻率和處理性能(430 MIPS/ 240 MHz)。Linux 2.6內核相對于先前版本的內核在可配置性方面有了較大的改進,內核的可搶占和響應時間的改進使其在應用軟件性能上更加優異。由于支持高檔的電源管理APM,就為各種手持設備和對電源管理比較嚴格的嵌入式系統提供了良好的平臺支持,越來越多的嵌入式系統陸續將Linux2.6作為開發的基礎平臺。因此將新內核移植并建立開發環境成為進行嵌入式系統開發首先要進行的工作。一般對內核移植的具體工作可以分為3個步驟:建立交叉編譯工具鏈(Toolchain);內核的配置和剪裁;建立根文件系統并配置bootloader。

SH系列微處理器進行嵌入式Linux移植也是按照上述3個步驟進行,但在新版本編譯器環境下移植Linux2.6過程與先前版本的配置有較大差。

2 交叉編譯環境的建立

2.1 交叉編譯源文件和工具的選取

交叉編譯是指在宿主機器(Host)上生成針對特定平臺代碼(Target)的過程。實驗中使用的是x86平臺下的debian4.0的宿主機對SH4系列平臺代碼進行交叉編譯,從而生成在SH4系列MPU上可運行的代碼。進行交叉編譯的一系列工具即稱為交叉編譯工具鏈。

交叉編譯工具主要由binutils,gcc 和 glibc組成。由于SH4系列微處理器應用較少,一些著名的交叉編譯工具如CLFS,crosstool均未提供對SH4系列環境的支持。有較多的SH系列微處理器開發板廠商提供了對Linux的開發工具包,但提供的大都是2.4版本的內核,并且無法及時得到社區的技術支持。實驗中使用Renesas公司的EDOSK7751R開發平臺,移植中選取負責SH架構Linux內核團隊2007年5月發布的內核穩定版本linux-sh-2.6.20。

在選取C庫過程中由于穩定性考慮選取標準庫glibc,glibc-sh中INSTALL文件指明了binutils和gcc的最低版本和推薦版本,實驗中選取的binutils版本為2.17。

與內核的選取不同,gcc的選取并不建議選用最新的版本,這是因為可能在選用的其他工具軟件進行具體調試中很多陳舊代碼可能在新編譯器下編譯鏈接錯誤較難解決。在實驗中選擇的是gcc4.1.1及gcc的Sh4補丁。實驗中使用的源文件和補丁如下:

binutils-2.17.50.tar.gz

binutils-2.17.50-sh4-linux.tar.gz

gcc4.1.1.tar.gz

gcc4.1.1-sh4-linux.tar.gz

glibc-2.5.3.tar.gz

glibc-2.5.3-sh4-linux.tar.gz

glibc-linuxthreads-2.5.3.tar.gz

glibc-headers-2.5.3.tar.gz

glibc-headers-2.5-3.sh4.tar.gz

linux-sh-2.6.20.10.tar.gz

2.2 內核頭文件的生成。

首先建立工作目錄和一些環境外部變量:

$export PREFIX=/home/ruo

$export PATH=${PREFIX}/usr/bin:${PATH}

內核頭文件是交叉編譯的基礎文件,在較早版本的Linux(如2.4)中交叉編譯中一般通過對內核的配置生成。在Linux2.6環境下配置完內核后,版本頭文件version.h要單獨建立,否則后期glibc無法安裝。解壓linux-sh-2.6.20.10.tar.gz并運行指令:

$tar –xzf linux-sh-2.6.20.10.tar.gz

$cd linux-2.6.20

$make ARCH=sh CROSS_COMPILE=sh4-linux- menuconfig

$make include/linux/version.h

$install -dv ${PREFIX}/usr/include/{asm,asm-generic,linux,rdma,mtd,sound,video}

配置“Processor selection”選擇“support SH7751 processor”,另外根據SH7751系列不同型號CPU的用戶手冊配置其他內核選項。配置完成保存退出后,建立版本頭文件。運行后可查看/include/linux/文件夾中是否生成autoconf.h和version.h是否生成而判定內核頭文件是否創建成功。

將生成的頭文件中asm,asm-generic,linux,rdma,mtd, sound,video七個目錄拷貝到工作目錄${PREFIX}/usr/include中。

2.3 建立引導編譯器(bootstrap gcc)

binutils是一組二進制工具集合,將binutils-2.17和補丁解壓后,打完全部補丁,然后即可安裝生成交叉編譯的二進制工具集合。將libiberty.h文件拷入內核頭文件庫中,編譯后期gcc使用。命令參數如下:

$cd binutils-2.17-sh4-linux

$patch -p1 < ../binutils-2.17-sh4-linux.patch

$patch ....(省略)

$cd ..

$../binutils-2.17/configure --prefix=${PREFIX}/tools --target=sh4-linux

--disable-nls --enable-shared --disable-multilib

$make

$make install

$cp -v include/libiberty.h ${PREFIX}/usr/include

與先前版本不同,gcc3.2后版本安裝引導編譯器必須要獲得glibc的支持。而glibc庫又依靠gcc交叉編譯。為解決這個問題,glibc提供了頭文件供gcc初始編譯器使用。在編譯引導編譯器前,首先要安裝glibc-headers。注意此過程并非交叉編譯glibc,因為沒有gcc引導編譯器是無法進行的。與binutils設置不同,安裝中參數“--host”必須設定為目標平臺架構“sh4-linux”,這樣才能告訴gcc編譯出符合目標系統的信息。在對glibc-headers解壓和補丁處理后,安裝并在工作目錄中建立假文件stubs.h。拷貝pthreadtypes.h文件到內核頭文件中提供本地POSIX線程庫支持,以便后期編譯glibc。命令參數如下:

$CC=gcc ../glibc-2.4/configure --prefix=${PREFIX}/tools

--host=sh4-linux --with-headers=${PREFIX}/usr/include

$make install-headers

$install -dv ${PREFIX}/usr/include/bits

$touch ${PREFIX}/usr/include/gnu/stubs.h

$cp -v nptl/sysdeps/unix/sysv/linux/sh/bits/pthreadtypes.h

${PREFIX}/usr/include/bits

當glibc頭文件安裝完畢,即可安裝引導交叉編譯器。引導編譯器僅是一個C語言的編譯器,作用是對glibc進行交叉編譯,然后使用編譯后的glibc生成完整的支持C++的gcc完整交叉編譯器(full gcc)。解壓并打好補丁后修改對可能使用的某些共享庫的搜索目錄,以便在后期建立完整交叉工具鏈能直接找到共享庫。在/gcc/config/sh/linux.h文件第46行后添加:

#undef LIB_SPEC

#define LIB_SPEC

“%{!static:

%{!m4:-rpath-link /usr/sh4-linux/lib}

%{m4:-rpath-link /usr/sh4-linux/lib/m4}}”

然后進行配置安裝:

$../gcc-4.1.1/configure --prefix=${PREFIX}/tools

--target= sh4-linux --build= i686-linux

--disable-multilib --disable-nls --disable-shared

--enable-languages=c

$make all-gcc

$make install-gcc

2.4 建立完整的交叉編譯工具鏈(full gcc)

在bootstrap gcc的安裝完成后,就可以完整地交叉編譯glibc了。解壓glibc-2.53和glibc-linuxthreads-2.5.3(提供基于POSIX標準的核心線程庫)及補丁文件,即可配置安裝,“--enable-kernel=2.6.0”表示kernel選用2.6.x,并不需要指明詳細版本。配置參數如下:

$CC=sh4-linux-gcc AR=sh4-linux-ar

../glibc-2.5.3/configure --prefix=/home/ruo/tools

--libexecdir=/usr/lib/glibc

--host=sh4-linux --disable-profile --enable-add-ons

--with-tls --enable-kernel=2.6.0 --with-__thread

--with-binutils=${PREFIX}/tools/bin

--with-headers=${PREFIX}/usr/include

完成對gcc的安裝,配置參數如下:

$../gcc-4.1.1/configure --prefix=${PREFIX}/tools

--target=sh4-linux --build= i686-linux

--disable-multilib --disable-nls --enable-shared

--enable-languages=c,c++ --enable-__cxa_atexit

--enable-c99 --enable-long-long --enable-threads=posix

完成后工作目錄下/tools/bin下會生成以一系列“sh4-linux-”為前綴的交叉編譯二進制工具。這樣交叉編譯工具鏈即建立完成。

3 內核的配置和剪裁

與前期建立交叉編譯內核頭文件不同,對內核的配置由于完整的Linux內核對于嵌入式系統來說過于龐大,需經過剪裁非必要的部分達到減小內核鏡像的目的。運行指令:

make ARCH=sh CROSS_COMPILE=sh4-linux- menuconfig

再次進入menuconfig界面,主要配置板級支持,對塊設備RAMdisk、設備驅動及文件系統的支持。可將與內核其他部分關系較遠且不經常使用的功能代碼編譯成為可加載模塊,以有效地減小內核的大小,還可減小內核消耗的內存。當配置完成后即可編譯內核生成內核映像。內核映像可以選擇壓縮或者非壓縮格式,在實際嵌入式系統中一般選擇壓縮內核,這樣能夠有效地減小內核占用體積,編譯壓縮內核映像:

make ARCH=sh CROSS_COMPILE=sh4-linux- zImage

4 根文件系統的建立與配置bootloader

4.1 根文件系統的建立

Linux在啟動期間需要安裝根文件系統,根文件系統也是所有Unix系統所必須的組件。其中常用必需的目錄有:/bin,/dev,/etc,/lib等。bin目錄下放置必要的用戶命令(二進制文件),dev目錄下放置了設備文件,etc目錄下是系統配置文件和啟動文件,lib目錄下放置系統運行庫的文件等。嵌入式Linux一般通過內存來虛擬設備文件,將根文件系統的壓縮鏡像解壓到其中并掛載而創建。建立創建一個名為initrd臨時用于掛載根文件系統的設備點,掛載并建立/bin,/dev,/etc等文件夾:

# mkdir -p /mnt/initrd

# dd if=/dev/zero of=/initrd bs=1k count=6144

# mke2fs -F -m 0 initrd

# mount -o loop /initrd /mnt/initrd

# mkdir dev proc etc etc/rc.d sbin bin lib usr

將配置文件及庫文件拷貝到相關目錄。對于用戶命令的二進制文件可以使用BusyBox來創建。BusyBox 包含了近百種 Linux 上標準的工具程序,僅需要幾百kb空間,在嵌入式系統上非常適合使用以減少根目錄文件大小。可以在sh-linux.org下載到busybox-1.2.0-3.sh4.tar.gz,注意在交叉編譯BusyBox時需要glibc的支持,需要將其所需要的庫文件鏈接到其lib目錄中。

另外內核應該對根文件系統的大小進行配置,在選項“Block Devices”中 “Default RAM disk size”進行大小設置,以便在后期啟動時能夠指示根文件系統目錄的大小。實驗中生成的內核大致在 6 MB左右,所以在先前創建initrd時參數“bs=1k count=6144”指明文件每塊大小1 kB,共6 144塊。

在根文件系統創建并配置完成后,即可壓縮鏡像文件了。可用gzip壓縮鏡像:

# gzip -c -9 initrd.img > initrd.bin

4.2 bootloader的配置

bootloader是在操作系統內核運行之前的一段程序,通過這段程序初始化硬件設備,建立內存空間的映射表,從而建立適當的系統軟硬件環境,為調用操作系統內核做好準備。由于bootloader是基于特定硬件平臺的,所以不同架構有著不同的bootloader。SH系列微處理器的標準專用bootloader是Renesas公司的sh-boot,EDOSK7751R開發板中提供了工具包。

SH4系列微處理器加電復位后從A000 0000處取得第一條指令。修改sh-boot中/FLASH/FLASHboot.c文件以確定FLASH和RAM的位置和大小,以映射到相映的位置。修改/machine/syshsh4.mem文件確定啟動鏡像文件的大小,設置堆棧指針。/config/config.h文件設置CONFIG_BOOT_LOADER1 用來啟動方式(從FLASH啟動或網絡啟動)。如果設置從FLASH啟動,需修改Makefile文件中的LINUX_ROM_ADDRESS和INITRD_ROM_ADDRESS確定Linux壓縮內核和根文件系統鏡像在FLASH中的位置,其他啟動方式如tftp等設置可參閱Renesas提供的sh-boot技術文檔。設置完畢后make,即可得到bootloader的啟動鏡像。

5 結 語

本文針對國內應用較少的SuperH平臺,介紹嵌入式Linux2.6在7751上的移植技術。重點針對SH4系列在較新版本編譯器和內核環境下交叉編譯環境的建立和內核的配置進行詳細闡述。實驗結果表明,在EDOSK7751R開發板上系統運行可靠,是SH4架構移植的一般性方法,對以后開發SH系列微處理器嵌入式系統有著指導意義。

參考文獻

[1]Karim Yagbmour.構建嵌入式Linux系統[M].北京:中國電力出版社,2004.

[2]Anon SHLinux Quick Start Guide.Renesas Technology Europe Limited,2003.

[3]Bill Gatliff.Running Linux on the Sega Dreamcast[EB/OL].http://www.linuxdevice.com,2005.

[4]張曉林,崔迎煒.嵌入式系統設計與實踐[M].北京:北京航空航天大學出版社,2006.

[5]袁太生,張素琴.嵌入式環境下Linux 移植問題的探討[J].計算機應用研究,2003(11):61-63.

[6]張藝瀕,謝金晶.通用安全Linux操作系統設計分析.現代電子技術,2007,30(6):102-104.

作者簡介 王 若 男,1982年出生,碩士研究生。研究方向為模式識別與智能系統。

關勝曉 男,1964年出生。副教授。研究方向為嵌入式系統,智能機器人等。

刁智華 男,1982年出生,博士研究生。研究方向為圖像處理、嵌入式系統。

主站蜘蛛池模板: 沈阳少妇高潮在线| 欧美综合区自拍亚洲综合绿色 | 97久久精品人人| 欧美曰批视频免费播放免费| 91在线播放国产| 欧美亚洲国产一区| 亚洲国产精品无码AV| 波多野结衣在线一区二区| 国产99视频在线| 国产乱肥老妇精品视频| 亚洲欧美色中文字幕| 国产理论一区| 精品一区二区三区中文字幕| 国产浮力第一页永久地址| 婷婷色婷婷| 亚洲午夜片| 久久一色本道亚洲| 国产69精品久久久久孕妇大杂乱 | 免费高清a毛片| 国产a v无码专区亚洲av| 又爽又大又黄a级毛片在线视频| 国产91导航| 国产内射一区亚洲| 日本免费a视频| 国产高清无码第一十页在线观看| 精品国产一二三区| 久久黄色一级片| 91丝袜乱伦| 大学生久久香蕉国产线观看| 亚洲永久免费网站| 国产制服丝袜无码视频| 国产91丝袜在线播放动漫| 国产无码精品在线播放| 永久在线精品免费视频观看| 国产AV无码专区亚洲A∨毛片| 午夜福利亚洲精品| 欧美在线免费| 五月丁香在线视频| 最新午夜男女福利片视频| 亚洲无线观看| 99热这里只有精品国产99| 亚洲乱强伦| 播五月综合| 亚洲无卡视频| 国内精品久久九九国产精品 | 伊人久久大香线蕉影院| 久久久亚洲色| 国产高清免费午夜在线视频| 中文字幕人妻av一区二区| 国产精品久久精品| 久久久黄色片| 国产爽妇精品| 一级全黄毛片| 波多野结衣一区二区三区88| 久久黄色免费电影| 无码又爽又刺激的高潮视频| 日本成人精品视频| 无码区日韩专区免费系列| 国产成人喷潮在线观看| 无码区日韩专区免费系列| a在线观看免费| 白浆视频在线观看| 动漫精品啪啪一区二区三区| 欧美日韩午夜| 日韩国产高清无码| 伊人久久婷婷| 亚洲国产在一区二区三区| 久久久波多野结衣av一区二区| 中国国产高清免费AV片| 国产成人乱码一区二区三区在线| 国产精品区视频中文字幕| 国产成人精品男人的天堂| 91久久偷偷做嫩草影院| 色综合久久无码网| 久久夜夜视频| 女人18毛片久久| 精品国产毛片| 蝴蝶伊人久久中文娱乐网| 日韩大乳视频中文字幕| 综合色在线| 欧美区日韩区| 波多野结衣一二三|