【问题标题】:cross compiling kernel for raspberry pi 4树莓派 4 的交叉编译内核
【发布时间】:2021-03-01 17:50:54
【问题描述】:

我是 linux 新手,我真的需要你的帮助

我正在研究结束实习的项目:控制传感器并在 LCD 屏幕上显示结果

为此,我将使用 raspberry 并创建一个 QT 应用程序来显示传感器的结果。

启动时间需要非常短,因此我想为我的 raspberri pi-4 b 创建一个最小内核

我为arm64做了交叉编译:

mkdir rasp_arm64
cd rasp_arm64/
git clone --depth=1 https://github.com/raspberrypi/linux
sudo apt-get install qemu-system-arm
sudo apt-get install lzop
sudo apt-get install gcc-aarch64-linux-gnu
cd linux/
make -j8 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- mrproper
make -j8 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig
make -j8 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs

这就是我所做的

我怎样才能为我的树莓派 4 的 bootalbe SD 卡创建一个 .img 文件?

我也参与过https://www.raspberrypi.org/documentation/linux/kernel/building.md

我补充说(cen 有人也澄清了我们为什么需要这个) KERNEL=kernel8

然后我做了 make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs mkdir mnt
mkdir mnt/fat32 mkdir mnt/ext4 sudo mount /dev/sdb6 mnt/fat32 sudo mount /dev/sdb7 mnt/ext4

 sudo env PATH=$PATH make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=mnt/ext4 modules_install

sudo cp mnt/fat32/$KERNEL.img mnt/fat32/$KERNEL-backup.img

我得到一个错误,告诉 mnt/fat32/.img 没有这样的文件或目录

我也试过了

$ sudo cp arch/arm64/boot/dts/overlays/*.dtb* mnt/fat32/overlays/
cp: target 'mnt/fat32/overlays/' is not a directory

所以我尝试创建它

$ mkdir mnt/fat32/overlays
mkdir: cannot create directory ‘mnt/fat32/overlays’: Permission denied

谁能帮帮我我在这个错误中卡住了 2 周,我需要构建我的内核才能开始处理它!

我也不知道这个版本的内核和这个配置是否最小。我可以用这种配置来缩短启动时间吗(我想改变启动顺序,一开始只启用我的应用程序所需的设备,但我当然不知道该怎么做)如果有人可以帮忙,请点亮我 !!即使你只是知道一个好的导师来推荐我什么的..

如果有人可以提供帮助,我将不胜感激

【问题讨论】:

    标签: linux-kernel cross-compiling boot sd-card raspberry-pi4


    【解决方案1】:

    https://www.raspberrypi.org/documentation/linux/kernel/building.md 的说明缺少一个步骤,并切换了另外两个步骤的顺序。 这有效:

    sudo cp arch/arm/boot/zImage mnt/fat32/$KERNEL.img 
    sudo cp mnt/fat32/$KERNEL.img mnt/fat32/$KERNEL-backup.img  
    
    sudo cp arch/arm/boot/dts/*.dtb mnt/fat32/  
    
    sudo mkdir mnt/fat32/overlays 
    sudo cp arch/arm/boot/dts/overlays/*.dtb* mnt/fat32/overlays/ 
    

    【讨论】:

    • 我已经尝试切换前两行的顺序,但对我不起作用。 sudo cp arch/arm64/boot/Image mnt3/fat32/$KERNEL.img sudo cp mnt/fat32/$KERNEL.img mnt3/fat32/$KERNEL-backup.img cp: cannot stat 'mnt/fat32/kernel8.img': No such file or directory 之后我放弃并开始使用 raspberry pi os lite 。感谢您的帮助
    【解决方案2】:
    mkdir rasp_off_exp
     cd rasp_off_exp/
     sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev
     sudo apt install crossbuild-essential-arm64
     git clone --depth=1 https://github.com/raspberrypi/linux
     cd linux/
     export KERNEL=kernel8
     make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig
     make -j8 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs
     lsblk
     mkdir mnt
     mkdir mnt/fat32
     mkdir mnt/ext4
     sudo mount /dev/mmcblk0p1 mnt/fat32
     sudo mount /dev/mmcblk0p2 mnt/ext4
     sudo env PATH=$PATH make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=mnt/ext4 modules_install
     sudo cp mnt/fat32/kernel8.img mnt/fat32/kernel8-backup.img
    

    这是代码,但是 我得到了

    cp: cannot stat 'mnt/fat32/kernel8.img': No such file or directory
    

    【讨论】:

      【解决方案3】:

      这里明显的问题是$KERNEL 的评估结果为零。这可能是因为它在本地分配了一个值并且没有导出。 而不是KERNEL=kernel8,使用

      export KERNEL=kernel8
      

      这将确保 $KERNEL 无论在何处使用都会被评估为 kernel8,这将解决问题,并且 sudo cp mnt/fat32/$KERNEL.img mnt/fat32/$KERNEL-backup.img 将作为 sudo cp mnt/fat32/kernel8.img mnt/fat32/kernel8-backup.img 执行。

      【讨论】:

      • 谢谢,但它对我不起作用 :( 我刚刚创建了一个新目录并关注 raspberrypi.org/documentation/linux/kernel/building.md 并按照您所说的将“KERNEL=kernel8”替换为“export KERNEL=kernel8”,然后我执行 'sudo cp mnt/fat32/kernel8.img mnt/fat32/kernel8-backup.img' 但我得到 'cp: cannot stat 'mnt/fat32/kernel8.img': No such file or directory' 同样的错误跨度>
      • @amina 我明白了。 :(据我所知,失败的命令是备份当前内核映像的命令。如果它不存在,那么进行备份就没有意义了。您可以尝试在跳过备份的同时继续该过程吗即sudo cp ... 部分?
      • 我试过$ sudo cp arch/arm64/boot/Image mnt/fat32/$KERNEL.img$ sudo cp arch/arm64/boot/dts/broadcom/*.dtb mnt/fat32/我很好但是当我尝试$ sudo cp arch/arm64/boot/dts/overlays/*.dtb* mnt/fat32/overlays/cp: target 'mnt2/fat32/overlays/' is not a directory$ sudo cp arch/arm64/boot/dts/overlays/README mnt/fat32/overlays/cp: cannot create regular file 'mnt2/fat32/overlays/': Not a directory所以我尝试在mnt/fat32中创建覆盖但无法工作linux/mnt/fat32$ mkdir overlays mkdir: cannot create directory ‘overlays’: Permission denied我该如何解决这个问题
      • ls 的结果:linux/mnt/fat32$ lsbcm2710-rpi-2-b.dtb bcm2711-rpi-400.dtb bcm2837-rpi-3-b.dtb bcm2710-rpi-3-b.dtb bcm2711-rpi-4-b.dtb bcm2837-rpi-3-b-plus.dtb bcm2710-rpi-3-b-plus.dtb bcm2711-rpi-cm4.dtb bcm2837-rpi-cm3-io3.dtb bcm2710-rpi-cm3.dtb bcm2837-rpi-3-a-plus.dtb kernel8.img
      • 是的,我确定,抱歉我迟到了!我开始在我的应用程序中使用 raspberry pi os lite,因为我无法修复此错误
      猜你喜欢
      • 1970-01-01
      • 2021-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-19
      • 2013-12-12
      • 1970-01-01
      • 2015-09-20
      相关资源
      最近更新 更多