[Linux] arm和arm 64

64ARM處理器

幾乎是移動設備標準的ARM處理器正在從32v7架構轉向64v8架構。但是,軟體仍然是為v7架構編寫的,所以它不能突然遷移。因此,在切換保護級別時,可以切換32位和64位模式,並且它旨在保持相容性。儘管宣布了一個全新的IA-64架構的x86處理器,還有一個後來AMD推出了技術,讓32位與AMD64架構,歷史,英特爾已經調整相容。

如果啟動時間是由64位(AArch64)開始,您可以切換到EL1OS級)和EL0(用戶級)時選擇了32位(AArch32)模式。

Linux相容性

Linux上,ARMv7架構直到'arm'ARMv8架構'arm64'在不同的架構中處理。另一方面,gcc根據ARM名稱將其與“AArch 32”“AArch 64”區分開來,所以有必要小心。

在內核Arm64CONFIG_COMPAT現在可以通過切換到AArch32模式時,通過啟用啟動AArch32 ELF二進制用戶態運行。拱/ arm64 /Kconfig在那裡被寫入描述如下,也通過支持多的體系結構的基本功能,如系統調用和VFP的差值不僅支持模式的切換。

config COMPAT

       bool "Kernel support for 32-bit EL0"

       depends on ARM64_4K_PAGES || EXPERT

       select COMPAT_BINFMT_ELF

       select HAVE_UID16

       select OLD_SIGSUSPEND3

       select COMPAT_OLD_SIGACTION

       help

       This option enables support for a 32-bit EL0 running under a 64-bit

       kernel at EL1. AArch32-specific components such as system calls,

       the user helper functions, VFP support and the ptrace interface are

       handled appropriately by the kernel.

 

       If you use a page size other than 4KB (i.e, 16KB or 64KB), please be aware

       that you will only be able to execute AArch32 binaries that were compiled

       with page size aligned segments.

 

       If you want to execute 32-bit userspace applications, say Y.

為了運行帶arm64內核的AArch32 ELF二進製文件,需要進行如下各種準備和注意。

共享庫的對應

只要你不需要,如果AArch32 ELF只有root文件系統做任何事情,但你需要如果您建立與AArch64 ELF共存的環境中既具有共享庫。如果它是一個像debian這樣的發行版,可以通過設置來解決,但在這裡我們將考慮手動建立的情況以了解配置。

首先SYSROOT SYSROOTAArch64 ELF的(sysroot64 /)複製作為參考,並且從AArch32 ELF複製SYSROOTsysroot32 /)的庫。

$ cp - pr sysroot 64 sysroot

$ cp - pr sysroot 32 /lib sysroot/lib32

$ cp -pr sysroot32 /usr/lib sysroot/usr/lib32

當從內核調用ELF二進製文件時,帶有依賴項的庫鏈接共享庫。
那時,動態鏈接程序(ld.so)被調用,但通過為每個ELF體系結構準備此鏈接程序,它可以支持多體系結構。在上面的例子中,將AArch32 ELF加載器放在/ lib中。當然,在/ lib中也有AArch64 ELF加載器。

$ cp sysroot32/lib/ld-linux-armhf.so.3 sysroot/lib

$ ls -1 sysroot/lib /ld*

ld -2.23.so

LD-Linuxarmhf.so.3

LD-Linuxaarch64.so.1

在目標環境中,指定庫搜索路徑。如果您同時指定AArch64 ELFAArch32 ELF路徑,它將在運行時自動確定並蒐索。

export LD_LIBRARY_PATH = / lib/ usr / lib/ lib32/ usr / lib32

現在您可以使用arm64內核啟動AArch32 ELF二進製文件。

 

設備驅動程序的對應關係

ioctl()是調用已註冊在通常結構的file_operations.unlocked_ioctl成員,在不同的體系結構的情況下將被稱為已註冊到.compat_ioctl的功能的功能。此時,由於參數帶有32位定義,因此需要使用.compat_ioctl註冊函數轉換參數和返回值。struct file_operationslinux / fs.h中定義。

結構file_operations {

      

       long* unlocked_ioctl)(struct file *unsigned intunsigned long;

       long* compat_ioctl)(struct file *unsigned intunsigned long;

      

};

此外,雖然ARM LinuxILP32int / long / pointer32位),但arm64 Linux採用LP6464位長/指針,32int)。因此,sizeof獲得的類型的大小取決於體系結構。如果你用這個作為參數,它的含義將會改變。
特別是,第二個參數cmd是使用宏_IOC()定義的,但由於它在定義中使用了sizeof(),所以它的值將不會改變。

#define _IOCdirtypenrsize\

       (((dir<< _IOC _ DIRSHIFT| \

         ((type<< _ IOC_TYPESHIFT| \

         ((nr<< _ IOC _ NRSHIFT| \

         ((size<< _ IOC _ SIZES HIFT))

 

#define _IOC_TYPECHECKt)(sizeoft))

例如,如果您與內核/用戶共享以下定義,

#define HOGE_IOC_TEST _IOC_IOC_WRITE'H'0x00long

從應用端HOGE_IOC_TEST看作是從0x40044800駕駛員側看到的將是0x40084800,對於無法正確確定CMDHOGE_IOC_TEST,您需要確定掩蓋.compat_ioctlCMD或避免該類型的大小發生變化的說法。

另外,當你使用第三個參數作為指向結構的指針時要小心。結構成員的記憶體位置和大小也隨應用程序和驅動程序而改變,並且有必要避免它,因為如果添加打包的結構屬性,轉換將變得複雜。

 

 

http://arch.jpn.org/archives/272#respond

 

arrow
arrow
    全站熱搜

    立你斯 發表在 痞客邦 留言(0) 人氣()