为RaspberryPi制作64位内核

概览:

环境准备

  • 主机:MintLinux19.1 4.15.0-47-generic #50-Ubuntu SMP Wed Mar 13 10:44:52 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

  • 树莓派:3b Plus

  • 构建目标系统架构:aarch64

  • 交叉编译工具链:gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz

  • 环境所需软件:build-essential bison bc make util-linux(分区镜像cfdisk) kpartx(挂载镜像) vim(文件编辑器) git-core

项目目录结构:

编译内核

参考站内文章:Rpi64开发日志…..

下载工具

  • 1) 提前下载所需软件:
1
2
3
sudo apt install build-essential bison make
sudo apt install axel cmake libssl-dev
sudo apt install kpartx util-linux f2fs-tools
1
2
3
4
5
6
cd toolchain
wget https://releases.linaro.org/components/toolchain/binaries/7.4-2019.02/aarch64-linux-gnu/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz
tar -xvf gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz
mv gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu gcc-linaro-x86_64_aarch64-linux-gnu
cd gcc-linaro-x86_64_aarch64-linux-gnu
subl aarch64_env.sh #环境变量脚本

aarch64_env.sh: 写入以下内容

1
2
3
4
#!/bin/bash --posix
PERFIX=$(pwd)
echo -en "\033[33m开始添加交叉编译 *** aarch64 *** 环境\033[0m\n"
export PATH=${PATH}:${PERFIX}/bin

然后再在你的家目录,即/home/用户名/
找到.bashrc,并编辑之,加入以下内容

!!!请注意,请修改aarch64_home所指向的交叉编译工具链的目录

1
2
3
4
aarch64_home=/home/mardan/workspace/raspberry/os/toolchain
alias aarch64='echo -en "\033[40m\t *** 开始添加交叉编译环境(gcc-linaro-x86_64_aarch64-linux-gnu) *** \033[0m\n";MYPERFIX=$(pwd);cd ${aarch64_home};\
echo -en "[ OK ] ---> ";cd gcc-linaro-x86_64_aarch64-linux-gnu;source aarch64_env.sh;cd ${MYPERFIX}; \
echo -en "\033[40m\t *** 交叉编译环境设置完成(gcc-linaro-x86_64_aarch64-linux-gnu) *** \033[0m\n";'

再次运行

1
source .bashrc	#将我们定义的交叉编译工具链加入到当前环境变量
1
2
3
mkdir kernel
cd kernel
git clone https://github.com/raspberrypi/linux.git
  • 4) 编译内核
1
2
3
4
cd linux
aarch64 #将我们定义的交叉编译工具链加入环境变量
make bcmrpi3_defconfig ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
make menuconfig ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-

如果menuconfig的失败请安装的libncurses-dev的

1
sudo apt install libncurses5-dev

进入后的配置界面是这样的

编译选项 &编译kernel

  • 修改内核后缀
  • 加入cgroup的内核支持
  • 加入检查点支持
  • 加入KVM支持
  • 最后保存退出
  • 开始正式编译内核

    -jx表示可以同时进行编译的进程数建议为cpu线程数+1比四核8线程就取9
    1
    make -j9

制作镜像模板

生成rpi64-v4.19.80.img

1
2
3
mkdir rpi64os
cd rpi64os
dd bs=1M count=4096 if=/dev/zero of=rpi64-v4.19.80.img

镜像分区

1
cfdisk rpi64-v4.19.80.img

(1).选择分区格式:dos
(2).新建分区120M,primary(主分区),选择Bootable(可启动),再选则Type为(b W95 FAT32),
(3).选择剩余分区(Free space)
(4).选择新建分区(默认剩余全部),primary(主分区)
(5).选择Write写入分区信息
(6).选择Quit,完成写入

  • 6)格式化镜像rpi64-v4.19.80.img
    挂载镜像
    1
    sudo kpartx -av rpi64-v4.19.80.img

标准输出:

1
2
add map loop0p1 (253:0): 0 245760 linear 7:0 2048
add map loop0p2 (253:1): 0 8138752 linear 7:0 247808

** 然后格式化**

格式化第一个分区为FAT32,格式化第二个分区为f2fs

1
2
sudo mkfs.vfat  /dev/mapper/loop0p1
sudo mkfs.f2fs /dev/mapper/loop0p2
  • 7)挂载镜像rpi64-v4.19.80.img,复制编译后的内核及模块

然后在rpi64-v4.19.80.img所在目录

1
mkdir boot root

挂载rpi64-v4.19.80.img到boot和root

1
2
sudo mount /dev/mapper/loop0p1 boot
sudo mount /dev/mapper/loop0p2 root

下载boot分区文件

1
2
3
git clone https://github.com/ka1i/RaspberryPI3bplus_aarch64_boot.git
cd RaspberryPI3bplus_aarch64_boot
rm kernel8.img bcm2710-rpi-3-b-plus.dtb

将剩下的文件复制到boot目录下

然后进入树莓派内核源码根目录

1
cd linux

复制编译的内核

1
2
3
4
5
sudo cp -v arch/arm64/boot/Image ../../rpi64os/bootfs/kernel8.img
sudo cp -v arch/arm64/boot/Image.gz ../../rpi64os/bootfs/
sudo cp -v arch/arm64/boot/dts/broadcom/bcm2*3-b-plus.dtb ../../rpi64os/bootfs/
sudo mkdir ../../rpi64os/bootfs/overlays
sudo cp -vr arch/arm64/boot/dts/overlays/*.dtbo ../../rpi64os/bootfs/overlays

修改Cmdline.txt写有内核启动时的启动参数

1
sudo vim cmdline.txt

写入,并保存退出:

模板添加配置文件

1
root=/dev/mmcblk0p2 rootfstype=f2fs rw rootwait fsck.repair=yes
  • root = / dev / mmcblk0p2将内存卡第二分区设置为根分区
  • rootfstype = f2fs根分区类型为f2fs
  • rw可写挂载跟分区
  • rootwait等待内核识别根分区设备后再挂载
  • fsck.repair = yes启动时自动检查修复文件系统错误

安装内核模块和固件

1
2
3
4
cd linux
su
make modules_install INSTALL_MOD_PATH=<你挂载raspberry_aarch64.img的root目录>
mkdir -p <你挂载raspberry_aarch64.img的root目录>/lib/firmware/brcm

再添加frimware

bootfs

1
2
3
4
bcm2710-rpi-3-b-plus.dtb  config.txt     fixup_db.dat  kernel8.img       start_db.elf
bcm2837-rpi-3-b-plus.dtb COPYING.linux fixup_x.dat LICENCE.broadcom start.elf
bootcode.bin fixup_cd.dat Image.gz overlays start_x.elf
cmdline.txt fixup.dat issue.txt start_cd.elf

rootfs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
(base) 
┌─[mardan@Mardan-ArchLabs] - [~/workspace/EmbeddedDevelopment/rpi64@GuzalAida/rpi64os/rootfs] - [Wed Oct 09, 18:58]
└─[$] <> tree -L 3
.
└── lib
├── firmware
│   ├── 3com
│   ├── a300_pfp.fw -> qcom/a300_pfp.fw
│   ├── a300_pm4.fw -> qcom/a300_pm4.fw
│   ├── acenic
│   ├── adaptec
│   ├── advansys
│   ├── agere_ap_fw.bin
│   ├── agere_sta_fw.bin
│   ├── amdgpu
│   ├── amd-ucode
│   ├── ar3k
│   ├── ar5523.bin
│   ├── ar7010_1_1.fw
│   ├── ar7010.fw
│   ├── ar9271.fw
│   ├── as102_data1_st.hex
│   ├── as102_data2_st.hex
│   ├── ath10k
│   ├── ath3k-1.fw
│   ├── ath6k
│   ├── ath9k_htc
│   ├── atmel
│   ├── atusb
│   ├── av7110
│   ├── BCM2033-FW.bin
│   ├── BCM2033-MD.hex
│   ├── bnx2
│   ├── bnx2x
│   ├── brcm
--more--
│   ├── v4l-cx231xx-avcore-01.fw
│   ├── v4l-cx23418-apu.fw
│   ├── v4l-cx23418-cpu.fw
│   ├── v4l-cx23418-dig.fw
│   ├── v4l-cx23885-avcore-01.fw
│   ├── v4l-cx25840.fw
│   ├── vicam
│   ├── vntwusb.fw
│   ├── vpu_d.bin
│   ├── vpu_p.bin
│   ├── vxge
│   ├── WHENCE
│   ├── wil6210.brd
│   ├── wil6210.fw
│   ├── yam
│   └── yamaha
└── modules
└── 4.19.76-ARMv8_GuzalAida@rpi3b+

至此镜像模板创建完成

保存写入&退出

1
2
3
4
sync   # 同步写入
sudo umount bootfs rootfs
sudo kpartx -dv /dev/loop0
sudo losetup -d /dev/loop0

注意:至此内核已安装,现在需要添加文件系统,可以用debootstrap生成文件系统。如需自己生成文件系统,请查看debootstrap相关教程。

------ 文章已经结束,谢谢你的阅读 ------
------ article has ended,thank you for reading ------
Thanks support Me

---------------- The End ----------------