32-битная система ARM установлена по умолчанию в системе Raspberry Pi, но 64-битная система ARM поддерживается начиная с Raspberry Pi 3. Поскольку официальная система не предоставляет 64-битную систему, нам приходится ее компилировать самостоятельно.
На самом деле в интернете много 64-битных ядер, скомпилированных для Raspberry Pi 3B. Я пробовал их все, но все они не запускались. Не то, чтобы они были написаны неправильно, но они у меня вроде не работали. Таким образом, следующие шаги не гарантируют, что все смогут добиться успеха, потому что ситуация у всех разная, и вызванные проблемы тоже разные, поэтому проблема может полагаться только на Baidu или Google.
И есть много замечаний, что только ядро компилируется в 64-битное, но файловая система по-прежнему является официальной 32-битной системой, которую нельзя назвать настоящей 64-битной системой, поэтому я также буду строить корневую файловую систему как 64-битная система позже.
Это неизбежно, что при записи заметок будут упущения.Если есть какой-либо неправильный шаг, пожалуйста, оставьте сообщение и измените его вовремя.
Если вы не хотите быть таким хлопотным и хотите использовать 64-битную систему напрямую, вы можете загрузить 64-битную систему с открытым исходным кодом:Debian-Pi-Aarch64, это сторонний, официально не предоставленный Raspberry Pi.
Среда компилятора
Виртуальная среда Linux устанавливается через виртуальную машину vm, как ее установить в интернете можно найти, просто следуйте инструкциям по установке.
Компилятор: Ubuntu 18.04-desktop-amd64
Если вы хотите скомпилировать 64-битное ядро, вы можете скомпилировать его только на 64-битной машине.
кросс-компилятор
Сгенерировать 64-битное ядро (Kernel) через кросс-компилятор
определение:Кросс-компилятор (английский: кросс-компилятор) относится к компилятору, который может генерировать исполняемые файлы для другой системной платформы на одной системной платформе.
Мое понимание этой фразы следующее:
-
Ubuntu 18.04-amd64: фабрика по обработке одежды на заказ (определенная системная платформа)
-
Кросс-компилятор: машина (компилятор), которая делает одежду
-
Исходный код Linux (ядро): материал одежды (исходный код исполняемого файла)
-
Raspberry Pi 4B: Люди (другая платформа)
С вышесказанным, теперь я хочу сделать предмет одежды для людей, тогда мне нужно найти фабрику, которая специализируется на пошиве одежды для людей.После передачи материалов для одежды на фабрику, одежда, изготовленная машиной, которая делает одежду могут носить люди.
Понимание у всех разное, просто запомните определение профессионала выше, и вы сможете понять, как вы хотите следовать своему собственному.
Скомпилируйте ядро (kernel)
Как определено выше, нам всем нужно получить четыре, прежде чем мы сможем их сделать; сначала должен быть установлен Ubuntu; Raspberry Pi должен быть готов.
Вы можете использовать обычных пользователей, старайтесь не использовать пользователя root для выполнения, а когда вам нужно использовать пользователя root, переключитесь на пользователя root для выполнения
Перед компиляцией ядра
- Получить кросс-компилятор и настроить
Скачать по ссылке вышеgcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz, она может быть обновлена, дата и версия изменятся. или скачать командой
$ sudo wget https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz
Создайте рабочий каталог, и последующие операции выполняются в рабочем каталоге
$ mkdir ~/build && cd ~/build
$ sudo apt-get install lrzsz
# 把下载好的文件上传并解压
$ rz
$ sudo tar -xvf gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz -C /usr/src/
$ cd /usr/src/ && sudo mv gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu aarch64-linux-gnu
$ sudo vi /etc/profile
or
$ sudo vi ~/.bashrc
# 末尾添加以下内容
export ARCH_HOME=/usr/src/aarch64-linux-gnu
export PATH=$PATH:$ARCH_HOME/bin
$ source /etc/profile
or
$ source ~/.bashrc
Примечание: если это обычный пользователь, вам нужно переключиться на root и настроить его снова.Обычные пользователи также должны настроить
- Получите исходный код ядра Raspberry.
Raspberry теперь по умолчанию имеет версию 4.19, но есть и более высокие версии. Вы можете изменить версию, чтобы увидеть, какую из них вы загружаете. Официальная загрузка Raspberry с github очень медленная. Я перенес Raspberry Linux в облако внутреннего кода, поэтому вы можете скачать это так Очень быстро встает, разница в том, что официальное обновление не будет обновляться в моем облачном репозитории кода. собственное облако кода. Просто замените ссылку на свою, выберите загрузку из следующей команды
$ cd ~/build
$ sudo apt-get install git
# 官方的github地址
$ git clone --depth=1 --branch rpi-4.19.y https://github.com/raspberrypi/linux
# 码云的地址
$ git clone --depth=1 --branch rpi-4.19.y https://gitee.com/nzwxl/linux
- Установите зависимости, необходимые для среды сборки.
$ sudo apt-get install git bison flex libssl-dev zip libncurses-dev make
Зависимость libncurses-dev поддерживается конфигом меню
Начинается компиляция ядра
# 如果源码文件不叫linux,可以mv 改成linux或者你想要的的名字
$ cd linux
# 在编译之前可以先进行清除命令,以保证清洁的环境,如果在编译的环节出错或者操作失误,可以运行此命令重新开始。
$ make distclean
# 编译.config,ARCH要配置成arm64,如果不配置则默认为开发机的x86了,CROSS_COMPILE指定编译器
# bcm2711_defconfig在 arch/arm64/configs/bcm2711_defconfig,它会自己根据Makefile自己去找这个文件
$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig
# 在当前的.config基础上开始裁剪内核,如果没有要裁剪的按ESC两次退出即可,主要是我也没太了解,等我了解了再记
$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
# 开始编译内核, 参数-j5的意思是 使用多处理器同时编译内核,数字最大为:cpu的核数 × 1.5,可自行修改
$ make -j5 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
Если в середине сообщения об ошибке не сообщается, файл двоичного ядра образа будет сгенерирован в каталоге arch/arm64/boot примерно через час; если будет создано 32-битное ядро, двоичное ядро zImage будет сгенерировано в папке arch/arm /boot; Создайте самый примитивный файл ядра vmlimux в каталоге linux.
vmlinunx: Самый примитивный файл ядра Linux.
zImage: загружаемый двоичный файл ядра, сжатый и отлаженный.
Изображение: загружаемый двоичный файл ядра без сжатия.
Для получения дополнительной информации о файле ядра вы можете найти его в Google.
Установить модули ядра
Этот модуль используется в корневой файловой системе (rootfs) позже, сначала установите его в рабочий каталог ~/build, не забудьте поставить[user]Замените своим именем пользователя
$ cd ~/build/linux
# 切换到root用户下
$ su
$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=/home/[user]/build/ modules_install
$ su [user]
Загрузочный файл Raspberry Pi
Поскольку официальный загрузчик Raspberry Pi не является открытым исходным кодом, но предоставляет в загрузочном каталоге все, что можно использовать.Точно так же я перешел на облако кода, потому что загрузка была слишком медленной из-за скорости сети.
$ cd ~/build
$ git clone --depth=1 https://github.com/raspberrypi/firmware/
or
$ git clone --depth=1 https://gitee.com/nzwxl/firmware/
# firmware/boot 下就是需要的文件了
$ ls firmware/boot
Сделать rootfs для архитектуры ARM64
Как сделать рутфс ARM64 я записал в другой заметке.На этом шаге можно продолжать действовать в порядке той заметки.После того как рутфс сделан,вернитесь к этой заметке и подключитесь к следующему шагу.
Ядро, uboot, rootfs запакованы в образ
сделать файл изображения
- Создайте файл образа корневой файловой системы размером 1000 МБ, а затем разделите файл образа.
После прожига показывает, что 90% из 1000M использовано, поэтому, если есть много дел, которые нужно сделать или что-то загрузить, лучше создать файл образа большего размера.
$ cd ~/build
$ fallocate -l 1000M rootfs.img
# 分区
$ fdisk rootfs.img
a.输入o。这将清除映像文件上的任何分区。
b.键入p以列出分区。应该没有分区。
c.键入n,然后p为primary,1表示驱动器上的第一个分区,按ENTER接受默认的第一个扇区,然后为最后一个扇区键入+ 100M。
d.键入t,然后c将第一个分区设置为键入W95 FAT32(LBA)。
e.键入n,然后p表示主驱动器,2表示驱动器上的第二个分区,然后按两次ENTER键接受默认的第一个和最后一个扇区。
f.写入分区表并键入w退出。
# 可通过命令查看设置好的分区
$ fdisk -l rootfs.img
- Смонтируйте образ в loopX с помощью kpartx
В linux, если файл образа (.img) содержит таблицу разделов, использовать mount нельзя, можно использоватьkpartxМаунт; Х - это число, которое вы показываете, Y - это тоже число, не обязательно одинаковое для всех, первоеloopXpYЭто первый раздел после вышеуказанного раздела, а второй - второй раздел
$ sudo apt-get install kpartx
$ sudo kpartx -av rootfs.img
add map loopXpY (254:0): 0 204800 linear 7:0 2048
add map loopXpY (254:1): 0 407552 linear 7:0 206848
# 这两个设备可以在 /dev/mapper/ 目录中看到
$ ls /dev/mapper/
- Отформатируйте раздел и укажите имя раздела LABEL
$ sudo mkfs.vfat -n BOOT /dev/mapper/loop5p1
$ sudo mkfs.ext4 -F -L ROOTFS -O "^has_journal" /dev/mapper/loop5p2
# 第一个命令中的-n 参数就是指定LABEL,可以通过 man mkfs.vfat 查看参数详情
# 第二个命令的 -F 是强制的意思(理解的不对可以纠正我),-L 指定LABEL 同样可以通过man mkfs.ext4 查看参数详情
- Создайте точку монтирования и смонтируйте ее
После форматирования раздела теперь можно монтироватьloopXpYустройство для файла
$ sudo mkdir {/mnt/loopXp1,/mnt/loopXp2}
$ sudo mount /dev/mapper/loop5p1 /mnt/loopXp1
$ sudo mount /dev/mapper/loop5p2 /mnt/loopXp2
Скопируйте необходимые файлы для ядра и загрузки
$ cd ~/build
# 复制boot所需文件
$ sudo cp -r firmware/boot/* /mnt/loopXp1/
$ sudo cp linux/arch/arm64/boot/dts/broadcom/*.dtb /mnt/loopXp1
$ sudo cp linux/arch/arm64/boot/dts/overlays/*.dtb* /mnt/loopXp1/overlays/
$ sudo cp linux/arch/arm64/boot/dts/overlays/README /mnt/loopXp1/overlays/
# 复制内核
$ sudo cp linux/arch/arm64/boot/Image /mnt/loopXp1/kernel8.img
Напишите cmdline.txt и config.txt
Ссылаться на:RPi_cmdline.txt
написать cmdline.txt
# 添加内容并保存退出
$ sudo vim /mnt/loopXp1/cmdline.txt
console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 rw rootwait fsck.repair=yes
- console=serial0,115200: Какое устройство используется последовательным портом и скорость передачи
- console=tty1: использовать устройство tty1 для вывода на консоль
- root=/dev/mmcblk0p2: установить второй раздел карты памяти в качестве корневого раздела
- rootfstype=ext4: тип корневого раздела f2fs следует заменить на f2fs.
- rw: доступное для записи монтирование и раздел
- rootwait: подождите, пока ядро распознает устройство корневого раздела, прежде чем монтировать
- sck.repair=yes: автоматически проверять наличие ошибок файловой системы при запуске.
написать config.txt
# 添加内容并保存退出
$ sudo vim /mnt/loopXp1/config.txt
# 以64位读取内核
arm_64bit=1
# 想要以ARMV8的模式启动,设置此选项
arm_control=0x200
# 内核的名字
kernel=kernel8.img
# u-boot进行引导kernel时延迟几秒
boot_delay=1
# 关闭蓝牙功能
# See /boot/overlays/README for all available options
dtoverlay=disable-bt
# 开启音频snd_bcm2835
dtparam=audio=on
Синхронизируйте rootfs с зеркальным вторым разделом
$ sudo apt-get install rsync
$ cd ~/build/linux-rootfs/
# 开始同步
$ sudo rsync -HPavz -q ./ /mnt/loopXp2
Подробное объяснение параметров rsync:команда rsync
написать файл fstab
Если вы хотите, чтобы загрузочный каталог в первом разделе отображал файлы после запуска системы, вам необходимо/etc/fstabДобавьте следующее:
$ sudo vim /mnt/loopXp2/etc/fstab
<file system> <mount point> <type> <options> <dump> <pass>
LABEL=BOOT /boot vfat defaults 0 1
- файловая система: Это может быть фактическое имя раздела или метка тома (Lable) фактического раздела.Имя метки тома было указано выше.
- точка монтирования: точка монтирования
- тип: тип файловой системы для этого раздела, тип vfat бит fat32 должен быть
- options: это опция монтирования, используемая для установки параметров монтирования, общими являются следующие параметры
- defaults: rw, suid, dev, exec, auto, nouser, and async.
- auto: система монтируется автоматически, fstab по умолчанию использует эту опцию
- noauto не монтируется автоматически при загрузке
- nouser Только суперпользователи могут монтировать
- ro монтируется с правами только на чтение
- RW монтирует с разрешениями чтения и записи
- user может быть установлен любым пользователем
- дамп: параметр резервного копирования.При значении 1 программе резервного копирования дампа будет разрешено резервное копирование, при значении 0 операция резервного копирования будет игнорироваться;
- pass: параметр проверки диска fsck, его значение — порядок. Когда его значение равно 0, оно никогда не проверяется, а раздел корневого каталога / всегда равен 1. Остальные разделы начинаются с 2, и чем меньше число, тем больше проверяется.Если номера двух разделов совпадают, они проверяются одновременно.
установить модуль ядра
Поскольку модули были установлены в рабочий каталог при компиляции ядраbuildПосередине вы можете напрямую скопировать его во второй раздел.Если вы беспокоитесь, вы можете использовать команду для установки модулей, чтобы установить его во второй раздел и изменить путь.
$ cd ~/build
$ sudo cp -r lib/modules/ /mnt/loopXp2/lib/
Удалите и запишите файлы IMG на SD-карту
$ cd ~/build
$ sync
$ sudo umount /mnt/loopXp1/
$ sudo umount /mnt/loopXp2/
$ sudo kpartx -dv rootfs.img
Загрузите файл rootfs.img в Windows и запишите его на SD-карту.Способ записи на SD-карту см. здесь:
После запуска Raspberry проверьте, что версия ядра 64-битная командой