Linuxカーネルのコンパイル(ARM-Linux)

6280 ワード

まず、私のLinux-2.6.38などのカーネルファイルが必要です.もちろん、Linuxバージョンを選択するには、対応するLinuxバージョンの基礎知識を理解する必要があります.
Linuxカーネルバージョンは2種類ある:安定版と開発版、Linuxカーネルバージョン番号は3組の数字から構成される:第1位数.第二位数3桁目
1桁目:現在リリースされているカーネルのプライマリ・バージョン.
2番目の桁数:偶数は安定したバージョンを表します.奇数は開発中のバージョンを表します.
3桁目:バージョンのリリース番号.
例1:Linux 2.6.38
1桁目:2、マスター・バージョン番号
2番目の桁数:6、次のバージョン番号、安定したバージョン(偶数であるため)を表します.
3桁目:38、バージョンのリリース番号.
したがって、Linuxを選択するときは、より安定したバージョンのLinuxカーネル、すなわち、2番目のビット数が偶数のLinuxバージョンを選択する必要があります.
 
Linuxカーネルをコンパイルする場合は、カーネルを構成する必要があります.次のいずれかのコマンドを使用できます.
make config
make menuconfig
make xconfig
make gconfig

このうちconfigはテキストベースの最も伝統的な構成インタフェースであり、使用を推奨しない.menuconfigはテキストメニューに基づく構成インタフェースである.xconfigはQTがインストールされることを要求する.gconfigはGTK+がインストールされることを要求する.
 
最初はバカにU-bootフォルダの下でコマンドを使っていたのですが、何度も何度も何度も使っていて間違いがあったことに気づきました...
カーネルとモジュールをコンパイルするときに多くの問題を発見する人が多いかもしれませんが、ここでは簡単にいくつかの問題と最終的な解決方法を挙げます.
1、make xxx_defconfigでエラーが発生しました.
~/linux-2.6.38/arch/arm/configsでs 3 c 6400_を見つけましたdefconfig、そして端末でフォルダを開きます
cd /root/linux-2.6.38/arch/arm/configs
#

2つのエラーが発生しました.1つ目はチュートリアルに従ってmake s 3 c 6400_を実行することです.defconfigで「make:`s 3 c 6400_defconfig」というエラーが発生しました.
2つ目は、make menuconfigを試したときにエラーが発生したことです.「make:***ターゲット「menuconfig」を作成するルールはありません.停止します.」
それから、私はネットで原因を探して、私が開いたフォルダが間違っていることに気づいて、Linuxカーネルフォルダを開くべきです.
したがって、ソリューションも簡単です.次のようになります.
cd /root/linux-2.6.38
#make s3c6400_defconfig # LCD , 
cp config_mini6410_a70 .config

もちろん、簡単に説明して、cdの後ろに付いているのはあなたのLinuxカーネルフォルダのアドレスです!makeの後ろには、XXXのデフォルトプロファイルが付いています.
2、make zImageの実行中にエラーが発生しました.エラーメッセージは以下の通りです.
cc1: error: unrecognized command line option "-mlittle-endian"
cc1: error: unrecognized command line option "-mapcs"
cc1: error: unrecognized command line option "-mno-sched-prolog"
kernel/bounds.c:1:0: error: unknown ABI (apcs-gnu) for -mabi= switch
kernel/bounds.c:1:0: error: bad value (armv4t) for -march= switch
kernel/bounds.c:1:0: error: bad value (arm9tdmi) for -mtune= switch
make[1]: *** [kernel/bounds.s]   1
make: *** [prepare0]   2

その後gccパスエラーであることが判明した.
変更も簡単に見えますが、お父さん、いくつか注意しなければなりません.
私と同じarm-linuxクロスコンパイルなら、まず端末で実行
arm-linux-gcc -v

私のパソコンでは次のようなヒントがあります.
Using built-in specs.
COLLECT_GCC=arm-linux-gcc
COLLECT_LTO_WRAPPER=/opt/opt/FriendlyARM/toolschain/4.5.1/bin/../libexec/gcc/arm-none-linux-gnueabi/4.5.1/lto-wrapper
Target: arm-none-linux-gnueabi

上の2つの点をよく見てください.1つはCOLLECTです.GCC、一つはCOLLECT_LTO_WRAPPER.この二つの問題を解決する鍵.
作ったarm-linuxクロスコンパイルでなければ、gccと対応経路も同様に見つかります.
次に、/root/linux-2.6.38などのlinuxカーネルフォルダのmakefileを開くと、次のセクションが表示されます.
*/Makefile
export KBUILD_BUILDHOST := $(SUBARCH)
#ARCH        ?= $(SUBARCH)
ARCH        ?= arm
CROSS_COMPILE    ?= $(CONFIG_CROSS_COMPILE:"%"=%)

以下に変更します.
*/Makefile
export KBUILD_BUILDHOST := $(SUBARCH)
#ARCH        ?= $(SUBARCH)
ARCH        := arm
CROSS_COMPILE    := GCC /GCC GCC 
# 。。。

たとえば、私の修正後は次のようになります.
*/Makefile
export KBUILD_BUILDHOST := $(SUBARCH)
#ARCH        ?= $(SUBARCH)
ARCH        := arm
CROSS_COMPILE    := /opt/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-

CROSSが見えますCOMPILEの後に付いているのは、前に特別な1つが必要だった2つのポイントで、1つはCOLLECT_GCC、一つはCOLLECT_LTO_WRAPPER.
CROSS_COMPILEの後ろの部分がCOLLECT_LTO_WRAPPERのアドレス部分に、スラッシュ'/'、さらにCOLLECT_GCCのgccの前の部分は、私のようにarm-linux-gccなので、最後にarm-linux-についています.
もちろん、コピーして修正するときに脳を動かしてください.完全コピーは役に立たず、経路が違います...
3、make zImageの実行中に再びエラーが発生し、error:'TASK_INTERUPTIBLE'undeclared(first use in this function)などの大きな列のものは、この解決は比較的簡単で、Cファイルに対応し、ヘッダファイル#includeを加えるだけで解決できます.
 
その後の実行:
make zImage
make modules

ソースコードルートディレクトリの下で圧縮されていないカーネルイメージvmlinuxとカーネルリッチテーブルファイルsystemを生成することができる.map、およびarch/arm/bootで得られた圧縮カーネルイメージzImage.