簡體   English   中英

Linux X86_64系統中ARMv8-A交叉編譯C程序

[英]Cross-compilng C program for ARMv8-A in Linux X86_64 system

我是 ARM 架構的新手,我正在試驗 Arm 的緩存清理。

我正在關注“ARMv8-A 程序員指南”,因為 Gem-5 根據( https://www.gem5.org/documentation/general_docs/architecture_support/arm_implementation/ )具有此實現,

我正在嘗試使用arm-linux-gnueabi-gcc test_arm.c -o test在 linux x86_64 系統中交叉編譯以下代碼,但出現以下錯誤。

/tmp/ccTM2bcE.s: Assembler messages:
/tmp/ccTM2bcE.s:38: Error: selected processor does not support requested special purpose register -- `mrs r3,ctr_el0'
/tmp/ccTM2bcE.s:69: Error: bad instruction `dc cavu,r3'
/tmp/ccTM2bcE.s:150: Error: selected processor does not support `dsb ish' in ARM mode
/tmp/ccTM2bcE.s:159: Error: selected processor does not support `dsb ish' in ARM mode

代碼

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <stdint.h>

void clean_invalidate(uint64_t addr){
        uint64_t ctr_el0 = 0;
        if(ctr_el0 == 0)
                asm volatile("mrs %0, ctr_el0":"=r"(ctr_el0)::);
        const size_t dcache_line_size = 4 << ((ctr_el0 >>16)&15);
        addr = addr & ~(dcache_line_size - 1);
        asm volatile("dc cvau, %0"::"r"(addr):);
}


int main(){
        int a[1000];
        int index = 0;
        uint64_t addr = 0;
        double time_spend = 0.0;
        clock_t begin = clock();
        for(int i=0;i<100;i++){
                index = rand()%1000;
                a[index] = index;
                addr = (uint64_t)(&a[index]);
                asm volatile("dsb ish");
                clean_invalidate(addr);
                asm volatile("dsb ish");
                int b = a[index];
        }
        clock_t end = clock();
        time_spend = (double)(end-begin)/CLOCKS_PER_SEC;
        printf("Time:%f\n",time_spend);
        return 0;
}

有人可以幫我在 Linux X86 系統中為 ARMv8-A 編譯此代碼。

PS:您可以忽略從指針到 integer 的不同大小警告的強制轉換。

我認為mrs %0,ctr_el0是 ARMv8 aarch64 指令,而arm-linux-gnueabi-gcc是 armv7/aarch32 編譯器,你必須使用aarch64-linux-gnu-gcc

而且dc cavu似乎不存在,您的意思是dc cvau嗎?

通過這兩個更改,它可以編譯。

老實說,ARMv7中除了MRC之外還有MRS,但是我還沒有完全明白什么時候應該在里面使用它們。 aarch64 只有 MRS,所以更簡單。

對於 CTR_EL0 的具體情況,存在一個類似的 aarch32 寄存器 CTR,但根據手冊使用 MRC 訪問,而不是 MRS。

以下是可能感興趣的大量可運行示例:

問題來自指令: asm volatile("mrs %0, ctr_el0":"=r"(ctr_el0)::);

它被翻譯成匯編指令,它與您的 ARM 架構相關,為此您應該查看您對應的 arm 寄存器,看看它是否包含在那里,如果沒有,那么您需要找到另一個具有類似目的的寄存器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM