我很好奇在AARCH64-Linux机器上运行旧的ARM32-Linux程序的可行性,我做了一些实验:编写程序“Hello,World!”并使用arm-none-linux-gnueabi-gcc和aarch64-linux-gnu-gcc对其进行静态编译。使用busybox和aarch64编译器静态构建和创建ramdisk。将2“Hello,World!”程序(在ARM32和AARCH64中)到ramdisk。使用vexpress_defconfig和aarch64编译器构建一个简单的AARCH64-Linux内核。使用qemu-system-aarch64运行内核和ramdisk。
我尝试为指令行清除和使ARMv7处理器缓存无效,因为指令代码可能会在执行过程中发生变化。为了达到效果,我尝试了两种变体。他们在这里:我使用了GCC__clear_cache()函数,但它没有给出所需的结果。缓存中的指令代码没有改变。我查找了GCC的源代码并找到了uclinux-eabi.h文件,我在其中找到了下一个用于清除缓存的代码:/*Cleartheinstructioncachefrom`beg'to`end'.ThismakesaninlinesystemcalltoSYS_cacheflush.*/#undefCLEAR_INSN_CACHE#defineCLEAR_INSN
我尝试为指令行清除和使ARMv7处理器缓存无效,因为指令代码可能会在执行过程中发生变化。为了达到效果,我尝试了两种变体。他们在这里:我使用了GCC__clear_cache()函数,但它没有给出所需的结果。缓存中的指令代码没有改变。我查找了GCC的源代码并找到了uclinux-eabi.h文件,我在其中找到了下一个用于清除缓存的代码:/*Cleartheinstructioncachefrom`beg'to`end'.ThismakesaninlinesystemcalltoSYS_cacheflush.*/#undefCLEAR_INSN_CACHE#defineCLEAR_INSN
'bl'或带有链接指令的分支几乎总是变成0xebfffffe但是,处理器和GNUbinutilsobjdump以某种方式知道分支位置:00000000:0:e1a0c00dmovip,sp4:e92ddff0push{r4,r5,r6,r7,r8,r9,sl,fp,ip,lr,pc}8:e24cb004subfp,ip,#4c:e24dd038subsp,sp,#56;0x3810:ebfffffebl014:e59f0640ldrr0,[pc,#1600];65c18:ebfffffebl74他们怎么知道的? 最佳答案 问题是由于
'bl'或带有链接指令的分支几乎总是变成0xebfffffe但是,处理器和GNUbinutilsobjdump以某种方式知道分支位置:00000000:0:e1a0c00dmovip,sp4:e92ddff0push{r4,r5,r6,r7,r8,r9,sl,fp,ip,lr,pc}8:e24cb004subfp,ip,#4c:e24dd038subsp,sp,#56;0x3810:ebfffffebl014:e59f0640ldrr0,[pc,#1600];65c18:ebfffffebl74他们怎么知道的? 最佳答案 问题是由于
我读过Linux中的系统调用,到处都有关于x86架构的描述(0x80中断和SYSENTER)。但是我无法在ARM架构中追踪系统调用的文件和进程。谁能帮忙。我知道的几个相关文件是:arch/arm/kernel/calls.Sarch/arm/kernel/entry-common.S(需要解释) 最佳答案 比你问的更通用的答案。在Linux上mansyscall(2)是了解如何在各种体系结构中进行系统调用的良好开端。复制自manpage:ArchitecturecallingconventionsEveryarchitectureh
我读过Linux中的系统调用,到处都有关于x86架构的描述(0x80中断和SYSENTER)。但是我无法在ARM架构中追踪系统调用的文件和进程。谁能帮忙。我知道的几个相关文件是:arch/arm/kernel/calls.Sarch/arm/kernel/entry-common.S(需要解释) 最佳答案 比你问的更通用的答案。在Linux上mansyscall(2)是了解如何在各种体系结构中进行系统调用的良好开端。复制自manpage:ArchitecturecallingconventionsEveryarchitectureh
栈是一种特殊的数据结构,其特点是后进先出(LIFO,LastInFirstOut)。在ARM汇编中,栈通常用于保存函数调用时的寄存器状态、局部变量和返回地址等。本节将详细介绍ARM汇编中的栈操作指令,并通过实例帮助你更好地理解和掌握这些指令。推入栈(PUSH)PUSH指令用于将一个或多个寄存器的值推入栈中。基本语法如下:PUSH{reglist}其中,reglist是要推入栈的寄存器列表。示例:PUSH{R0-R3};将寄存器R0-R3的值推入栈中在这个示例中,PUSH指令将寄存器R0-R3的值推入栈中。注意,ARM汇编中的栈默认使用降序(FullDescending)模式,即栈顶指针指向栈的
我计划开发一个漂亮的小应用程序,它将在基于arm的嵌入式Linux平台上运行;但是,由于该平台将由电池供电,我正在搜索有关如何处理节电的相关信息。获得合适的电池使用时间很重要。我认为Linux内核对此提供了一些支持,但我找不到关于此主题的任何文档。欢迎就如何设计我的程序和系统提出任何意见。也欢迎任何有关Linux内核如何尝试解决此类问题的意见。其他问题:用户空间的程序需要做多少?需要修改内核吗?哪些内核系统调用或API值得了解?更新:似乎参与“FreeElectrons”网站的人们就此主题制作了一些不错的演示文稿。http://free-electrons.com/services/p
我计划开发一个漂亮的小应用程序,它将在基于arm的嵌入式Linux平台上运行;但是,由于该平台将由电池供电,我正在搜索有关如何处理节电的相关信息。获得合适的电池使用时间很重要。我认为Linux内核对此提供了一些支持,但我找不到关于此主题的任何文档。欢迎就如何设计我的程序和系统提出任何意见。也欢迎任何有关Linux内核如何尝试解决此类问题的意见。其他问题:用户空间的程序需要做多少?需要修改内核吗?哪些内核系统调用或API值得了解?更新:似乎参与“FreeElectrons”网站的人们就此主题制作了一些不错的演示文稿。http://free-electrons.com/services/p