裸金属长凳和软件

d34db33f

我正在寻找有关裸机编程的一些信息。我正在不同的Powerpc平台上工作,目前正在尝试证明某些测试不受linux内核的影响。这些测试是非常基本的测试,并且加载并存储在asm volatile中,还包含一些基准测试(Coremark,Dhrystone等)。这些测试可以在Linux上完美运行,但是我现在必须在裸机上进行测试,这是我没有真正经验的环境。我所有的平台都安装了u-boot,我想知道是否有这样的应用程序可以我可以运行交叉编译的powerpc-eabi测试吗?例如,由u-boot启动的gdbserver是否能够通过串行端口或以太网进行通信?U-boot可能有一个busybox吗?

老旧的计时器

Uboot是一个引导程序...使用它。您可能有一个带有uboot的xmodem下载器或ymodem下载器,如果需要推送,您可以将您的程序转换成一连串的写入内存的字,然后跳转到该程序。

uboot将已经设置了ram和串行端口,无论如何,这就是您正在与uboot进行通讯的方式,因此您无需执行所有操作。您不需要配置串行端口,但是您将想了解如何写一个字符,这意味着轮询状态寄存器以使发送器寄存器为空,然后将一个字符写入发送寄存器。对字符串中的每个字符或要打印的内容重复上述步骤。

假设它是C,则引导至C程序的引导程序通常至少需要设置堆栈指针(正在运行btw uboot,因此堆栈已被设置,只要加载程序使其不会与uboot的行为发生冲突),然后跳转到C入口点。

根据您编写高级语言程序的方式(我假设是C),您可能需要将.bss区域清零并设置.data区域,这是关于使用引导加载程序将程序复制到ram的好处。运行它通常是不必执行任何操作,下载并运行的二进制文件已经将bss清零并且将.data放在正确的位置。因此,由于您甚至不必设置堆栈,因此可以重新设置堆栈并分支或仅分支。

构建裸机程序是真正的挑战,因为您没有可以进行系统调用的系统,而放弃和/或模拟是一件很难的事情。例如,newlib使操作变得更轻松,因为它很容易替换系统后端,因此您可以例如将printfs保留在dhrystone中(与删除它们并根据需要找到不同的输出字符串或输出结果的方法。

编译为C文件的对象很容易,组装程序也很容易,并且您应该能够使用powerpc-eabi gcc交叉编译器来做到这一点,下一个挑战是链接,告诉链接器内容在哪里。由于这可能是随机的ram块,因此您可以执行-Ttext 0x123450000之类的操作,其中数字是您要使用的ram的基址。如果您有任何乘法或除法,浮点数或任何其他gcc库函数(用于替换您的处理器可能会执行或可能不会执行的操作或需要包装程序来正确执行的操作),或任何libc调用,它将尝试将其链接到理想情况下,gcc库很容易,但是取决于交叉编译器,它们可能是一个挑战,最坏的情况是采用gcc源代码并自行构建这些功能,

我强烈建议您分解二进制文件,并确保引导程序的入口点是否在二进制文件的开头。使用objcopy生成二进制文件powerpc -...- objcopy myprog.elf -O二进制myprog.bin。然后在uboot提示符上使用xmodem或ymodem复制该程序并运行它。

备份。从零件的数据表中查找uart并找出基地址时,应首先使用uboot提示符写入uart发送寄存器的地址,例如,向该地址写入0x30,并且如果您具有正确的地址然后在您的命令之后再次打印uboot提示符之前,输出中应该有一个额外的零“ 0”。如果您无法通过uboot命令行进行一次写操作就可以做到这一点,那么您将无法在任何类型的程序中使用该地址,即您的地址错误或执行了其他错误操作。

然后用汇编语言编写一个很小的程序,通过写入该地址将字符输出到uart,然后根据处理器的速度将其计数为一个大数字。如果您以100Mhz的速度运行,则计数到1亿或更多(或者从几亿计数到零),然后跳转到开头并重复,输出,等待输出,等待。构建并链接这个小程序,然后用xmodem或其他下载并分支到该程序。如果您无法让它每隔几秒钟输出一个字符,那么您将无法进行更复杂的操作。

下一个小程序,轮询状态寄存器,等待tx缓冲区为空,然后将0x30写入tx寄存器。将保存0x30的寄存器递增到0x31,然后将该寄存器递增0x37。跳转到等待tx为空并输出新值0x31,使其成为无限循环。如果一旦开始运行,您将看不到01234567012345670 ...永远重复一次,而数字不会被弄乱,它们必须是0-7并重复,那么您将无法进行更复杂的操作。

使用分支到C入口点的小引导程序重复C中的最后两个程序,如果您无法使这些工作正常进行,则将无法继续进行下去。

从任何您认为不能没有的库调用开始(例如,printf),如果不能进行简单的printf(“ Hello World \ n”),则从头开始。与所有的链接和系统后端一起使用,那么您将无法运行Dhrystone并保留其系统调用。

编译器可能会将某些Dhrystone转换为您将要实现的memcpy或memset调用,它们很可能是手工调整的汇编版本,并且您的Dhrystone性能数字可能并且会受到此类功能的实现的极大影响,因此你不能简单地做到这一点

void memset ( unsigned char *d unsigned char c, unsigned int len)
{
    while(len--) *(d++)=c;
}

并期待任何表现。您可能会抓住这些的gcc lib或gnu libc版本,或者只是从这些测试之一的linux构建中窃取这些版本(反汇编并抓住asm),这样您就可以将苹果变成苹果。

基准测试通常比真实情况更虚假,在相同的环境(Linux或裸机等)上使用相同的编译器获取相同的基准测试源非常容易,并且通过做各种简单的事情,使用不同的编译器选项,可以显示出截然不同的结果。 ,重新排列功能,在引导程序中添加一些小提示等。可以通过任何方式构建不同的代码,或者利用cahce或受到其伤害,等等。如果要显示裸机比在操作系统上更快,则可以没有一点工作就不会发生。您将需要提高i和d缓存的容量,d缓存可能需要提高mmu容量,依此类推。这些全都是研究项目。然后,您需要了解如何控制编译器的构建,确保已启用优化,如前所述,在引导程序中添加或删除nop来更改代码中紧密循环相对于缓存行的对齐方式。在操作系统上有中断和正在发生的事情,可能您正在执行多任务处理,因此使用裸机,您应该能够使dhrystone(例如测试)以与linux相同或更快的速度运行,如果不能,那不是因为linux更快这是因为您在裸机实施中没有做正确的事情。

是的,您可能可以使用gdb与uboot对话并加载程序,不确定我从不使用gdb,我更喜欢使用哑终端和x或y调制解调器,或者将jtag与openocd终端一起使用(将telnet插入openocd而不是gdb中)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

什么是Qt裸金属?

来自分类Dev

为什么我的指针在变化?(裸金属)

来自分类Dev

如何在openstreetmap中搜索最近的野餐桌和长凳?

来自分类Dev

如何在openstreetmap中搜索最近的野餐桌和长凳?

来自分类Dev

Raspberry PI 3 UART0不发送(裸金属)

来自分类Dev

Gitolite 和非裸回购?

来自分类Dev

在2.5英寸金属外壳中使用裸驱动器是否安全?

来自分类Dev

裸tty上的Tmux和GPM

来自分类Dev

Heroku和Godaddy上的裸域配置错误

来自分类Dev

在本地使用带有裸源和推送请求的 Git

来自分类Dev

WordPress和需求软件

来自分类Dev

安装软件和UbuntuOne

来自分类Dev

金属入门

来自分类Dev

在金属纹理中找到最小值和最大值

来自分类Dev

如何有效地合成Quartz和OpenGL /金属制图?

来自分类Dev

在iPhone上的GPU(金属)和CPU(OpenCV)上处理相机Feed数据

来自分类Dev

如何有效地合成Quartz和OpenGL /金属制图?

来自分类Dev

在iPhone上的GPU(金属)和CPU(OpenCV)上处理相机Feed数据

来自分类Dev

如何使用 Stencil 和 Cover 方法用金属 ios 绘制 SVG?

来自分类Dev

如何将根(裸)域重定向到www-Heroku和Zerigo

来自分类Dev

Nginx将http:// www和裸http / https重定向到https:// www

来自分类Dev

Perl解析和裸字中Dimond运算符的语法混乱

来自分类Dev

github仓库和git裸仓库之间有什么区别?

来自分类Dev

如何防止Firefox和相关浏览器中出现裸窗口?

来自分类Dev

Nginx将http:// www和裸http / https重定向到https:// www

来自分类Dev

git:每个开发人员的主存储库和裸存储库

来自分类Dev

是否从htaccess中的裸http和https域重定向到https:// www域?

来自分类Dev

在性能和效率上,裸变量定义或者If语句变量定义更好?

来自分类Dev

C 裸函数 - 在 1 个函数中执行汇编和 c 代码的灼热解决方案

Related 相关文章

  1. 1

    什么是Qt裸金属?

  2. 2

    为什么我的指针在变化?(裸金属)

  3. 3

    如何在openstreetmap中搜索最近的野餐桌和长凳?

  4. 4

    如何在openstreetmap中搜索最近的野餐桌和长凳?

  5. 5

    Raspberry PI 3 UART0不发送(裸金属)

  6. 6

    Gitolite 和非裸回购?

  7. 7

    在2.5英寸金属外壳中使用裸驱动器是否安全?

  8. 8

    裸tty上的Tmux和GPM

  9. 9

    Heroku和Godaddy上的裸域配置错误

  10. 10

    在本地使用带有裸源和推送请求的 Git

  11. 11

    WordPress和需求软件

  12. 12

    安装软件和UbuntuOne

  13. 13

    金属入门

  14. 14

    在金属纹理中找到最小值和最大值

  15. 15

    如何有效地合成Quartz和OpenGL /金属制图?

  16. 16

    在iPhone上的GPU(金属)和CPU(OpenCV)上处理相机Feed数据

  17. 17

    如何有效地合成Quartz和OpenGL /金属制图?

  18. 18

    在iPhone上的GPU(金属)和CPU(OpenCV)上处理相机Feed数据

  19. 19

    如何使用 Stencil 和 Cover 方法用金属 ios 绘制 SVG?

  20. 20

    如何将根(裸)域重定向到www-Heroku和Zerigo

  21. 21

    Nginx将http:// www和裸http / https重定向到https:// www

  22. 22

    Perl解析和裸字中Dimond运算符的语法混乱

  23. 23

    github仓库和git裸仓库之间有什么区别?

  24. 24

    如何防止Firefox和相关浏览器中出现裸窗口?

  25. 25

    Nginx将http:// www和裸http / https重定向到https:// www

  26. 26

    git:每个开发人员的主存储库和裸存储库

  27. 27

    是否从htaccess中的裸http和https域重定向到https:// www域?

  28. 28

    在性能和效率上,裸变量定义或者If语句变量定义更好?

  29. 29

    C 裸函数 - 在 1 个函数中执行汇编和 c 代码的灼热解决方案

热门标签

归档