首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在QEMU上模拟Cortex-A15启动QNX

在QEMU上模拟Cortex-A15启动QNX
EN

Stack Overflow用户
提问于 2021-08-18 16:32:27
回答 1查看 301关注 0票数 1

我有IFS镜像应该运行在板上,类似于OMAP5 uEVM。我正在尝试使用相同的Cortex-A15CPU在QEMU虚拟机上运行它。

我有一大堆问题,但首先我想问的是,这是非常可行的吗?

TLDR

我决定使用U-Boot作为引导加载程序。我用来自Ubuntu的arm-linux-gnueabihf-gnueabihf gnueabihf gnueabihf- with和linaro的arm-eabi-gcc-7.5编译。所有3个U-Boot版本都可以工作。看起来QNX二进制文件不使用硬浮点(armhf或armle-v7),即使目标CPU支持它。gcc版重要吗?我必须使用QNX工具链中的一个来构建U-Boot吗?

镜像必须基于QNX 6.5。ifsdump给了我

代码语言:javascript
复制
Decompressed 3333189 bytes-> 9535664 bytes
   Offset     Size  Name
        0        8  *.boot
        8      100  Startup-header flags1=0xd flags2=0 paddr_bias=0x7fce00000000
                       preboot_size=0x8
                       image_paddr=0x80100008 stored_size=0x347e78
                       startup_size=0x1a108 imagefs_size=0x9180b0
                       ram_paddr=0x80100008 ram_size=0x9321b8
                       startup_vaddr=0x8010097c
      108    1a008  startup.*
    1a110       5c  Image-header mountpoint=/
                       flags=0x4 script=3 boot=3758096386 mntflg=0
    1a16c     15b4  Image-directory
     ----     ----  Root-dirent
                       gid=0 uid=0 mode=0755 ino=1 mtime=606f22bf
    1c000    94000  proc/boot/procnto-smp-instr
                       gid=0 uid=0 mode=0777 ino=3758096386 mtime=606f1eb4
----- procnto-smp-instr - ELF32LE ET_EXEC EM_ARM -----
 e_flags              : 0x5000002
 e_entry              : 0xfe051c60
 e_phoff              : 52
 e_phentsize          : 32
 e_phnum              : 4
 segment 0
   p_type               : Unknown(1879048193)
   p_offset             : 566704
   p_vaddr              : 0xFE0A65B0
   p_paddr              : 0xFE0A65B0
   p_filesz             : 32
   p_memsz              : 32
   p_flags              : R--
   p_align              : 4
 segment 1
   p_type               : PT_LOAD
   p_offset             : 4096
   p_vaddr              : 0xFE01D000
   p_paddr              : 0x8011D000
   p_filesz             : 550320
   p_memsz              : 550320
   p_flags              : R-X
   p_align              : 4096
 segment 2
   p_type               : PT_LOAD
   p_offset             : 557056
   p_vaddr              : 0xFE0A4000
   p_paddr              : 0x801A4000
   p_filesz             : 46584
   p_memsz              : 46584
   p_flags              : RW-
   p_align              : 4096
 segment 3
   p_type               : PT_NULL
   p_offset             : 0
   p_vaddr              : 0x0
   p_paddr              : 0x0
   p_filesz             : 0
   p_memsz              : 0
   p_flags              : ---
   p_align              : 4

我用dumpifs -u QNX-IFS.raw QNX-IFS解压了映像,并将其复制到虚拟驱动器中。

我的RAM空间从0x40000000 (virt-6.0机器)开始,但目标板在0x80100000。所以我调整了原始的startup_vaddr=0x8010097c并执行

代码语言:javascript
复制
fatload virtio 0:1 0x40400000 QNX-IFS.raw
go 0x4040097c

它永远挂着。启动标头和启动.*似乎是特定于硬件的,不是吗?但是它的目标是运行/proc/boot/procnto-smp-instr和启动脚本。

接下来,我尝试使用bootelf启动一个内核。它崩溃的原因是:

代码语言:javascript
复制
=> bootelf 0x4041c000
## Starting application at 0xfe051c60 ...
prefetch abort
pc : [<fe051c5c>]          lr : [<bff598e0>]
reloc pc : [<3e0fbc5c>]    lr : [<000038e0>]

预取中止意味着它引用的内存超出范围。这个神奇的地址来自elf报头。这意味着它正确地读取了elf-header并尝试启动它。

代码语言:javascript
复制
readelf -a proc/boot/procnto-smp-instr
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0xfe051c60
  Start of program headers:          52 (bytes into file)
  Start of section headers:          0 (bytes into file)
  Flags:                             0x5000002, Version5 EABI, <unknown>
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         4
  Size of section headers:           0 (bytes)
  Number of section headers:         0
  Section header string table index: 0

There are no sections in this file.

There are no sections to group in this file.

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  EXIDX          0x08a5b0 0xfe0a65b0 0xfe0a65b0 0x00020 0x00020 R   0x4
  LOAD           0x001000 0xfe01d000 0x8011d000 0x865b0 0x865b0 R E 0x1000
  LOAD           0x088000 0xfe0a4000 0x801a4000 0x0b5f8 0x0b5f8 RW  0x1000
  NULL           0x000000 0x00000000 0x00000000 0x00000 0x00000     0x4

两个主板具有相同的2 2Gb,但具有不同的虚拟内存地址空间。我决定将我的主板内存扩展到3 3Gb,使入口点地址在范围内。然后,我再次尝试启动内核。它再次崩溃,并出现新的错误:

代码语言:javascript
复制
=> bootelf 0x4041c000
## Starting application at 0xfe051c60 ...
undefined instruction
pc : [<fee13c18>]          lr : [<fff598e0>]
reloc pc : [<feebdc18>]    lr : [<000038e0>]
sp : fee14d40  ip : 00000030     fp : 00000028
r10: 00000000  r9 : fef15ed8     r8 : 00000000
r7 : fef30620  r6 : 00000000     r5 : 00000000  r4 : 4041c000
r3 : fe051c60  r2 : 00000001     r1 : fef30620  r0 : 00000000
Flags: nZCv  IRQs off  FIQs off  Mode SVC_32
Code: 00000000 00000000 00000000 00000000 (fee140cf)
Resetting CPU ...

一方面,/proc/boot/procnto-smp-instr是Cortex-A15的自执行文件,另一方面,内核不是常规的可执行文件。报头意味着它是特定于硬件的。

有没有chase来运行它?

此外,我在社区qnx网站上找到了一个带有Cortex-A15内核的软件包。它包含四个版本的procnto*。但是它们是用于armle-v7的可重定位的目标文件。有没有可能将它链接起来,使其成为可执行的?

我真的没有arm开发经验,也没有QNX的经验。如果您有任何想法或建议,我将非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-18 18:13:22

这里您的主要问题是Arm主板通常彼此非常不同,因此bootloaders和OS内核通常必须支持将要在其上运行的任何主板。(这与x86世界非常不同,在where世界里,基本上每台机器看起来都或多或少像一台标准PC,软件都是为在这台PC上运行而构建的。)

所以简短的答案是,除非你的QNX镜像被构建成非常通用的“在许多不同的东西上运行,并使用一个设备树文件告诉他们关于硬件的信息”*,那么只有当QEMU具有QNX镜像所期望的硬件模型时,它们才会在QEMU上运行。没有OMAP5的QEMU模型。

*你可以像这样构建Linux。您还可以构建专门针对给定主板的Linux,而不需要为其他任何东西提供额外的设备驱动程序支持。我不知道QNX让你做什么。

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

https://stackoverflow.com/questions/68836147

复制
相关文章

相似问题

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