1

我正在使用 TI - AM3359 SoC 为 beaglebone 启动内核或操作系统编程。我已经编写了一个汇编程序来将一些字符写入串行接口(只是开始),我想在 beaglebone 上将其作为内核运行,就像 linux 内核一样。

我的程序的链接地址是什么?

默认情况下如何从u-boot启动它?我不想进入 u-boot 编程,而是想使用 angstrom 发行版和 BBone 一起提供的可用 u-boot。

任何帮助表示赞赏。

谢谢

4

2 回答 2

2

我已经编写了一个汇编程序来将一些字符写入串行接口(只是开始),我想在 beaglebone 上将其作为内核运行,就像 linux 内核一样。

您编写的内容称为“独立程序”。与依赖操作系统获取资源和服务的应用程序相比,它不需要任何外部代码即可运行。您不应该将其称为内核(无论如何都不是),因为它不具有内核应具有的任何功能。

我的程序的链接地址是什么?

注意:对于典型的独立程序,“加载地址”和“链接地址”通常是相同的值,因为独立代码通常不可重定位或与位置无关。

U-Boot 通常在上层物理主存储器中链接、加载和执行。

Linux 内核通常链接到在物理主内存+ 0x8000的开头执行(无论如何对于 ARM)。但是内核映像,特别是如果它是诸如 zImage 或 uImage 之类的压缩文件时,通常会在更高的地址加载到内存中,并且解压缩例程会在其正确的加载和起始地址安装 Linux 内核。

因此,低物理主内存中的任何“好”地址都适合链接和加载您的程序。

默认情况下如何从u-boot启动它?

U-Boot 可以将执行转移到两种类型的“程序”(以及脚本)。
一种类型的程序是使用bootm命令的“内核”。
这适用于具有由 mkimage 实用程序安装的头文件的内核或程序,它是完全独立的,并将接管系统。可以定制 U-Boot 来为这个内核准备系统。对于 Linux,分配一个内存缓冲区,使用用户定义的文本进行初始化,并作为内核命令行传递给 Linux 内核。对于 ARM Linux,分配另一个内存缓冲区,用数据初始化并作为ATAG传递给 ARM Linux 内核。

另一种类型的程序使用go命令。
这是一个更简单的程序,它可以使用 U-Boot 的服务功能,甚至可能在完成后将控制权返回给 U-Boot。如果不需要准备缓冲区,那么您的简单独立程序应该使用该go命令。

您可以在bootcmd环境变量的定义中使用任一命令,该变量是在引导计时器到期时运行/执行的变量。

于 2013-03-13T01:16:09.503 回答
0

您可以使用 fsbl、bitstream、uboot.elf 和您的应用程序创建 boot.bin。然后刷入 QSPI 闪存并选择从它启动。

或者您可以从 TFTP 启动。在这里,您只需要使用 fsb、bitstream 和 uboot.elf 创建 boot.bin。您需要更改 uboot 头文件以强制它从 tftp 启动,例如 tftpboot 0x0 hello.elf; bootelf 0x0;. 一旦启动,它将使用 tftp 获取 elf/bin 文件并使用 bootelf 或 go 命令启动板。

如果有 SD 卡,您也可以从 SD 卡启动。

于 2020-02-14T01:58:14.207 回答