首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux X86_64系统中ARMv8-A的交叉编译C程序

Linux X86_64系统中ARMv8-A的交叉编译C程序
EN

Stack Overflow用户
提问于 2020-07-15 17:13:27
回答 2查看 1.2K关注 0票数 1

我是Arm架构的新手,我正在尝试清除ARM的缓存。

我遵循的是“ARMv8-A程序员指南”,因为Gem-5有这个实现(https://www.gem5.org/documentation/general_docs/architecture_support/arm_implementation/),

我试图交叉编译下面的代码在linux x86_64系统使用arm-linux-gnueabi-gcc test_arm.c -o ,但我得到了以下错误。

代码语言:javascript
复制
/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

代码

代码语言:javascript
复制
#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:您可以忽略从指针到不同大小的整数的转换警告。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-15 19:44:06

我认为mrs %0,ctr_el0是ARMv8 aarch64指令,而arm-linux-gnueabi-gcc是armv7 7/aarch32编译器,您必须使用aarch64-linux-gnu-gcc

dc cavu似乎不存在,你的意思是dc cvau

有了这两个更改,它就会编译。

老实说,除了MRC之外,ARMv7中还有MRS,但我还没有完全理解什么时候应该在其中使用每一种。aarch64只有夫人,所以更简单。

对于CTR_EL0的具体情况,存在一个类似的aarch32寄存器CTR,但该寄存器是根据手册使用MRC访问的,而不是M。

以下是一个极有意义的、极具代表性的例子:

票数 2
EN

Stack Overflow用户

发布于 2020-07-15 17:31:53

问题在于指令: asm易失性(“mrs %0,ctr_el0":"=r"(ctr_el0)::);

它被翻译成汇编程序指令,它与您的ARM体系结构相关联,为此,您应该查看一下您对应的arm寄存器,看看它是否包含在其中,如果没有,则需要找到另一个具有类似用途的寄存器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62920281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档