⑴ 如何在Windows上建立arm-linux開發環境
在嵌入式產品大行其道的今天,Linux經過裁剪和優化而成的uClinux在嵌入式領域眾多的操作系統中佔有一席之地。從uClinux字面上就可以看出它的含義,即「微控制器領域中的Linux系統」。
uClinux從Linux 2.0/2.4內核派生而來,沿襲了Linux的絕大部分特性。它是專門針對沒有MMU(內存管理單元)的CPU,並且為嵌入式系統做了許多小型化的工作。它通常用於具有很少內存或Flash的嵌入式操作系統。在GNU通用許可證的保證下,運行uClinux操作系統的用戶可以使用幾乎所有的Linux API函數。由於經過了裁剪和優化,它形成了一個高度優化,代碼緊湊的嵌入式Linux。它具有體積小、穩定、良好的移植性、優秀的網路功能、完備的對各種文件系統的支持,以及豐富的API函數等優點。uClinux與Linux在兼容性方面表現出色,uClinux除了不能實現fork()外,其餘uClinux的API函數與標准Linux完全相同。
uClinux的基本架構
Boot Loader:負責Linux內核的啟動,用於初始化系統資源。這部分代碼用於建立Linux內核運行環境和從Flash中裝載初始化Ramdisk。
內核初始化:Linux內核的入口點是start kernel()函數。它初始化內核的其它部分,包括捕獲、IRQ通道、調度、設備驅動、標定延遲循環,最重要的是能夠fork「init」進程,以啟動整個多任務環境。
系統調用函數/捕獲函數:在執行完「init」程序後,內核對程序流不再有直接地控制權。此後,它的作用僅僅是處理非同步事件(例如硬體中斷)和為系統調用提供進程。
設備驅動:設備驅動占據了Linux內核很大部分。同其它操作系統一樣,設備驅動為它們所控制的硬體設備和操作系統提供介面。
文件系統:Linux最重要的特性之一就是對多種文件系統的支持。這種特性使得Linux很容易地同其它操作系統共存。文件系統的概念使得用戶能夠查看存儲設備上的文件和路徑而無須考慮實際物理設備的文件系統類型。
交叉編譯環境
uClinux是一個出色的開發平台,但是在我們能在電腦上編寫自己的嵌入式應用程序之前,還必須做的一件事,就是給uClinux建立完善的編譯環境。關於交叉編譯,簡單地講是指在一個平台(操作系統)上可以生成能在另一個平台上執行的代碼。
但是對於有些不是很懂Linux環境的人來講,用uClinux開發程序會感到諸多不便。這里提供了在裝有Windows系統的宿主機(開發時所用的機器)上建立交叉編譯環境的方法。
為了在Windows下開發嵌入式操作系統應用程序,可以在Windows環境下裝上Cygwin軟體。Cygwin是一個在Windows平台上運行的Unix模擬環境,是Cygnus Solutions公司開發的自由軟體。它對於學習掌握Unix/Linux操作環境,或者進行某些特殊的開發工作,尤其是使用GNU工具集在Windows上進行嵌入式系統開發,非常有用。
Cygnus首先把gcc、gdb等開發工具進行了改進,使它們能夠生成並解釋WIN32的目標文件。然後,把這些工具移植到Windows平台上去。一種方案是基於WIN32 APl對這些工具的源代碼進行大幅修改,這樣做顯然需要大量工作。因此,Cygnus採取了一種不同的方法——他們寫了一個共享庫(就是cygwinl.d11),把WIN32 API中沒有的Unix風格的調用(如fork、spawn、signals、select、sockets等)封裝在裡面。也就是說,他們基於WIN32 APl寫了一個Unix系統庫的模擬層。這樣,只要把這些工具的源代碼和這個共享庫連接到一起,就可以使用Unix主機上的交叉編譯器來生成可以在Windows平台上運行的工具集。以這些移植到Windows平台上的開發工具為基礎,Cygnus又逐步把其它的工具(幾乎不需要對源代碼進行修改,只需要修改他們的配置腳本)軟體移植到Windows上來。這樣,在Windows平台上運行bash和開發工具、用戶工具,感覺好像在Unix上工作。
生成交叉編譯器
Cygwin軟體目前最新版本是Cygwin DLL 1.5.9-1。它的網址是http:// Cygwin.com,上面就有該程序的壓縮包,下載後解壓安裝就ok了。
在自己生成交叉編譯器之前,首先對Cygwin進行一些設置。假設Cygwin安裝在e目錄下,在打開Cygwin窗口之前,進入到E:\Cygwin目錄。在這個目錄下,有一個文件名為Cygwin.bat的批處理文件,編輯該文件,在第一行後加入setCYGWIN--titlentea,這是因為Cygwin的啟動批處理文件需要啟動Unix文件系統模擬。修改完畢且保存後退出。雙擊桌面上的Cygwin圖標,打開後默認用戶為在Windows中登錄的用戶名(這里所使用的操作系統是Windows 2000 Professsional),在根目錄(即E:\cygwin)下輸入:
cd bin
mV Sh.exe Sh—original.exe
n —S bash.exe Sh.Exe
做上述幾步的原因是大多數Linux系統把sh符號鏈接到bash,而Cygwin上的sh.exe和bash.exe是不同的,因此必須用bash代替sh。
從網站上下載生成工具鏈的各種源碼,根據腳本文件build-ucLinux-tools.sh建立可在Windows下編譯用戶應用程序的交叉編譯器,生成的交叉編譯器最終被打包為arm-elf-tools-cygwin-yyyymmdd.tar.gz的文件,其中YYYY為生成交叉編譯器的年,mm為生成交叉編譯器的月份,dd為日期。
這里,需要注意的是在生成交叉編譯器的過程中,可能會遇到多次錯誤,讀者應該根據給出的出錯信息,進行相應文件的修改。由於習慣上的原因,Linux下的壓縮文件一般都是以.tar.gz或者.tgz結尾的。雖然用Windows下的解壓軟體,比如winzip或者winrar也可以解壓這些文件,但是不推薦使用這類解壓軟體,因為可能會造成某些信息的丟失。
⑵ arm linux 中設置gpio下面的幾個狀態分別是什麼意思
2,現在lcd比較熱門,特別2d/3d加速。
請參考
⑶ Linux嵌入式交叉編譯工具鏈問題 淺談
交叉編譯工具鏈是一個由編譯器、連接器和解釋器組成的綜合開發環境,交叉編譯工具鏈主要由binutils、gcc和glibc 3個部分組成。有時出於減小libc庫大小的考慮,也可以用別的c庫來代替glibc,例如uClibc、dietlibc和newlib。交叉編譯工具鏈主要包括針對目標系統的編譯器gcc、目標系統的二進制工具binutils、目標系統的標准c庫glibc和目標系統的Linux內核頭文件。第一個步驟就是確定目標平台。每個目標平台都有一個明確的格式,這些信息用於在構建過程中識別要使用的不同工具的正確版本。因此,當在一個特定目標機下運行GCC時,GCC便在目錄路徑中查找包含該目標規范的應用程序路徑。GNU的目標規范格式為CPU-PLATFORM-OS。例如,建立基於ARM平台的交叉工具鏈,目標平台名為arm-linux-gnu。
分步編譯和安裝交叉編譯工具鏈所需要的庫和源代碼,最終生成交叉編譯工具鏈。
通過Crosstool腳本工具來實現一次編譯生成交叉編譯工具鏈。
直接通過網上(ftp.arm.kernel.org.uk)下載已經製作好的交叉編譯工具鏈。
方法1相對比較困難,適合想深入學習構建交叉工具鏈的讀者。如果只是想使用交叉工具鏈,建議使用方法2或方法3構建交叉工具鏈。方法3的優點不用多說,當然是簡單省事,但與此同時該方法有一定的弊端就是局限性太大,因為畢竟是別人構建好的,也就是固定的沒有靈活性,所以構建所用的庫以及編譯器的版本也許並不適合你要編譯的程序,同時也許會在使用時出現許多莫名的錯誤,建議你慎用此方法。
方法1:分步構建交叉編譯工具鏈
下載所需的源代碼包
建立工作目錄
建立環境變數
編譯、安裝Binutils
獲取內核頭文件
編譯gcc的輔助編譯器
編譯生成glibc庫
編譯生成完整的gcc
由於在問答中的篇幅,我不能細述具體的步驟,興趣的同學請自行閱讀開源共創協議的《Linux from scratch》,網址是:linuxfromscratch dot org
。
Crosstool是一組腳本工具集,可構建和測試不同版本的gcc和glibc,用於那些支持glibc的體系結構。它也是一個開源項目,下載地址是kegel dot com/crosstool。用Crosstool構建交叉工具鏈要比上述的分步編譯容易得多,並且也方便許多,對於僅僅為了工作需要構建交叉編譯工具鏈的你,建議使用此方法。
運行which makeinfo,如果不能找見該命令,在解壓texinfo-4.11.tar.bz2,進入texinfo-4.11目錄,執行./configure&&make&&make install完成makeinfo工具的安裝
下載所需資源文件linux-2.4.20.tar.gz、binutils-2.19.tar.bz2、gcc-3.3.6.tar.gz、glibc- 2.3.2.tar.gz、glibc-linuxthreads-2.3.2.tar.gz和gdb-6.5.tar.bz2。然後將這些工具包文件放在新建的$HOME/downloads目錄下,最後在$HOME/目錄下解壓crosstool-0.43.tar.gz,命
令如下:
#cd$HOME/
#tar–xvzfcrosstool-0.43.tar.gz
建立腳本文件
接著需要建立自己的編譯腳本,起名為arm.sh,為了簡化編寫arm.sh,尋找一個最接近的腳本文件demo-arm.sh作為模板,然後將該腳本的內容復制到arm.sh,修改arm.sh腳本,具體操作如下:
# cd crosstool-0.43
# cp demo-arm.sh arm.sh
# vi arm.sh
修改後的arm.sh腳本內容如下:
#!/bin/sh
set-ex
TARBALLS_DIR=$HOME/downloads#定義工具鏈源碼所存放位置。
RESULT_TOP=$HOME/arm-bin#定義工具鏈的安裝目錄
exportTARBALLS_DIRRESULT_TOP
GCC_LANGUAGES="c,c++"#定義支持C,C++語言
exportGCC_LANGUAGES
#創建/opt/crosstool目錄
mkdir-p$RESULT_TOP
#編譯工具鏈,該過程需要數小時完成。
eval'catarm.datgcc-3.3.6-glibc-2.3.2.dat'shall.sh--notest
echoDone.
在arm.sh腳本文件中需要注意arm-xscale.dat和gcc-3.3.6-glibc-2.3.2.dat兩個文件,這兩個文件是作為Crosstool的編譯的配置文件。其中arm.dat文件內容如下,主要用於定義配置文件、定義生成編譯工具鏈的名稱以及定義編譯選項等。
KERNELCONFIG='pwd'/arm.config#內核的配置
TARGET=arm-linux#編譯生成的工具鏈名稱
TARGET_CFLAGS="-O"#編譯選項
gcc-3.3.6-glibc-2.3.2.dat文件內容如下,該文件主要定義編譯過程中所需要的庫以及它定義的版本,如果在編譯過程中發現有些庫不存在時,Crosstool會自動在相關網站上下載,該工具在這點上相對比較智能,也非常有用。
BINUTILS_DIR=binutils-2.19
GCC_DIR=gcc-3.3.6
GLIBC_DIR=glibc-2.3.2
LINUX_DIR=linux-2.6.10-8(根據實際情況填寫)
GDB_DIR=gdb-6.5
執行腳本
將Crosstool的腳本文件和配置文件准備好之後,開始執行arm.sh腳本來編譯交叉編譯工具。具體執行命令如下:
#cdcrosstool-0.43
#./arm.sh
經過數小時的漫長編譯之後,會在/opt/crosstool目錄下生成新的交叉編譯工具,其中包括以下內容:
arm-linux-addr2linearm-linux-g++arm-linux-ldarm-linux-size
arm-linux-ararm-linux-gccarm-linux-nmarm-linux-strings
arm-linux-asarm-linux-gcc-3.3.6arm-linux-objarm-linux-strip
arm-linux-c++arm-linux-gccbugarm-linux-objmpfix-embedded-paths
arm-linux-c++filtarm-linux-gcovarm-linux-ranlib
arm-linux-cpparm-linux-gprofarm-linux-readelf
然後將生成的編譯工具鏈路徑添加到環境變數PATH上去,添加的方法是在系統/etc/ bashrc文件的最後添加下面一行,在bashrc文件中添加環境變數
export PATH=/home/jiabing/gcc-3.3.6-glibc-2.3.2/arm-linux-bin/bin:$PATH
至此,arm-linux下的交叉編譯工具鏈已經完成,現在就可以使用arm-linux-gcc來生成試驗箱上的程序了!
⑷ 如何為嵌入式開發建立交叉編譯環境
下面我們將以建立針對arm的交叉編譯開發環境為例來解說整個過程,其他的體系結構與這個相類似,只要作一些對應的改動。我的開發環境是,宿主機 i386-redhat-7.2,目標機 arm。
這個過程如下
1. 下載源文件、補丁和建立編譯的目錄
2. 建立內核頭文件
3. 建立二進制工具(binutils)
4. 建立初始編譯器(bootstrap gcc)
5. 建立c庫(glibc)
6. 建立全套編譯器(full gcc)
下載源文件、補丁和建立編譯的目錄
1. 選定軟體版本號
選擇軟體版本號時,先看看glibc源代碼中的INSTALL文件。那裡列舉了該版本的glibc編譯時所需的binutils 和gcc的版本號。例如在 glibc-2.2.3/INSTALL 文件中推薦 gcc 用 2.95以上,binutils 用 2.10.1 以上版本。
我選的各個軟體的版本是:
linux-2.4.21+rmk2
binutils-2.10.1
gcc-2.95.3
glibc-2.2.3
glibc-linuxthreads-2.2.3
如果你選的glibc的版本號低於2.2,你還要下載一個叫glibc-crypt的文件,例如glibc-crypt-2.1.tar.gz。 Linux 內核你可以從www.kernel.org 或它的鏡像下載。
Binutils、gcc和glibc你可以從FSF的FTP站點ftp://ftp.gun.org/gnu/ 或它的鏡像去下載。 在編譯glibc時,要用到 Linux 內核中的 include 目錄的內核頭文件。如果你發現有變數沒有定義而導致編譯失敗,你就改變你的內核版本號。例如我開始用linux-2.4.25+vrs2,編譯glibc-2.2.3 時報 BUS_ISA 沒定義,後來發現在 2.4.23 開始它的名字被改為 CTL_BUS_ISA。如果你沒有完全的把握保證你改的內核改完全了,就不要動內核,而是把你的 Linux 內核的版本號降低或升高,來適應 glibc。
Gcc 的版本號,推薦用 gcc-2.95 以上的。太老的版本編譯可能會出問題。Gcc-2.95.3 是一個比較穩定的版本,也是內核開發人員推薦用的一個 gcc 版本。
如果你發現無法編譯過去,有可能是你選用的軟體中有的加入了一些新的特性而其他所選軟體不支持的原因,就相應降低該軟體的版本號。例如我開始用 gcc-3.3.2,發現編譯不過,報 as、ld 等版本太老,我就把 gcc 降為 2.95.3。 太新的版本大多沒經過大量的測試,建議不要選用。
回頁首
2. 建立工作目錄
首先,我們建立幾個用來工作的目錄:
在你的用戶目錄,我用的是用戶liang,因此用戶目錄為 /home/liang,先建立一個項目目錄embedded。
$pwd
/home/liang
$mkdir embedded
再在這個項目目錄 embedded 下建立三個目錄 build-tools、kernel 和 tools。
build-tools-用來存放你下載的 binutils、gcc 和 glibc 的源代碼和用來編譯這些源代碼的目錄。
kernel-用來存放你的內核源代碼和內核補丁。
tools-用來存放編譯好的交叉編譯工具和庫文件。
$cd embedded
$mkdir build-tools kernel tools
執行完後目錄結構如下:
$ls embedded
build-tools kernel tools
3. 輸出和環境變數
我們輸出如下的環境變數方便我們編譯。
$export PRJROOT=/home/liang/embedded
$export TARGET=arm-linux
$export PREFIX=$PRJROOT/tools
$export TARGET_PREFIX=$PREFIX/$TARGET
$export PATH=$PREFIX/bin:$PATH
如果你不慣用環境變數的,你可以直接用絕對或相對路徑。我如果不用環境變數,一般都用絕對路徑,相對路徑有時會失敗。環境變數也可以定義在.bashrc文件中,這樣當你logout或換了控制台時,就不用老是export這些變數了。
體系結構和你的TAEGET變數的對應如下表
你可以在通過glibc下的config.sub腳本來知道,你的TARGET變數是否被支持,例如:
$./config.sub arm-linux
arm-unknown-linux-gnu
在我的環境中,config.sub 在 glibc-2.2.3/scripts 目錄下。
網上還有一些 HOWTO 可以參考,ARM 體系結構的《The GNU Toolchain for ARM Target HOWTO》,PowerPC 體系結構的《Linux for PowerPC Embedded Systems HOWTO》等。對TARGET的選取可能有幫助。
4. 建立編譯目錄
為了把源碼和編譯時生成的文件分開,一般的編譯工作不在的源碼目錄中,要另建一個目錄來專門用於編譯。用以下的命令來建立編譯你下載的binutils、gcc和glibc的源代碼的目錄。
$cd $PRJROOT/build-tools
$mkdir build-binutils build-boot-gcc build-gcc build-glibc gcc-patch
build-binutils-編譯binutils的目錄
build-boot-gcc-編譯gcc 啟動部分的目錄
build-glibc-編譯glibc的目錄
build-gcc-編譯gcc 全部的目錄
gcc-patch-放gcc的補丁的目錄
gcc-2.95.3 的補丁有 gcc-2.95.3-2.patch、gcc-2.95.3-no-fixinc.patch 和gcc-2.95.3-returntype-fix.patch,可以從 http://www.linuxfromscratch.org/ 下載到這些補丁。
再將你下載的 binutils-2.10.1、gcc-2.95.3、glibc-2.2.3 和 glibc-linuxthreads-2.2.3 的源代碼放入 build-tools 目錄中
看一下你的 build-tools 目錄,有以下內容:
$ls
binutils-2.10.1.tar.bz2 build-gcc gcc-patch
build-binutls build-glibc glibc-2.2.3.tar.gz
build-boot-gcc gcc-2.95.3.tar.gz glibc-linuxthreads-2.2.3.tar.gz
回頁首
建立內核頭文件
把你從 www.kernel.org 下載的內核源代碼放入 $PRJROOT /kernel 目錄
進入你的 kernel 目錄:
$cd $PRJROOT /kernel
解開內核源代碼
$tar -xzvf linux-2.4.21.tar.gz
或
$tar -xjvf linux-2.4.21.tar.bz2
小於 2.4.19 的內核版本解開會生成一個 linux 目錄,沒帶版本號,就將其改名。
$mv linux linux-2.4.x
給 Linux 內核打上你的補丁
$cd linux-2.4.21
$patch -p1 < ../patch-2.4.21-rmk2
編譯內核生成頭文件
$make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig
你也可以用 config 和 xconfig 來代替 menuconfig,但這樣用可能會沒有設置某些配置文件選項和沒有生成下面編譯所需的頭文件。推薦大家用 make menuconfig,這也是內核開發人員用的最多的配置方法。配置完退出並保存,檢查一下的內核目錄中的 include/linux/version.h 和 include/linux/autoconf.h 文件是不是生成了,這是編譯 glibc 是要用到的,version.h 和 autoconf.h 文件的存在,也說明了你生成了正確的頭文件。
還要建立幾個正確的鏈接
$cd include
$ln -s asm-arm asm
$cd asm
$ln -s arch-epxa arch
$ln -s proc-armv proc
接下來為你的交叉編譯環境建立你的內核頭文件的鏈接
$mkdir -p $TARGET_PREFIX/include
$ln -s $PRJROOT/kernel/linux-2.4.21/include/linux $TARGET_PREFIX/include/linux
$in -s $PRJROOT/kernel/linux-2.4.21/include/asm-arm $TARGET_PREFIX/include/asm
也可以把 Linux 內核頭文件拷貝過來用
$mkdir -p $TARGET_PREFIX/include
$cp -r $PRJROOT/kernel/linux-2.4.21/include/linux $TARGET_PREFIX/include
$cp -r $PRJROOT/kernel/linux-2.4.21/include/asm-arm $TARGET_PREFIX/include
回頁首
建立二進制工具(binutils)
binutils是一些二進制工具的集合,其中包含了我們常用到的as和ld。
首先,我們解壓我們下載的binutils源文件。
$cd $PRJROOT/build-tools
$tar -xvjf binutils-2.10.1.tar.bz2
然後進入build-binutils目錄配置和編譯binutils。
$cd build-binutils
$../binutils-2.10.1/configure --target=$TARGET --prefix=$PREFIX
--target 選項是指出我們生成的是 arm-linux 的工具,--prefix 是指出我們可執行文件安裝的位置。
會出現很多 check,最後產生 Makefile 文件。
有了 Makefile 後,我們來編譯並安裝 binutils,命令很簡單。
$make
$make install
看一下我們 $PREFIX/bin 下的生成的文件
$ls $PREFIX/bin
arm-linux-addr2line arm-linux-gasp arm-linux-objmp arm-linux-strings
arm-linux-ar arm-linux-ld arm-linux-ranlib arm-linux-strip
arm-linux-as arm-linux-nm arm-linux-readelf
arm-linux-c++filt arm-linux-obj arm-linux-size
我們來解釋一下上面生成的可執行文件都是用來干什麼的
add2line - 將你要找的地址轉成文件和行號,它要使用 debug 信息。
Ar-產生、修改和解開一個存檔文件
As-gnu 的匯編器
C++filt-C++ 和 java 中有一種重載函數,所用的重載函數最後會被編譯轉化成匯編的標號,c++filt 就是實現這種反向的轉化,根據標號得到函數名。
Gasp-gnu 匯編器預編譯器。
Ld-gnu 的連接器
Nm-列出目標文件的符號和對應的地址
Obj-將某種格式的目標文件轉化成另外格式的目標文件
Objmp-顯示目標文件的信息
Ranlib-為一個存檔文件產生一個索引,並將這個索引存入存檔文件中
Readelf-顯示 elf 格式的目標文件的信息
Size-顯示目標文件各個節的大小和目標文件的大小
Strings-列印出目標文件中可以列印的字元串,有個默認的長度,為4
Strip-剝掉目標文件的所有的符號信息
回頁首
建立初始編譯器(bootstrap gcc)
首先進入 build-tools 目錄,將下載 gcc 源代碼解壓
$cd $PRJROOT/build-tools
$tar -xvzf gcc-2.95.3.tar.gz
然後進入 gcc-2.95.3 目錄給 gcc 打上補丁
$cd gcc-2.95.3
$patch -p1< ../gcc-patch/gcc-2.95.3.-2.patch
$patch -p1< ../gcc-patch/gcc-2.95.3.-no-fixinc.patch
$patch -p1< ../gcc-patch/gcc-2.95.3-returntype-fix.patch
echo timestamp > gcc/cstamp-h.in
在我們編譯並安裝 gcc 前,我們先要改一個文件 $PRJROOT/gcc/config/arm/t-linux,把
TARGET_LIBGCC2-CFLAGS = -fomit-frame-pointer -fPIC
這一行改為
TARGET_LIBGCC2-CFLAGS = -fomit-frame-pointer -fPIC -Dinhibit_libc -D__gthr_posix_h
你如果沒定義 -Dinhibit,編譯時將會報如下的錯誤
../../gcc-2.95.3/gcc/libgcc2.c:41: stdlib.h: No such file or directory
../../gcc-2.95.3/gcc/libgcc2.c:42: unistd.h: No such file or directory
make[3]: *** [libgcc2.a] Error 1
make[2]: *** [stmp-multilib-sub] Error 2
make[1]: *** [stmp-multilib] Error 1
make: *** [all-gcc] Error 2
如果沒有定義 -D__gthr_posix_h,編譯時會報如下的錯誤
In file included from gthr-default.h:1,
from ../../gcc-2.95.3/gcc/gthr.h:98,
from ../../gcc-2.95.3/gcc/libgcc2.c:3034:
../../gcc-2.95.3/gcc/gthr-posix.h:37: pthread.h: No such file or directory
make[3]: *** [libgcc2.a] Error 1
make[2]: *** [stmp-multilib-sub] Error 2
make[1]: *** [stmp-multilib] Error 1
make: *** [all-gcc] Error 2
還有一種與-Dinhibit同等效果的方法,那就是在你配置configure時多加一個參數-with-newlib,這個選項不會迫使我們必須使用newlib。我們編譯了bootstrap-gcc後,仍然可以選擇任何c庫。
接著就是配置boostrap gcc, 後面要用bootstrap gcc 來編譯 glibc 庫。
$cd ..; cd build-boot-gcc
$../gcc-2.95.3/configure --target=$TARGET --prefix=$PREFIX \
>--without-headers --enable-languages=c --disable-threads
這條命令中的 -target、--prefix 和配置 binutils 的含義是相同的,--without-headers 就是指不需要頭文件,因為是交叉編譯工具,不需要本機上的頭文件。-enable-languages=c是指我們的 boot-gcc 只支持 c 語言。--disable-threads 是去掉 thread 功能,這個功能需要 glibc 的支持。
接著我們編譯並安裝 boot-gcc
$make all-gcc
$make install-gcc
我們來看看 $PREFIX/bin 裡面多了哪些東西
$ls $PREFIX/bin
你會發現多了 arm-linux-gcc 、arm-linux-unprotoize、cpp 和 gcov 幾個文件。
Gcc-gnu 的 C 語言編譯器
Unprotoize-將 ANSI C 的源碼轉化為 K&R C 的形式,去掉函數原型中的參數類型。
Cpp-gnu的 C 的預編譯器
Gcov-gcc 的輔助測試工具,可以用它來分析和優程序。
使用 gcc3.2 以及 gcc3.2 以上版本時,配置 boot-gcc 不能使用 --without-headers 選項,而需要使用 glibc 的頭文件。
回頁首
建立 c 庫(glibc)
首先解壓 glibc-2.2.3.tar.gz 和 glibc-linuxthreads-2.2.3.tar.gz 源代碼
$cd $PRJROOT/build-tools
$tar -xvzf glibc-2.2.3.tar.gz
$tar -xzvf glibc-linuxthreads-2.2.3.tar.gz --directory=glibc-2.2.3
然後進入 build-glibc 目錄配置 glibc
$cd build-glibc
$CC=arm-linux-gcc ../glibc-2.2.3/configure --host=$TARGET --prefix="/usr"
--enable-add-ons --with-headers=$TARGET_PREFIX/include
CC=arm-linux-gcc 是把 CC 變數設成你剛編譯完的boostrap gcc,用它來編譯你的glibc。--enable-add-ons是告訴glibc用 linuxthreads 包,在上面我們已經將它放入了 glibc 源碼目錄中,這個選項等價於 -enable-add-ons=linuxthreads。--with-headers 告訴 glibc 我們的linux 內核頭文件的目錄位置。
配置完後就可以編譯和安裝 glibc
$make
$make install_root=$TARGET_PREFIX prefix="" install
然後你還要修改 libc.so 文件
將
GROUP ( /lib/libc.so.6 /lib/libc_nonshared.a)
改為
GROUP ( libc.so.6 libc_nonshared.a)
這樣連接程序 ld 就會在 libc.so 所在的目錄查找它需要的庫,因為你的機子的/lib目錄可能已經裝了一個相同名字的庫,一個為編譯可以在你的宿主機上運行的程序的庫,而不是用於交叉編譯的。
回頁首
建立全套編譯器(full gcc)
在建立boot-gcc 的時候,我們只支持了C。到這里,我們就要建立全套編譯器,來支持C和C++。
$cd $PRJROOT/build-tools/build-gcc
$../gcc-2.95.3/configure --target=$TARGET --prefix=$PREFIX --enable-languages=c,c++
--enable-languages=c,c++ 告訴 full gcc 支持 c 和 c++ 語言。
然後編譯和安裝你的 full gcc
$make all
$make install
我們再來看看 $PREFIX/bin 裡面多了哪些東西
$ls $PREFIX/bin
你會發現多了 arm-linux-g++ 、arm-linux-protoize 和 arm-linux-c++ 幾個文件。
G++-gnu的 c++ 編譯器。
Protoize-與Unprotoize相反,將K&R C的源碼轉化為ANSI C的形式,函數原型中加入參數類型。
C++-gnu 的 c++ 編譯器。
到這里你的交叉編譯工具就算做完了,簡單驗證一下你的交叉編譯工具。
用它來編譯一個很簡單的程序 helloworld.c
#include <stdio.h>
int main(void)
{
printf("hello world\n");
return 0;
}
$arm-linux-gcc helloworld.c -o helloworld
$file helloworld
helloworld: ELF 32-bit LSB executable, ARM, version 1,
dynamically linked (uses shared libs), not stripped
上面的輸出說明你編譯了一個能在 arm 體系結構下運行的 helloworld,證明你的編譯工具做成功了。
轉載僅供參考,版權屬於原作者
⑸ hcl模擬器,宿主機提示沒有可用的介面,請先配置host_1,問怎麼解決在線等 !
1 GECMlO開發板硬體構成
ARM處理器是一種支持16/32位雙指令集的高性能、低成本、低功耗的R ISC微處理器,目前已經佔領了75%以I:的32位RISC嵌入式產品f仃場。本文所選用的ARM920T微處理器屬於中端產品,應用也十分廣泛。$3C2410是32位低功耗RISC宏單元,其工作頻率為203 MHz,同時支持Thumbl6位精。簡指令集,從而能以較小的存儲空間需求,獲得32位的系統性能。64M位元組的SDRAM,由兩片K4S561632組成,工作在32位模式下;64M位元組NAND Flash,採用的是K9F1208,可以兼容16M,32M或128M位元組;10M乙太網介面,採用的是CS8900Q3,帶傳輸和連接指示燈;2路UART串列口,波特率可高達115200bps,並具有RS232電乎轉換電路Embedded·ICE(20腳標准JTAG)介面和並口式jTAG介面,支持ADS,SDT軟體的卜.載和調試以及FLASH的燒寫。
2 嵌入式Linux開發環境的搭建及開發工具的使用
2.1宿主機——目標機模式
進行項目開發前,先要做的是搭建一套基於Linux操作系統的應用開發環境,一般由目標板(GEC2410開發板)和宿主機(LiUUX虛擬機)所構成。如圖1所示。嵌入式系統通常是一個資源受限的系統,因此直接在嵌入式系統的硬體平台上編寫軟體比較困難,有時候甚拿是不可能的.目前一般採用的解決辦法是首先在通用計算機上編寫程序,然後通過交叉編譯生成目標平台七可以運行的二進制代碼格式,最後再下載到目標平台上的特定位置.卜運行.用來編譯這種程序的編譯器就叫交叉編譯器。為了不跟本地編譯器混淆,交叉編澤器的名字一般都有前綴。例如:arm.1inux—gcc。交叉開發環境是指編譯、鏈接和調試嵌入式應用軟體的環境,它與運行嵌入式應用軟體的環境有所不同,通常採用宿主機/目標機模式。
2.2 Linux伺服器交叉編譯環境的建立
Linux伺服器是嵌入式Linux內核編譯、應用程序開發、編譯等的公共平台,在一個嵌入式系統的開發過程中,有許多工作需要通過它來完成。交叉編譯工具用於編譯在目標系統上運行的嵌入式Linux內核及應用程序,包括編譯器、連接器、調試器以及代碼轉換J二具等實用程序,一般以瓜縮軟體包的方式提供給我們,稱為開發工具鏈(Toolchain).目前基於ARM架構的交叉編澤工具鏈為:allll-liuux.gcc-2.95.3。
1)GNU交叉工具鏈的下載
從ARM官方網站F載刪.arm.tinux.org.ak,可以從該站點下載2.95.3工具鏈:
ftp://tip.arm.Iinux.org.uk/pub/armlinux/toolehain/cross-2.95.3.tar.bz2
2)cross-2.95.3.tar.bz2包的安裝步驟
a.#mkdir/mr/local/arm;
b.#cp CROSS一2.95.3.tar.bz2/usr/local/ann;
C.#tar jxvf crog$一2.95.3.tar.bz2;
d.添加環境變數:在文{牛/ete/bashrc文件最後添加:
export PATH=/usr/local/arm/2.95.3/bin:$PATH:
e.工具鏈安裝完成。
2.3配置NFS服務的步驟
NFS服務就是將宿主機的一個目錄通過網路可以被掛載到其他計算機上。並且作為其他計算機的一個目錄,其目的就是讓不同的機器、不同的操作系統之間可以彼此共享文件。
NFS的使用分伺服器端和客戶端,其中伺服器端提供要共享的文件,客戶端通過掛載「mount」這一動作實現對共享文件的訪問操作。下面主要介紹GEC24 10開發板的Linux系統與虛擬機的LintLx通過NFS實現文件共享的方法與步驟:
1)在虛擬機linux配置nfs服務,編輯nfs配置文件/etdexports,設置共享目錄如:vi/etc/exports,添加:/root/nfs—share·(rw,sync,no—root—squash)。rW表示允許下位機讀寫該目錄,no_root_squash允許下位機以主機root用戶身份掛載根文件系統。
2)在虛擬機linux啟動NFS服務:(修改配置文件後就需要蕈新啟動施服務)#/etc/init.d/nfs reSTart或者用命令:#service nfs restarto.
3)防火牆的關閉。選擇系統設置一》安全級別,將安全級別改為「無防火牆」。
4)用交叉網線連接PC機(虛擬機)與開發板,目的讓兩個linux處在同一個網路內。
開發板的ip地址是:192.168.2.223,因此配置虛擬機ip為192.168.2開頭的ip地址,如可用下列命令配置:#ifcONfigethO 192.168.2.23。
5)在開發板linux系統中掛載虛擬機linux的NFS共享目錄,執行下列命令:#mkdir/tmp/nfs#mount—t nfs一0 nolock192.168.2.23:/root/nfs—share/trap/nfs。
2.4交叉調試器的製作
2.4.1交叉調試器的結構
程序的調試足檢杏程序正確性、可靠性、穩定性的重要手段,也是應用程序開發必不可少的組成部分。嵌入式軟體開發過程中的交叉調試與本地軟體開發過程中的調試方式有所差別。本地軟體開發調試器與被調試的程序往往運行在同一台計算機}:。而嵌入式軟體開發過程中,調試時採用的是在宿主機和目標機之間進行的交叉調試。調試器運行在宿主機,但被調試的進程卻是運行在目標板。調試器和被調試進程通過串口或者網路進行通信,調試器可以控制、訪問被調試進程,讀取被調試進程的當前狀態,並能夠改變被調試進程的運行狀態。
2.4.2製作交叉調試器的方法
1)解壓源碼包:tar zxf gdb一6.0.tar.gz
2)配置:cd gdb一6.0
mkdir build..arm..1inux
cd build..arm..1inux
../configure--target=arm·linux一一prefix=/usr/local/arm/2.95.3/
3)編譯:make
4)安裝:make install
在/usr/locaL/arm/2.95.3/bin/目錄下生成alTfl-linuxgdb工具
5)編譯生成針對f1.Eln處理器的gdbserver
a.進入sdb源代碼包中的gdb$erver目錄
cd sdb-6.0
cd gdb/gdbserver
b.配置生成gdbserver
chmod U+X configure
CC=arnl—linux—gcc./configure一一host=arm-linux
c.Make,生成gdbserver、gdbreplay
6)通過凼,將gdbserver/gdbreplay到目標板中
7)啟動目標板上的gdbserversabserver 192.168.1.88:2345 cross-teat其中192.168.1.88是目標板的IP地址。2345是任意指定的埠,也可以是其他埠。
8)啟動宿主機端arm.1inux-gdb調試器在宿主機的工作目錄中有對應的程序和源文件
#arm·hnux-柚CI『OS8一teat
(gdb)target remote 192.168.1.88:2345
連接遠程gdbserver
(sab)b main
設置斷點
(Sdb)C運行
⑹ 在嵌入式linux中開啟ftp服務,如何加上用戶名和密碼呢
使用命令:useradd nobody
useradd -d /var/ftp ftp
然後,新增/user/share/empty目錄:mkdir /usr/share/empty
如果不行就設置匿名登錄許可權
⑺ 如何建立Linux下的ARM交叉編譯環境
這個過程如下
1. 下載源文件、補丁和建立編譯的目錄
2. 建立內核頭文件
3. 建立二進制工具(binutils)
4. 建立初始編譯器(bootstrap gcc)
5. 建立c庫(glibc)
6. 建立全套編譯器(full gcc)
下載源文件、補丁和建立編譯的目錄
1. 選定軟體版本號
選擇軟體版本號時,先看看glibc源代碼中的INSTALL文件。那裡列舉了該版本的glibc編譯時所需的binutils 和gcc的版本號。例如在 glibc-2.2.3/INSTALL 文件中推薦 gcc 用 2.95以上,binutils 用 2.10.1 以上版本。
我選的各個軟體的版本是:
linux-2.4.21+rmk2
binutils-2.10.1
gcc-2.95.3
glibc-2.2.3
glibc-linuxthreads-2.2.3
如果你選的glibc的版本號低於2.2,你還要下載一個叫glibc-crypt的文件,例如glibc-crypt-2.1.tar.gz。 Linux 內核你可以從www.kernel.org 或它的鏡像下載。
Binutils、gcc和glibc你可以從FSF的FTP站點ftp://ftp.gun.org/gnu/ 或它的鏡像去下載。在編譯glibc時,要用到 Linux 內核中的 include 目錄的內核頭文件。如果你發現有變數沒有定義而導致編譯失敗,你就改變你的內核版本號。例如我開始用linux-2.4.25+vrs2,編譯glibc-2.2.3 時報 BUS_ISA 沒定義,後來發現在 2.4.23 開始它的名字被改為 CTL_BUS_ISA。如果你沒有完全的把握保證你改的內核改完全了,就不要動內核,而是把你的 Linux 內核的版本號降低或升高,來適應 glibc。
Gcc 的版本號,推薦用 gcc-2.95 以上的。太老的版本編譯可能會出問題。Gcc-2.95.3 是一個比較穩定的版本,也是內核開發人員推薦用的一個 gcc 版本。
如果你發現無法編譯過去,有可能是你選用的軟體中有的加入了一些新的特性而其他所選軟體不支持的原因,就相應降低該軟體的版本號。例如我開始用 gcc-3.3.2,發現編譯不過,報 as、ld 等版本太老,我就把 gcc 降為 2.95.3。太新的版本大多沒經過大量的測試,建議不要選用。
2. 建立工作目錄
首先,我們建立幾個用來工作的目錄:
在你的用戶目錄,我用的是用戶liang,因此用戶目錄為 /home/liang,先建立一個項目目錄embedded。
$pwd
/home/liang
$mkdir embedded
再在這個項目目錄 embedded 下建立三個目錄 build-tools、kernel 和 tools。
build-tools-用來存放你下載的 binutils、gcc 和 glibc 的源代碼和用來編譯這些源代碼的目錄。
kernel-用來存放你的內核源代碼和內核補丁。
tools-用來存放編譯好的交叉編譯工具和庫文件。
$cd embedded
$mkdir build-tools kernel tools
執行完後目錄結構如下:
$ls embedded
build-tools kernel tools
3. 輸出和環境變數
我們輸出如下的環境變數方便我們編譯。
$export PRJROOT=/home/liang/embedded
$export TARGET=arm-linux
$export PREFIX=$PRJROOT/tools
$export TARGET_PREFIX=$PREFIX/$TARGET
$export PATH=$PREFIX/bin:$PATH
如果你不慣用環境變數的,你可以直接用絕對或相對路徑。我如果不用環境變數,一般都用絕對路徑,相對路徑有時會失敗。環境變數也可以定義在.bashrc文件中,這樣當你logout或換了控制台時,就不用老是export這些變數了。
體系結構和你的TAEGET變數的對應如下表
你可以在通過glibc下的config.sub腳本來知道,你的TARGET變數是否被支持,例如:
$./config.sub arm-linux
arm-unknown-linux-gnu
在我的環境中,config.sub 在 glibc-2.2.3/scripts 目錄下。
網上還有一些 HOWTO 可以參考,ARM 體系結構的《The GNU Toolchain for ARM Target HOWTO》,PowerPC 體系結構的《Linux for PowerPC Embedded Systems HOWTO》等。對TARGET的選取可能有幫助。
4. 建立編譯目錄
為了把源碼和編譯時生成的文件分開,一般的編譯工作不在的源碼目錄中,要另建一個目錄來專門用於編譯。用以下的命令來建立編譯你下載的binutils、gcc和glibc的源代碼的目錄。
$cd $PRJROOT/build-tools
$mkdir build-binutils build-boot-gcc build-gcc build-glibc gcc-patch
build-binutils-編譯binutils的目錄
build-boot-gcc-編譯gcc 啟動部分的目錄
build-glibc-編譯glibc的目錄
build-gcc-編譯gcc 全部的目錄
gcc-patch-放gcc的補丁的目錄
gcc-2.95.3 的補丁有 gcc-2.95.3-2.patch、gcc-2.95.3-no-fixinc.patch 和gcc-2.95.3-returntype-fix.patch,可以從 http://www.linuxfromscratch.org/ 下載到這些補丁。
再將你下載的 binutils-2.10.1、gcc-2.95.3、glibc-2.2.3 和 glibc-linuxthreads-2.2.3 的源代碼放入 build-tools 目錄中
看一下你的 build-tools 目錄,有以下內容:
$ls
binutils-2.10.1.tar.bz2 build-gcc gcc-patch
build-binutls build-glibc glibc-2.2.3.tar.gz
build-boot-gcc gcc-2.95.3.tar.gz glibc-linuxthreads-2.2.3.tar.gz
建立內核頭文件
把你從 www.kernel.org 下載的內核源代碼放入 $PRJROOT /kernel 目錄
進入你的 kernel 目錄:
$cd $PRJROOT /kernel
解開內核源代碼
$tar -xzvf linux-2.4.21.tar.gz
或
$tar -xjvf linux-2.4.21.tar.bz2
小於 2.4.19 的內核版本解開會生成一個 linux 目錄,沒帶版本號,就將其改名。
$mv linux linux-2.4.x
給 Linux 內核打上你的補丁
$cd linux-2.4.21
$patch -p1 < ../patch-2.4.21-rmk2
編譯內核生成頭文件
$make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig
你也可以用 config 和 xconfig 來代替 menuconfig,但這樣用可能會沒有設置某些配置文件選項和沒有生成下面編譯所需的頭文件。推薦大家用 make menuconfig,這也是內核開發人員用的最多的配置方法。配置完退出並保存,檢查一下的內核目錄中的 include/linux/version.h 和 include/linux/autoconf.h 文件是不是生成了,這是編譯 glibc 是要用到的,version.h 和 autoconf.h 文件的存在,也說明了你生成了正確的頭文件。
還要建立幾個正確的鏈接
$cd include
$ln -s asm-arm asm
$cd asm
$ln -s arch-epxa arch
$ln -s proc-armv proc
接下來為你的交叉編譯環境建立你的內核頭文件的鏈接
$mkdir -p $TARGET_PREFIX/include
$ln -s $PRJROOT/kernel/linux-2.4.21/include/linux $TARGET_PREFIX/include/linux
$in -s $PRJROOT/kernel/linux-2.4.21/include/asm-arm $TARGET_PREFIX/include/asm
也可以把 Linux 內核頭文件拷貝過來用
$mkdir -p $TARGET_PREFIX/include
$cp -r $PRJROOT/kernel/linux-2.4.21/include/linux $TARGET_PREFIX/include
$cp -r $PRJROOT/kernel/linux-2.4.21/include/asm-arm $TARGET_PREFIX/include
建立二進制工具(binutils)
binutils是一些二進制工具的集合,其中包含了我們常用到的as和ld。
首先,我們解壓我們下載的binutils源文件。
$cd $PRJROOT/build-tools
$tar -xvjf binutils-2.10.1.tar.bz2
然後進入build-binutils目錄配置和編譯binutils。
$cd build-binutils
$../binutils-2.10.1/configure --target=$TARGET --prefix=$PREFIX
--target 選項是指出我們生成的是 arm-linux 的工具,--prefix 是指出我們可執行文件安裝的位置。
會出現很多 check,最後產生 Makefile 文件。
有了 Makefile 後,我們來編譯並安裝 binutils,命令很簡單。
$make
$make install
看一下我們 $PREFIX/bin 下的生成的文件
$ls $PREFIX/bin
arm-linux-addr2line arm-linux-gasp arm-linux-objmp arm-linux-strings
arm-linux-ar arm-linux-ld arm-linux-ranlib arm-linux-strip
arm-linux-as arm-linux-nm arm-linux-readelf
arm-linux-c++filt arm-linux-obj arm-linux-size
我們來解釋一下上面生成的可執行文件都是用來干什麼的
add2line - 將你要找的地址轉成文件和行號,它要使用 debug 信息。
Ar-產生、修改和解開一個存檔文件
As-gnu 的匯編器
C++filt-C++ 和 java 中有一種重載函數,所用的重載函數最後會被編譯轉化成匯編的標號,c++filt 就是實現這種反向的轉化,根據標號得到函數名。
Gasp-gnu 匯編器預編譯器。
Ld-gnu 的連接器
Nm-列出目標文件的符號和對應的地址
Obj-將某種格式的目標文件轉化成另外格式的目標文件
Objmp-顯示目標文件的信息
Ranlib-為一個存檔文件產生一個索引,並將這個索引存入存檔文件中
Readelf-顯示 elf 格式的目標文件的信息
Size-顯示目標文件各個節的大小和目標文件的大小
Strings-列印出目標文件中可以列印的字元串,有個默認的長度,為4
Strip-剝掉目標文件的所有的符號信息
建立初始編譯器(bootstrap gcc)
首先進入 build-tools 目錄,將下載 gcc 源代碼解壓
$cd $PRJROOT/build-tools
$tar -xvzf gcc-2.95.3.tar.gz
然後進入 gcc-2.95.3 目錄給 gcc 打上補丁
$cd gcc-2.95.3
$patch -p1< ../gcc-patch/gcc-2.95.3.-2.patch
$patch -p1< ../gcc-patch/gcc-2.95.3.-no-fixinc.patch
$patch -p1< ../gcc-patch/gcc-2.95.3-returntype-fix.patch
echo timestamp > gcc/cstamp-h.in
在我們編譯並安裝 gcc 前,我們先要改一個文件 $PRJROOT/gcc/config/arm/t-linux,把
TARGET_LIBGCC2-CFLAGS = -fomit-frame-pointer -fPIC
這一行改為
TARGET_LIBGCC2-CFLAGS = -fomit-frame-pointer -fPIC -Dinhibit_libc -D__gthr_posix_h
你如果沒定義 -Dinhibit,編譯時將會報如下的錯誤
http://www.cnblogs.com/gcc-2.95.3/gcc/libgcc2.c:41: stdlib.h: No such file or directory
http://www.cnblogs.com/gcc-2.95.3/gcc/libgcc2.c:42: unistd.h: No such file or directory
make[3]: *** [libgcc2.a] Error 1
make[2]: *** [stmp-multilib-sub] Error 2
make[1]: *** [stmp-multilib] Error 1
make: *** [all-gcc] Error 2
⑻ ftp putfile出現12003錯誤 IIS的FTP應該怎麼設置
用ffmpeg錄像。
(1)編譯x264
官網上下了個最新的x264,我下載的文件是last_x264.tar.bz2。
解壓命令為#tar -jxv -f last_x264.tar.bz2,解壓後的目錄為x264-snapshot-20130313-2245。
進入解壓後的目錄,執行命令./configure --disable-asm,則會生成config.mak。之後就需要修改這個config.mak文件了,改寫ARCH=ARM SYS=Linux CC=arm-linux-gcc,其中CC寫成你自己的交叉編譯環境位置,相應的AR、RANLIB也是,具體如下圖所示。
⑼ 請教高手FTP架設的問題,移動硬碟一塊,可插USB路由器一個,筆記本一台,如何做如何做一個簡單的FTP伺服器
windows操作系統自帶有FTP服務 安裝一下即可 不過不建議用操作系統自帶的FTP
你可以下載一個SERV-U FTP軟體 安裝後添加一個賬號即可以實現FTP服務 十分簡單方便 如果你不會 可找找相關的教程瞧瞧 你也可以看看下面這個過程 我拷的別人的哈 懶得寫
一、 安裝原版軟體和漢化補丁,這個過程就不多說了,想必沒人不會的。
二、 建立第一個本地FTP伺服器
安裝完成後程序會自動運行,你也可以在菜單中選擇運行。
1、 第一次運行程序,它會彈出設置向導窗口
將會帶你完成最初的設置,
2、 單擊「下一步」,出現「顯示菜單圖像」的窗口,問你是否在菜單中顯示小圖像,看各人喜歡了;
3、 單擊「下一步」,這個窗口是讓你在本地第一次運行FTP伺服器,只要「下一步」就行了。
4、 接下來要你輸入你的IP地址
如果你自己有伺服器,有固定的IP,那就請輸入IP地址,如果你只是在自己電腦上建立FTP,而且又是撥號用戶,有的只是動態IP,沒有固定IP,那這一步就省了,什麼也不要填,Serv-U 會自動確定你的IP地址,「下一步」;
5、 在這兒要你輸入你的域名如果你有的話,如:ftp.abc.com,沒有的話,就隨便填一個;
6、 「下一步」,詢問你是否允許匿名訪問一般說來,匿名訪問是以Anonymous為用戶名稱登錄的,無需密碼,當然如果你想成立一個會員區什麼的,就應該選擇「否」,不讓隨便什麼人都可以登錄,只有許可用戶才行,在此我們填「是」;
7、 「下一步」,問你匿名用戶登錄到你的電腦時的目錄你可以自己指定一個硬碟上已存在的目錄,如F:\\temp\\xyz;
8、 「下一步」,詢問你是否要鎖定該目錄,鎖定後,匿名登錄的用戶將只能認為你所指定的目錄(F:\\temp\\xyz)是根目錄,也就是說他只能訪問這個目錄下的文件和文件夾,這個目錄之外就不能訪問,對於匿名用戶一般填「是」;
9、 「下一步」,詢問你是否創建命名的帳號,也就是說可以指定用戶以特定的帳號訪問你的FTP,這對於辦會員區可很有用哦,你可以對於每個人都創建一個帳號,每個帳號的許可權不同,就可以不同程序地限制每個人的權利,方法將在後面講到,這里選擇「是」;
10、 「下一步」,請你填入所要建立的帳號的名稱,如:ldr,
11、 「下一步」,請輸入密碼,如:123,
12、 「下一步」,詢問登錄目錄是什麼,這一步與第7步一樣,如:F:\\temp
13、 「下一步」,詢問你是否要鎖定該目錄,同第8步,這里選擇「否」;
14、 接下來詢問你這次創建的用戶的管理員許可權有幾項選擇:無許可權,組管理員,域管理員,只讀管理員和系統管理員,每項的許可權各不相同;這里選擇「系統管理員」;
15、 最後一步,點擊「完成」就OK了,你有什麼需要修改的,可以點「上一步」,或者進入Serv-U管理員直接修改。
至此,我們建立了一個域ftp.abc.com,兩個用戶,一個Anonymous,一個ldr。
三、 既然我們已經建立好FTP伺服器,那麼我們就應該可以用FTP客戶端軟體來嘗試登錄。
怎麼辦呢?其實很簡單,我們不用上網,就可以測試。我們知道,不上網時,本地機的IP地址默認就為127.0.0.1,FTP埠號為21。打開FTP客戶端軟體,我就用FlashFXP來說明,打開快速連接,填入相應內容然後連接可以看到,我左邊窗格以Anonymous登錄,右邊窗格以ldr登錄,由於是本地機,所以速度奇快,上網後,假如我要讓你登錄到我的電腦上,我只要把我的上網時的IP地址給你,你就可以匿名訪問我的電腦了(注意不要開防火牆),是不是很方便?
⑽ 如何使linux內核2.6.31支持yaffs2文件系統
下面操作的前提是:內核支持nand flash
一. 下載yaffs2源碼,(我將源碼反正/opt目錄下),並解壓源碼,進入源碼目錄
# tar xzvf yaffs2.tar.gz
# cd yaffs2
二. 為內核添加yaffs2文件系統補丁,執行:
# ./patch-ker.sh c m /..../linux-2.6.31.1 <----c m後面接的是內核源碼所在的目錄
執行完後,在內核源碼fs目錄下就多了一個yaffs2目錄,同時Makefile和Kconfig文件也增加了對yaffs2的配置和編譯條件。
三. 配置內核對yaffs2的支持
這里的配置根據自己的需求,把不用的文件系統都去掉。
#make menuconfig
找到下面的配置:
File systems --->
DOS/FAT/NT Filesystems --->
<*> MSDOS fs support
<*> VFAT (Windows95) fs support
Miscellaneous filesystems --->
<*> YAFFS2 file system support
[*] Autoselect yaffs2 format
配置語言選項:
Native Language support --->
(iso8859-1) Default NLS Option
<*> Codepage 437(United States, Canada)
<*> Simplified Chinese charset(CP936, GB2312)
<*> NLS ISO8859-1 (Latin 1; Western European Language)
<*> NLS UTF-8
現在內核已經支持NandFlash和yaffs2文件系統,重新編譯內核:
#make zImage
將編譯好的內核燒入NandFlash後,再燒入yaffs2文件系統,就可以了。
四. 製作yaffs2根文件系統
1. 環境
(1) 交叉編譯器版本: arm-linux-gcc 4.3.3
(2) Linux環境:redhat enterprise 5.5 (2.6.18-194.el5)
(3) 開發板:TQ2440
2. 編譯busybox
(1) 獲取busybox源碼,放在/opt目錄下,解壓,進入busybox源碼目錄
#tar jxvf busybox-1.17.2.tar.bz2
#cd busybox-1.17.2
#vi Makefile
將164行改為CROSS_COMPILE = arm-linux-
將190行改為ARCH = arm
保存退出進入配置菜單
#make menuconfig 採用默認配置保存推出
#make
#make install
通過上面的步驟,在busybox-1.17.2的根目錄下出現了一個_install目錄,
在該目錄下又有三個目錄文件bin sbin usr和一個鏈接文件 linuxrc。
3. 創建根文件系統必要的目錄
(1)在/opt目錄下創建root_fs目錄
#mkdir root_fs
#cd root_fs
(2)將busybox-1.17.2的根目錄下_install中的bin sbin usr和linuxrc拷貝到root_fs
#cp -rf /opt/busybox-1.17.2/_install/* /opt/root_fs
(3)創建必要的目錄
#mkdir dev etc home lib mnt opt proc root sys tmp var
(4)創建必要的二級目錄
#mkdir usr/lib usr/share
#mkdir etc/rc.d
#mkdir var/lib var/lock var/run var/tmp
4. 創建必要的文件
(1) 獲取庫文件,(交叉編譯工具下的庫文件)到root_fs/lib目錄中
#cp -rf /opt/arm/4.3.3/arm-none-linux-gnueabi/libc/armv4t/lib/*so* lib -a
(2) 將主機etc目錄下的passwd、group、shadow文件拷貝到root_fs/etc目錄下
#cp -f /etc/passwd /etc/group /etc/shadow etc
將目錄/opt/busybox-1.17.2/examples/bootfloppy/etc下的所有文件拷貝到root_fs/etc下。
在這個目錄下有三個文件fstab, inittab, profile和一個目錄init.d,在目錄init.d中有一個文件rcS。
#cp -rf /opt/busybox-1.17.2/examples/bootfloppy/etc/* etc
在目錄etc下創建文件mdev.conf。mdev是?v的一個簡化版本,
我們可以通過文件mdev.conf自定義一些設備節點的名稱或鏈接來滿足特定的需要,但在此處讓它為空。
#touh etc/mdev.conf
(3)創建兩個設備文件dev/console dev/null。
在linux內核源碼文件init/main.c中有打開設備文件dev/console的操作如下:
static noinline int init_post(void)
__releases(kernel_lock)
{
………………………………
if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
printk(KERN_WARNING "Warning: unable to open an initial console.\n");
………………………………
}
內核啟動執行到這里時mdev還沒有構建dev目錄,如果沒有創建設備文件dev/console就將會列印警告
Warning: unable to open an initial console。
在內核啟動的過程中要將產生的一些垃圾信息丟棄就需要空設備dev/null。
#mknod dev/console c 5 1
#mknod dev/null c 1 3
5. 修改文件
在啟動過程中bootloader會傳遞參數init=/linuxrc給內核的main()函數,所以在文件系統被掛載後,
運行的第一個程序是linuxrc,而linuxrc是一個指向/bin/busybox的鏈接文件,也就是說文件系統被掛在後運行的第一個程序是busybox。
Busybox首先會解析文件/etc/inittab,這個文件中存放的是系統的配置信息,這些配置信息指明了接下來將要啟動那些程序。
-------------------------------------------------------------------------------------------------------
(1)修改文件etc/inittab如下
::sysinit:/etc/init.d/rcS
s3c2410_serial0::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
說明:
/etc/inittab 文件中每個條目用來定義一個子進程,並確定它的啟動方法,格式如下
:::
:表示這個進程要使用的控制台(即標准輸入、標准輸出、標准錯誤設備)。如果省 略,則使用與init進程一樣的控制台。
:對於Busybox init程序,這個欄位滑意義,可以省略。
:表示init程序如何控制這個子進程,
: 要執行的程序,它可以是可執行程序,也可以是腳本
文件etc/inittab配置條目說明如下:
::sysinit:/etc/init.d/rcS
啟動系統初始化文件/etc/init.d/rcS。欄位sysinit表明文件/etc/init.d/rcS在系統啟動後最先執行,
並且只執行一次,init進程等待它結束才繼續執行其它動作。(腳本文件名一般為rc,後綴S代表單用戶運行級別腳本)
tq2440_serial0::askfirst:-/bin/sh
在串口s3c2410_serial0上啟動askfirst動作的shell。
S3C2410的串口名在/dev下是s3c2410_serialx。askfirst表明init進程先輸出 「Please press Enter to actvie this console」,
等用戶輸入回車鍵之後才啟動-/bin/sh。
::ctrlaltdel:/sbin/reboot
當按下Ctrl+Alt+Delete組合鍵時,init重啟執行程序。欄位ctrlaltdel表明當按下Ctrl+Alt+Delete組合鍵時,執行相應的進程。
::shutdown:/bin/umount -a -r
告訴init在關機時運行umount命令卸載所有的文件系統,如果卸載失敗,試圖以只讀方式重新掛載。
欄位shutdown表明在重啟關閉系統命令時執行相應進程。 ------------------------------------------------------------------------------------------------------------------------------
(2)當解析完文件etc/inittab後就將啟動這些進程,首先要執行的是啟動腳本etc/init.d/rcS。
修改文件etc/init.d/rcS如下:
#! /bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
/bin/hostname CPEmbed
/sbin/ifconfig lo 127.0.0.1 up
/sbin/ifconfig eth0 192.168.1.8 netmask 255.255.255.0
/sbin/route add default gw 192.168.1.1 eth0
echo "---------------mount all-----------------"
/bin/mount -a
mkdir /dev/pts
/bin/mknod /dev/pts/0 c 136 0
/bin/mknod /dev/pts/1 c 136 1
/bin/mknod /dev/pts/2 c 136 2
/bin/mknod /dev/pts/3 c 136 3
/bin/mknod /dev/pts/4 c 136 4
/bin/mknod /dev/pts/5 c 136 5
/bin/mount -t devpts devpts /dev/pts
echo /sbin/mdev>/proc/sys/kernel/hotplug
mdev -s
/usr/sbin/telnetd &
/usr/sbin/vsftpd &
echo "******************************************"
echo "******************************************"
echo "** Kernel version: linux-2.6.31.1 **"
echo "** Date: 2012.04.12 **"
echo "******************************************"
說明如下:
#! /bin/sh 用busybox的shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin //shell命令的搜索路徑
runlevel=S //運行在單用戶模式
prevlevel=N //前一個級別為n表示沒有前一個級別
umask 022 //許可權位掩碼
export PATH runlevel prevlevel //將設置的變數導出到環境中
/bin/hostname CPembed //主機名,CPembed將出現在shell提示符中[root@CPembed/]#
/sbin/ifconfig lo 127.0.0.1 up //啟動lo
/sbin/ifconfig eth0 192.168.1.8 netmask 255.255.255.0 up //配置ip地址
/sbin/route add default gw 192.168.1.1 eth0 //添加默認路由
/bin/mount -a //將文件etc/fstab中指明的文件系統掛載到對應掛載點上
後面的8行是對telnetd的配置
echo /sbin/mdev>/proc/sys/kernel/hotplug //用mdev來處理內核的熱插拔事件。
當有熱插拔事件產生時,內核就會調用位於/sbin目錄的mdev。這時mdev通過環境變數中的ACTION和DEVPATH,
(這兩個變數是系統自帶的)來確定此次熱插拔事件的動作以及影響了/sys 中的那個目錄。接著會看看這個目錄中是否有「dev」的屬性文件,
如果有就利用這些信息為 這個設備在/dev 下創建設備節點文件。
mdev -s //建立dev目錄。以『-s』為參數調用位於/sbin 目錄寫的 mdev(其實是個鏈接,作用是傳遞參數給/bin目錄下的busybox 程序並調用它),mdev掃描 /sys/class 和/sys /block中所有的類設備目錄,如果在目錄中含有名為「dev」的文件,且文件中包含的是設備號,則 mdev 就利用這些信息為這個設備在/dev下創建設備節點文件。一般只在啟動時才執行一次「mdev -s」
/usr/sbin/telnetd & //後台運行telnetd
/usr/sbin/vsftpd & //後台運行vsftpd
------------------------------------------------------------------------------------------------------------------------------
(3)修改文件etc/fstab如下:
#device mount-point type option mp fsck order
proc /proc proc defaults 0 0
none /tmp ramfs defaults 0 0
sysfs /sys sysfs defaults 0 0
mdev /dev ramfs defaults 0 0
在系統啟動初始化文件/etc/init.d/rcS中有執行掛載命令/bin/mount -a ,這便是將文件etc/fstab中指定 的文件系統掛載到對應的掛載點上。這些文件系統的掛在是執行mdev -s命令建立dev目錄的前提------------------------------------------------------------------------------------------------------------------------------
(4)在啟動腳本etc/init.d/rcS執行完後將在串口s3c2410_serial0啟動一個shell。Shell啟動過程中會根據文件/etc/profile配置登陸環境。
文件/etc/profile修改如下:
USER=" 'id -un' "
LOGNAME=$USER
PS1='[\u@\h \W]# '
PATH=$PATH
HOSTNAME='/bin/hostname'
export USER LOGNAME PS1 PATH
具體說明:
USER="id -un" //獲取用戶名id-un與whoami命令有相同的功能
PS1='[\u@\h \W]# ' //PS1指定sh提示符的格式在本環境下將是[root@cyembed /]#
export USER LOGNAME PS1 PATH 將這些變數導出到環境。
(5)在用戶登錄時將在/etc下尋找三個文件passwd ,shadow, group匹配相關信息。
這三個文件修改如下:
/etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
/etc/group
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
ftp:x:50:
nobody:x:99:
/etc/shadow root:$6$hnswPTgxzFaZHlLl$//:14819:0:99999:7:::
bin:*:14715:0:99999:7:::
daemon:*:14715:0:99999:7:::
ftp:*:14715:0:99999:7:::
nobody:*:14715:0:99999:7:::
------------------------------------------------------------------------------------------------------------
6. 製作yaffs2根文件系統鏡像
用天嵌科技提供的yaffs2文件系統鏡像製作工具mkyaffs2image,製作根文件系統鏡像。
#./mkyaffs2image root_fs root_fs.bin
7. 將根文件系統鏡像下載到nand flash並啟動
啟動信息如下: