Raspberry Pi上級コース3:Linuxカーネルソースディレクトリツリーのリテラシー分析、Raspberry Pi関連の操作に適したLinuxカーネルの構成、カーネルのコンパイル、移植

Linuxカーネルソースディレクトリツリーのリテラシー分析

1. Linuxカーネルソースディレクトリツリーリテラシー分析:

sudo apt-get install tree
tree   //查看目录树

約1.3wCファイル:1100w行のコード
Linuxはオープンソースで無料です。Linuxオープンソースコミュニティワーカーは共同で
Linuxをオープンソースとして維持し、マルチアーキテクチャとマルチプラットフォームコードをサポートし、非常に高い移植性を備えています。

しかし、Linuxカーネルは通常、いくつかのM ---- 4Mにコンパイルされます

マルチプラットフォームとマルチアーキテクチャをサポートしているため、コンパイルする前に構成し、使用するのに適したターゲットプラットフォームに構成する必要があります
。プラットフォーム:ARM(HiSilicon、Friendly Arm、Raspberry Pi、nanopi)X86 MIPS

参考記事:
Linuxカーネルソースコードディレクトリツリー構造

ソースディレクトリツリーの構造を理解する

2. RaspberryPi関連の操作に適したLinuxカーネルを構成します。

作業するときは、ドライバーコードを記述してからドライバーコードをコンパイルする必要がありますが、ドライバーコードのコンパイルにはプリコンパイルされたカーネル、カーネルをコンパイルします構成する必要があります

構成の最終目標は、.configファイルを生成します。このファイルは、Makefileに有用なものをカーネルに編成するように指示します。

製造元にはLinuxカーネルソースコードが装備されています。たとえば、Raspberry Piを購入すると、製造元からRaspberry Pi Linuxカーネルソース
コードが提供されます。ソースコード取得すると、製造元のソースコードが含まれます。

最初の方法:

cp 厂家.config .config
find . -name *_defconfig
找到:
./arch/arm/configs/bcm2709_defconfig

2番目の方法:

make menuconfig   //一项项配置,通常基于厂家的config来配置

3番目の方法:

メーカー自身の家族:すべて自分で行う

Linux Raspberry Piのカーネルを構成するにはどうすればよいですか?

方法1:

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig
//用来配置,指定编译器

このコマンドの機能は次のとおりです。bcm2709_defconfigの構成を.configに取得します
プロジェクトで直接構成を使用できますが、この場合、元のRaspberryPiの構成が失われる可能性があります。現在使用中のRaspberryPiの構成を取得する方法を次に示します。
ここに写真の説明を挿入
Manufacturer.configをconfigに変更することを実現します

方法2:必要なライブラリ

インストールするためのドライバを追加します。

sudo apt-get install bc
sudo apt-get install libncurses5-dev libncursesw5-dev
sudo apt-get install zlib1g:i386
sudo apt-get install libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5

インストール後:

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig

ここに写真の説明を挿入
2つの読み込み方法を駆動します。

*:カーネルにコンパイルします----- zImageにはドライバーが含まれています。
M:ドライバファイルxxx.koは、システムの起動後、次のコマンドを使用してモジュールモードで生成されます。
inmosd xxx.ko 負荷

**方法3:**一時的に無視する

3. Linuxカーネルのコンパイル:

编译:

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs 2>&1 | tee build.log
//arm架构,内核7,j4:指定用多少电脑资源编译,
//zImage:生成内核镜像
//modules:生成驱动模块
//dtbs:生成配置文件

nプロセスでコンパイルします。プロセス数が指定されていない場合、デフォルトで単一プロセスとしてコンパイルされます。
ここに写真の説明を挿入カーネルが正常にコンパイルされた後、ソースツリーにさらにvmlinuxがあることがわかります。失敗した場合、そのようなファイルはありません。
成功した後、zImageは私たちが必要とするターゲット画像です

cd arch/arm
cd boot
ls

ここに写真の説明を挿入

3.LinuxカーネルイメージをRaspberryPiにコピーし、新しいカーネルを起動します

zImageファイルをパックします。

linuxソースコードパッケージのツールを直接使用します。

./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img

このディレクトリに1つ生成しますkernel_new.imgファイル、このファイルはSDカードに配置されるファイルです。
注意:インターネット上の多くの場所で、tools / mkimage /imagetool-uncompressd.pyの使用は機能しないと言われています。

ここに写真の説明を挿入
画像をコピーし
ます。1。RaspberryPiの電源を切り、SDカードを引き出し、カードリーダーを使用してコンピューターを挿入し、仮想マシンに接続します。

dmesg    //显示可移动设备信息

ここに写真の説明を挿入

cd  //回到根目录
mkdir data1
mkdir data2
//数据拷贝;创建两个文件夹,挂载U盘
sudo mount /dev/sdb1 data1//一个fat分区,是boot相关的内容,kernel的img文件就放在这个分区里;
sudo mount /dev/sdb2 data2//一个是ext4分区,也就是系统的根目录分区
//  sudo umount /dev/sdb1   //取消挂载
//data1:U盘数据   data2:根目录数据

ここに写真の説明を挿入
data2:ここに写真の説明を挿入

モジュールのインストール:

sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=/home/dazai/data2 modules_install

デバイスドライバファイルをインストールします:hdmi interface usb WiFiioなど。
ここに写真の説明を挿入

kernel.imgファイルを更新します。

注意:ミラー名:kernel7.img

cd data1
ls
//可以看到kernel7.img 文件
cp  kernel7.img  kernel7OLD.img//做一个备份

ここに写真の説明を挿入
次に、新しく生成されたコンパイルをdata1にコピーし、次の名前を付けます。kernel7.img

cp kernel_new.img  /home/dazai/data1/kernel7.img

md5sum kernel_new.img//检查cp是否成功
md5sum /home/dazai/data1/kernel7.img

ここに写真の説明を挿入
ここに写真の説明を挿入
コピーは成功しました。

他の関連ファイルをコピーします。

cp arch/arm/boot/dts/.*dtb* /home/dazai/data1/
cp arch/arm/boot/dts/overlays/.*dtb* /home/dazai/data1/overlays/
cp arch/arm/boot/dts/overlays/README /home/dazai/data1/overlays/

その後、UbuntuはSDカードの処理を切断し、キャプチャするためにWindowsに送信します。
復元:変更
ここに写真の説明を挿入
後:SDカードをRaspberry Piに挿入し直し
、シリアルポートからログインして起動プロセスを監視し
、RaspberryPiターミナルに入ります。

 uname -r

ここに写真の説明を挿入
カーネルバージョンが変更されました。
Raspberry Piカーネルの構成、コンパイル、および移植は成功しました。
これらの操作は以下から生じます。
ドライバコードのコンパイルには、事前にコンパイルされたカーネルが必要です

参考記事:
Raspberry Pi-カーネル開発-コードをダウンロードし、カーネルをコンパイルおよび置換する手順

おすすめ

転載: blog.csdn.net/weixin_40734514/article/details/108730597