嘗試向樹莓派3B引入Drbian 9 arm64-PART 1


Stage 1:試圖加入arm64軟件包

筆者默認您清楚這些指令背后的意義以及其可能造成的后果,並默認您已備份重要資料

sudo dpkg --add-archietcture arm64
sudo apt update

嘗試在樹莓派上執行上述兩條指令,結果如下(筆者的Raspbian已升級至Stretch):

Get:1 https://mirrors.ustc.edu.cn/raspbian/raspbian stretch InRelease [15.0 kB]
Get:2 https://mirrors.ustc.edu.cn/archive.raspberrypi.org jessie InRelease [22.9 kB]
Get:3 https://mirrors.ustc.edu.cn/raspbian/raspbian stretch/main armhf Packages [11.7 MB]
Get:4 https://mirrors.ustc.edu.cn/archive.raspberrypi.org jessie/main armhf Packages [163 kB] 
Fetched 11.9 MB in 1min 7s (177 kB/s) 
Reading package lists... Done
Building dependency tree 
Reading state information... Done
30 packages can be upgraded. Run 'apt list --upgradable' to see them.
N: Skipping acquire of configured file 'main/binary-arm64/Packages' as repository 'https://mirrors.ustc.edu.cn/raspbian/raspbian stretch InRelease' doesn't support architecture 'arm64'
N: Skipping acquire of configured file 'rpi/binary-arm64/Packages' as repository 'https://mirrors.ustc.edu.cn/raspbian/raspbian stretch InRelease' doesn't support architecture 'arm64'
N: Skipping acquire of configured file 'main/binary-arm64/Packages' as repository 'https://mirrors.ustc.edu.cn/archive.raspberrypi.org jessie InRelease' doesn't support architecture 'arm64'
N: Skipping acquire of configured file 'non-free/binary-arm64/Packages' as repository 'https://mirrors.ustc.edu.cn/archive.raspberrypi.org jessie InRelease' doesn't support architecture 'arm64'
N: Skipping acquire of configured file 'contrib/binary-arm64/Packages' as repository 'https://mirrors.ustc.edu.cn/archive.raspberrypi.org jessie InRelease' doesn't support architecture 'arm64'
N: Skipping acquire of configured file 'ui/binary-arm64/Packages' as repository 'https://mirrors.ustc.edu.cn/archive.raspberrypi.org jessie InRelease' doesn't support architecture 'arm64'

易得:Raspbian里並沒有arm64的軟件包——至少沒有索引文件……

筆者遂修改sources.list:

deb https://mirrors.ustc.edu.cn/raspbian/raspbian/ stretch main rpi
deb https://mirrors.ustc.edu.cn/debian/debian/ stretch main

並執行:

wget https://mirrors.ustc.edu.cn/debian/pool/main/d/debian-archive-keyring/debian-archive-keyring_2017.5_all.deb
sudo dpkg -i debian-archive-keyring_2017.5_all.deb
sudo apt update

得:

Hit:1 https://mirrors.ustc.edu.cn/raspbian/raspbian stretch InRelease
Hit:3 https://mirrors.ustc.edu.cn/archive.raspberrypi.org jessie InRelease
Get:4 https://mirrors.ustc.edu.cn/debian stretch/main arm64 Packages [6,936 kB]
Get:5 https://mirrors.ustc.edu.cn/debian stretch/main armhf Packages [6,925 kB]                                                       
Get:6 https://mirrors.ustc.edu.cn/debian stretch/main Translation-en [5,395 kB]                                                       
Fetched 19.3 MB in 1min 30s (212 kB/s)                                                                                                
Reading package lists... Done
Building dependency tree       
Reading state information... Done
244 packages can be upgraded. Run 'apt list --upgradable' to see them.
N: Skipping acquire of configured file 'main/binary-arm64/Packages' as repository 'https://mirrors.ustc.edu.cn/raspbian/raspbian stretch InRelease' doesn't support architecture 'arm64'
N: Skipping acquire of configured file 'rpi/binary-arm64/Packages' as repository 'https://mirrors.ustc.edu.cn/raspbian/raspbian stretch InRelease' doesn't support architecture 'arm64'
N: Skipping acquire of configured file 'main/binary-arm64/Packages' as repository 'https://mirrors.ustc.edu.cn/archive.raspberrypi.org jessie InRelease' doesn't support architecture 'arm64'
N: Skipping acquire of configured file 'non-free/binary-arm64/Packages' as repository 'https://mirrors.ustc.edu.cn/archive.raspberrypi.org jessie InRelease' doesn't support architecture 'arm64'
N: Skipping acquire of configured file 'contrib/binary-arm64/Packages' as repository 'https://mirrors.ustc.edu.cn/archive.raspberrypi.org jessie InRelease' doesn't support architecture 'arm64'
N: Skipping acquire of configured file 'ui/binary-arm64/Packages' as repository 'https://mirrors.ustc.edu.cn/archive.raspberrypi.org jessie InRelease' doesn't support architecture 'arm64'

似乎是成功了……

然而,嘗試選擇安裝一個arm64軟件包,都會遇到不可描述的依賴問題:

pi@raspberry:~ $ sudo apt install libc6:arm64 libgcc1:arm64
Reading package lists... Done
Building dependency tree        
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 bluez : Depends: libc6 (>= 2.15) but it is not going to be installed
         Depends: libdbus-1-3 (>= 1.1.1) but it is not going to be installed
         Depends: libglib2.0-0 (>= 2.28.0) but it is not going to be installed
         Depends: libreadline6 (>= 6.0) but it is not going to be installed
         Depends: libudev1 (>= 196) but it is not going to be installed
         Depends: init-system-helpers (>= 1.18~) but it is not going to be installed
         Depends: kmod
         Depends: udev (>= 170-1)
         Depends: dbus
 libgcc1:arm64 : Depends: gcc-6-base:arm64 (= 6.3.0-18) but it is not going to be installed
E: Error, pkgProblemResolver::Resolve generated breaks, this may be caused by held packages.

 Stage 2:嘗試在32位環境中執行64位程序

首先,口胡編寫一個C程序,存為test64.c:

#include <time.h>
#include <stdio.h>

long long fastpow_m(long long base,long long power,long long k)
{
    long long result = 1;
    while (power!=0)
    {
        if (power%2 == 1)result = (result*base)%k;
        base = (base*base)%k;
        power /= 2;
    }
    return result;
}

int main()
{
    long long b,p,faq;
    long t1,t2;
    scanf("%lld %lld %lld",&b,&p,&faq);
    printf("%lld %lld\n",b,p,faq);
    t1 = clock();
    printf("result :%lld\n",fastpow_m(b,p,faq));
    t2 = clock();
    printf("fastpow_m(): %f s.\n",((double)(t2-t1)/(double)CLOCKS_PER_SEC));

    t1 = clock();
    long long r = 1;
    for (int i=1;i<=p;i++)r*=b,r = r%faq;
    printf("result :%lld\n",r);
    t2 = clock();
    printf("normal: %f s.\n",((double)(t2-t1)/(double)CLOCKS_PER_SEC));
    return 0;
}

(參加過NOI/NOIP/ACM之類競賽的人一眼就能看出:這是一個模意義下的二分快速冪計算程序:))

安裝交叉編譯工具鏈並編譯:

sudo apt install gcc-aarch64-linux-gnu 
aarch64-linux-gnu-gcc fastpow.c -static -o /tmp/test64
file /tmp/test64
/tmp/test64

得:

/tmp/test64: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, for GNU/Linux 3.7.0, BuildID[sha1]=a8009a666be247cfdf0b6d7827a8099dee36f1ba, not stripped

-bash: /tmp/test64: cannot execute binary file: Exec format error

看樣子還是不行,我的程序白口胡寫了……唉……

Stage 3:編譯64位內核:

偶然間發現一篇舊的文章,闡述了自行編譯內核的方法,筆者遂依葫蘆畫瓢編譯內核。

至於編譯內核用的工具鏈?

sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

然后……

git clone https://github.com/raspberrypi/linux.git
#4.12解決了VCHI和WiFi問題
git checkout rpi-4.12.y

cd linux
#帶##的是注釋掉的原文指令
## make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcmrpi3_defconfig
# 調整配置
# 詳見 https://www.cnblogs.com/UMRNInside/p/7197656.html
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig


## make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j $(nproc)

然后是就是漫長的等待(git clone 會產生1.54GiB的流量,消耗2G以上的磁盤空間;至於編譯過程……我想大家都懂得。)

工具鏈來源(可選):

sudo apt install gcc-aarch64-linux-gnu

接下來:

#設SD卡根分區位於/mnt/ext4,boot分區位於/mnt/boot
cp arch/arm/boot/Image mnt/fat32/kernel8.img

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=/mnt/ext4 modules
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=/mnt/ext4 modules_install
mv /mnt/boot/bcm2710-rpi-3-b.dtb bcm2710-rpi-3-b.dtb_32

cp arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b.dtb /mnt/boot

試着啟動樹莓派,一次成功,板載無線網卡以AP模式正常工作。

此時系統大部分組件仍為32位版本,RPi.GPIO無法正常使用,且無法使用硬浮點指令集(使用aarch64-linux-gnu-)。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM