了解 U-Boot 内存占用

2024-05-12

我不明白加载 U-Boot 时 RAM 中发生了什么。我正在开发 Xilinx Zynq ZC702 评估套件,并尝试使用 U-Boot 在其上加载 Linux 内核。于是我使用Xilinx工具Vivado和SDK生成了一个BOOT.bin文件,一步步写入到SD卡上:

  • 使用 Vivado 创建硬件项目,
  • 使用 SDK 生成 FSBL 和 FPGA 比特流,
  • 创建包含 FSBL + 比特流 + U-Boot 的启动映像(我从 xilinx Git 存储库下载了 U-Boot 源代码)。

简而言之,我遵循了上面描述的所有步骤赛灵思用户指南 http://www.wiki.xilinx.com/Getting+Started.

但现在,在加载内核之前,我想了解发生了什么,但我做不到。根据文档,U-Boot 如果从闪存加载,会将自身复制到 RAM 中,并从那里执行自身,但是在哪里?

我在网上搜索了一下,发现U-Boot解压自身的地址定义在包含/配置/zynq-common.h by CONFIG_SYS_TEXT_BASE,看起来是 0x400_0000。

但是在另一个网站上我看到我们可以在调试模式下打印重定位地址,所以我修改了文件公共/board_r.c并重写了函数“初始化公告“打印”gd->relocaddr”字段。这次看来U-Boot使用了偏移地址0x3FF3_7000。

当我使用 U-Boot 命令“md”检查内存时,我看到使用了两个偏移量,并且在两个位置都看到一种幻数“be00_00ea”:

Xilinx First Stage Boot Loader 
Release 2014.4  Feb  8 2016-14:53:56
Devcfg driver initialized 
Silicon Version 3.1
Boot mode is SD
SD: rc= 0
SD Init Done 
Flash Base Address: 0xE0100000
Reboot status register: 0x60400000
Multiboot Register: 0x0000C000
Image Start Address: 0x00000000
Partition Header Offset:0x00000C80
Partition Count: 3
Partition Number: 1
Header Dump
Image Word Len: 0x000F6EC0
Data Word Len: 0x000F6EC0
Partition Word Len:0x000F6EC0
Load Addr: 0x00000000
Exec Addr: 0x00000000
Partition Start: 0x000065D0
Partition Attr: 0x00000020
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xFFD14B7E
Bitstream
In FsblHookBeforeBitstreamDload function 
PCAP:StatusReg = 0x40000A30
PCAP:device ready
PCAP:Clear done
Level Shifter Value = 0xA 
Devcfg Status register = 0x40000A30 
PCAP:Fabric is Initialized done
PCAP register dump:
PCAP CTRL 0xF8007000: 0x4C00E07F
PCAP LOCK 0xF8007004: 0x0000001A
PCAP CONFIG 0xF8007008: 0x00000508
PCAP ISR 0xF800700C: 0x0802000B
PCAP IMR 0xF8007010: 0xFFFFFFFF
PCAP STATUS 0xF8007014: 0x00000A30
PCAP DMA SRC ADDR 0xF8007018: 0x00100001
PCAP DMA DEST ADDR 0xF800701C: 0xFFFFFFFF
PCAP DMA SRC LEN 0xF8007020: 0x000F6EC0
PCAP DMA DEST LEN 0xF8007024: 0x000F6EC0
PCAP ROM SHADOW CTRL 0xF8007028: 0xFFFFFFFF
PCAP MBOOT 0xF800702C: 0x0000C000
PCAP SW ID 0xF8007030: 0x00000000
PCAP UNLOCK 0xF8007034: 0x757BDF0D
PCAP MCTRL 0xF8007080: 0x30800100

DMA Done ! 

FPGA Done ! 
In FsblHookAfterBitstreamDload function 
Partition Number: 2
Header Dump
Image Word Len: 0x0001BA12
Data Word Len: 0x0001BA12
Partition Word Len:0x0001BA12
Load Addr: 0x04000000
Exec Addr: 0x04000000
Partition Start: 0x000FD490
Partition Attr: 0x00000010
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xF7EAFAC8
Application
Handoff Address: 0x04000000
In FsblHookBeforeHandoff function 
SUCCESSFUL_HANDOFF
FSBL Status = 0x1


U-Boot 2015.07 (Feb 11 2016 - 10:24:28 +0100)

Model: Zynq ZC702 Development Board
I2C:   ready
DRAM:  ECC disabled 1 GiB
MMC:   zynq_sdhci: 0
SF: Detected N25Q128A with page size 256 Bytes, erase size 64 KiB, total 16 MiB
In:    serial
Out:   serial
Err:   serial
Model: Zynq ZC702 Development Board
Net:   Gem.e000b000
Hit any key to stop autoboot:  0 
zynq-uboot> md 0x4000000
04000000: ea0000be e59ff014 e59ff014 e59ff014    ................
04000010: e59ff014 e59ff014 e59ff014 e59ff014    ................
04000020: 04000060 040000c0 04000120 04000180    `....... .......
04000030: 040001e0 04000240 040002a0 deadbeef    ....@...........
04000040: 0badc0de e320f000 e320f000 e320f000    ...... ... ... .
04000050: e320f000 e320f000 e320f000 e320f000    .. ... ... ... .
04000060: e51fd028 e58de000 e14fe000 e58de004    (.........O.....
04000070: e3a0d013 e169f00d e1a0e00f e1b0f00e    ......i.........
04000080: e24dd048 e88d1fff e51f2050 e892000c    H.M.....P ......
04000090: e28d0048 e28d5034 e1a0100e e885000f    H...4P..........
040000a0: e1a0000d eb0005dc e320f000 e320f000    .......... ... .
040000b0: e320f000 e320f000 e320f000 e320f000    .. ... ... ... .
040000c0: e51fd088 e58de000 e14fe000 e58de004    ..........O.....
040000d0: e3a0d013 e169f00d e1a0e00f e1b0f00e    ......i.........
040000e0: e24dd048 e88d1fff e51f20b0 e892000c    H.M...... ......
040000f0: e28d0048 e28d5034 e1a0100e e885000f    H...4P..........
zynq-uboot> md 0x3ff37000
3ff37000: ea0000be e59ff014 e59ff014 e59ff014    ................
3ff37010: e59ff014 e59ff014 e59ff014 e59ff014    ................
3ff37020: 3ff37060 3ff370c0 3ff37120 3ff37180    `p.?.p.? q.?.q.?
3ff37030: 3ff371e0 3ff37240 3ff372a0 deadbeef    .q.?@r.?.r.?....
3ff37040: 3f312628 e320f000 e320f000 e320f000    (&1?.. ... ... .
3ff37050: e320f000 e320f000 e320f000 e320f000    .. ... ... ... .
3ff37060: e51fd028 e58de000 e14fe000 e58de004    (.........O.....
3ff37070: e3a0d013 e169f00d e1a0e00f e1b0f00e    ......i.........
3ff37080: e24dd048 e88d1fff e51f2050 e892000c    H.M.....P ......
3ff37090: e28d0048 e28d5034 e1a0100e e885000f    H...4P..........
3ff370a0: e1a0000d eb0005dc e320f000 e320f000    .......... ... .
3ff370b0: e320f000 e320f000 e320f000 e320f000    .. ... ... ... .
3ff370c0: e51fd088 e58de000 e14fe000 e58de004    ..........O.....
3ff370d0: e3a0d013 e169f00d e1a0e00f e1b0f00e    ......i.........
3ff370e0: e24dd048 e88d1fff e51f20b0 e892000c    H.M...... ......
3ff370f0: e28d0048 e28d5034 e1a0100e e885000f    H...4P..........
zynq-uboot> 

为什么 U-Boot 需要这两个偏移量? U-Boot 的真实内存占用是多少?更一般地说,我可以将内核放在哪里以确保它不会覆盖某些内容?


ARM 架构上的 u-boot 重定位

以下是两阶段启动过程的整个顺序:

  1. ROM 代码读取 SPL(来自MLOSD 卡上的文件)CONFIG_SPL_TEXT_BASE地址。该地址通常位于 SRAM 中,无需初始化即可使用(与 RAM 不同)。 ROM 代码跳转到 SPL 代码。
  2. SPL配置RAM,然后读取u-boot(来自u-boot.imgSD 卡上的文件)CONFIG_SYS_TEXT_BASERAM 地址(通常位于 RAM 的开头)并运行它
  3. u-boot 将自身重新定位到gd->relocaddrRAM 地址(通常位于 RAM 的末尾)并跳转到重定位的代码
  4. 现在我们准备启动内核了

对于单阶段启动,您没有 SPL,通常只有u-boot.bin文件被使用。在这种情况下,您只需执行步骤 3 和 4。

关于搬迁有两种情况(如doc/README.arm-重定位 http://git.denx.de/?p=u-boot.git;a=blob;f=doc/README.arm-relocation;h=645b3746c8a88fe25f7c9a33cd9b8b17aa7b5a57;hb=HEAD):

  1. CONFIG_SYS_TEXT_BASE != gd->relocaddr: 将进行搬迁
  2. CONFIG_SYS_TEXT_BASE == gd->relocaddr: 不会进行搬迁

在您的情况下,您会看到执行了重定位(如CONFIG_SYS_TEXT_BASE != gd->relocaddr).

那么,解决你的问题:

为什么 U-Boot 需要这两个偏移量?

搬迁背后的原因描述于u-boot ARM重定位任务 http://www.denx.de/wiki/U-Boot/TaskAddArmRelocation:

...我们可以测量板上内存的实际大小,然后将 U-Boot 重新定位到 RAM 的最末端,使几乎整个 RAM 都可用作“应用程序”的一大连续区域,例如加载 Linux 内核、ramdisk 等。

事实上,如果你查看代码,你会发现gd->relocaddr是 RAM 的末尾减去监控代码 (U-Boot) 的大小:

gd->relocaddr = gd->ram_top;
...
gd->relocaddr -= gd->mon_len;

还可以执行一些额外的内存保留。例如,在我的平台 (TI DRA7XX EVM) 上,我可以看到调用的下一个函数:

setup_dest_addr()
reserve_round_4k()
reserve_mmu()
reserve_uboot()

实际搬迁是在之后完成的board_init_f() call.

拱/臂/lib/crt0.S:

bl board_init_f
...
b relocate_code

arch/arm/lib/relocate.S:

ENTRY(relocate_code)

现在很容易回答您的下一个问题:

U-Boot 的实际内存占用是多少?

搬迁之前,U-Boot 驻留在CONFIG_SYS_TEXT_BASE。搬迁后U-Boot驻留在gs->relocaddr.

关于你的最后一个问题:

我可以将内核放在哪里以确保它不会覆盖某些内容?

由于 U-Boot 被重新定位到 RAM 的末尾,理论上您可以使用任何 RAM 地址来放置内核。但看看CONFIG_EXTRA_ENV_SETTINGS定义在include/configs/zynq-common.h:

"sdboot=if mmcinfo; then " \
        "run uenvboot; " \
        "echo Copying Linux from SD to RAM... && " \
        "load mmc 0 ${kernel_load_address} ${kernel_image} && " \
        "load mmc 0 ${devicetree_load_address} ${devicetree_image} && " \
        "load mmc 0 ${ramdisk_load_address} ${ramdisk_image} && " \
        "bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}; " \
    "fi\0" \

从那里你可以看到你应该加载内核到${kernel_load_address},即0x2080000:

"kernel_load_address=0x2080000\0" \

有关其他常量,请参阅该定义的其余部分。

bdinfo命令

你可以找到bdinfo命令有用:可以使用以下命令找到重定位地址以及其他有用信息bdinfo来自 U-Boot shell 的命令。例如对于 DRA7XX EVM:

=> bdinfo

DRAM bank   = 0x00000000
-> start    = 0x80000000
-> size     = 0x60000000
TLB addr    = 0xDFFF0000
relocaddr   = 0xDFF5D000
reloc off   = 0x5F75D000
irq_sp      = 0xDEF3CEE0
sp start    = 0xDEF3CED0

从这里你可以看到:

  • 内存开始于0x80000000
  • 内存大小是0x60000000
  • ...所以RAM结束(gd->ram_top) is 0x80000000 + 0x60000000 = 0xE0000000
  • 搬迁地址是0xDFF5D000
  • 用于重定位的保留内存是0xE0000000 - 0xDFF5D000 = 652 KB
  • 监视器(U-Boot)大小约为TLB addr - relocaddr = 0xDFFF0000 - 0xDFF5D000 = 588 KB

也可以看看:

[1] u-boot:搬迁 https://stackoverflow.com/questions/16719986/u-boot-relocation

[2] SPL(辅助程序加载器)有什么用 https://stackoverflow.com/questions/31244862/what-is-the-use-of-spl-secondary-program-loader/31252989#31252989

[3] 为 u-boot 添加 ARM 重定位支持的提交 http://git.denx.de/?p=u-boot.git;a=commit;h=f1d2b313c9eb6808d30c16a9eb5251240452a56c

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解 U-Boot 内存占用 的相关文章

  • 如何设置 CMake 与 clang 交叉编译 Windows 上的 ARM 嵌入式系统?

    我正在尝试生成 Ninja makefile 以使用 Clang 为 ARM Cortex A5 CPU 交叉编译 C 项目 我为 CMake 创建了一个工具链文件 但似乎存在错误或缺少一些我无法找到的东西 当使用下面的工具链文件调用 CM
  • 大会,你好世界问题

    我正在 Linux 上学习 asm noobuntu 10 04 我得到了以下代码 http asm sourceforge net intro hello html http asm sourceforge net intro hello
  • modinfo srcversion:如何从我的源生成此版本?

    我有一个 Linux 模块的编译版本 然后我有大约 20 多个其源代码的变体 由于各种愚蠢的错误 我已经不知道哪个版本的源代码是我用来制作模块的实际版本了 我注意到modinfo
  • saber sd 如何在没有 SPL 的情况下直接从 uboot 启动

    sabre sd 基于 imx 6 最大内部 RAM 约为 150Kb 然而 uboot 足够大 可以容纳在这个空间中 在这个场景中事情是如何进行的 https community freescale com docs DOC 95015
  • 在 /dev/input/eventX 中写入事件需要哪些命令?

    我正在开发一个android需要将触摸事件发送到 dev input eventX 的应用程序 我知道C执行此类操作的代码结构如下 struct input event struct timeval time unsigned short
  • 如何在uboot中制作“if”和比较语句?

    我是 uboot 和 tftp 编程的新手 基于this url http www denx de wiki view DULG CommandLineParsing 有如何制作if像这样的声明if imi addr then echo I
  • 直接在 ARM 目标上调试单声道应用程序

    我最近在 BeagleBone 嵌入式 ARM 设备上安装了 Mono 希望通过 USB 连接 Kinnect 传感器并使用 C Mono 控制它 我想知道 Mono 我正在使用 MonoDevelop 但我想这个问题也适用于 VS 是否允
  • 什么是遗留中断?

    我正在开发一个项目 试图弄清楚 ARM 架构的全局中断控制器中如何处理中断 我正在使用 pl390 中断控制器 我看到有一条线被称为传统中断 它绕过了分配器逻辑 假设有 2 个中断可以被编程为传统中断 任何人都可以帮助解释一下什么是遗留中断
  • GCC C++ (ARM) 和指向结构体字段的 const 指针

    假设有一个简单的测试代码 typedef struct int first int second int third type t define ADDRESS 0x12345678 define REGISTER type t ADDRE
  • 为什么内核需要虚拟寻址?

    在Linux中 每个进程都有其虚拟地址空间 例如 32位系统为4GB 其中3GB为进程保留 1GB为内核保留 这种虚拟寻址机制有助于隔离每个进程的地址空间 对于流程来说这是可以理解的 因为有很多流程 但既然我们只有 1 个内核 那么为什么我
  • ftrace:仅打印trace_printk()的输出

    是否可以只转储trace printk 输出于trace文件 我的意思是过滤掉函数跟踪器 或任何其他跟踪器 中的所有函数 一般来说 您可以在选项目录中关闭选项 sys kernel debug tracing options Use ls显
  • 为什么这段代码会死锁?

    我在可加载模块中创建了 2 个 Linux 内核线程 并将它们绑定到在双核 Android 设备上运行的单独 CPU 内核 运行几次后 我注意到设备重新启动并重置了硬件看门狗定时器 我一直在解决这个问题 什么可能导致僵局 基本上 我需要做的
  • 让 TensorFlow 在 ARM Mac 上使用 GPU

    我已经安装了TensorFlow在 M1 上 ARM Mac 根据这些说明 https github com apple tensorflow macos issues 153 一切正常 然而 模型训练正在进行CPU 如何将培训切换到GPU
  • 在ubuntu内核中启用cgroup cpu实时运行时

    我正在尝试在 Ubuntu 18 04 上运行的 docker 容器中使用实时调度 我已经按照给定的方法安装了实时内核here https stackoverflow com questions 51669724 install rt li
  • 编译内核进行页表遍历时出现错误

    我正在执行页表遍历 当我准备更新内核时出现错误 kernel sys c In function do sys get page info kernel sys c 2745 23 error passing argument 1 of p
  • 上下文切换到安全模式(arm trustzone)的成本是多少

    我试图了解在arm中可信 安全 和非安全模式之间来回切换的成本 从非安全世界转移到安全世界时到底需要发生什么 我知道需要设置 ns 位 基于某些特殊指令 需要刷新和更新页表 刷新和更新处理器缓存 还有什么需要发生的吗 处理器缓存 它们是分段
  • GCC:如何在 MCU 上完全禁用堆使用?

    我有一个在基于 ARM Cortex M 的 MCU 上运行并用 C 和 C 编写的应用程序 我用gcc and g 编译它并希望完全禁用任何堆使用 在 MCU 启动文件中 堆大小已设置为 0 除此之外 我还想禁止代码中意外使用堆 换句话说
  • 在用户程序中使用 或在驱动程序模块代码中使用 ...这有关系吗?

    我正在开发一个设备驱动程序模块和关联的用户库来处理ioctl 来电 该库获取相关信息并将其放入一个结构中 该结构被传递到驱动程序模块中并在那里解压 然后进行处理 我省略了很多步骤 但这就是总体思路 一些数据通过结构体传递ioctl is u
  • 内核模块未加载(但 insmod 返回 0)

    我必须向现有设备 mips arch 添加一些功能 我已经尝试了几个 SDK 目前我取得了一些进展 但是 insmod 返回 0 成功 并且 lsmod 显示它们 但是 printk 和 create proc entry 都不起作用 但我
  • ftrace 是否允许捕获 Linux 内核的系统调用参数,或者仅捕获函数名称?

    目标是检查任何进程传递给特定系统调用 例如 exec open 等 的参数 来自官方文档 https www kernel org doc Documentation trace ftrace txt 没有描述记录函数参数的功能 主要查看

随机推荐

  • 如何从字符串列中提取数字?

    我的要求是从列中的评论列中检索订单号comment并且总是开始于R 订单号应作为新列添加到表中 输入数据 code id mode location status comment AS SD 101 Airways hyderabad D
  • 用于从深层嵌套列表/元组中提取元素的递归函数

    我想编写一个从深层嵌套元组和列表中提取元素的函数 假设我有这样的东西 l THIS THAT a b c THAT d e f 我想要一个没有 这个 和 那个 的简单列表 list a b c d e f 这是我到目前为止所拥有的 def
  • 如何在 MS Word 中的每个标题末尾应用宏?

    我有一个包含各种标题的文档 因此不一定是标题 1 或标题 2 而是所有类型的标题 我想做的是编写一个宏 例如 删除每个标题末尾的 2 个空格 例如 我们有 这是一个标题 在标题的最后 我会这样做 Selection Delete Unit
  • 批处理文件测试错误级别

    我试图在另一个 exe 成功执行时有条件地从批处理文件有条件地运行一个 exe 我尝试了 IF 和 ERRORLEVEL 的几种不同组合 但似乎都不起作用 TeamBuildTypes Current Branch DatabaseUpda
  • 在我们的 Rails3/Heroku 应用程序中设置 Paperclip + AWS S3 用于图像存储时遇到问题

    我们已经构建了一个 Rails 应用程序 它有多个用户和每个用户的图像 在我们的本地主机上完成所有开发工作 我们为用户和照片提供了工作种子 但现在我们尝试使用 S3 进行图像存储 我们在 总是在 种子 期间遇到错误执行此操作时迁移的步骤 耙
  • 在python中将数字转换为字符串

    我遇到了将数字转换为字符串的问题 我想从 str 0100 获取字符串 0100 但我得到的是 64 有什么方法可以从 0100 获取字符串 0100 UPDATE 感谢许多人指出前导 0 是八进制的指示符 我知道 我想要的是将 0100
  • 与两点相交的圆心

    给定 2D 平面上的两个点 以及与这两个点相交的半径为 r 的圆 计算该圆中心的公式是什么 我意识到圆圈可以放置在两个地方 当从任意角度开始扫描围绕其中一个点连接两个点的线时 我希望首先沿顺时针方向遇到其中心的圆 我想这是我的问题的下一阶段
  • 保留子网范围内的私有IP地址

    我有一个 Arm 模板 其中有一个带有 2 个子网的 vNet 我正在尝试使用静态专用 IP 地址将网卡部署到其中之一 它曾经是动态的 并且运行良好 现在它是静态的 我已经设置了我想要网卡拥有的IP 但是当我部署时 它说IP无效 我尝试更改
  • org.openqa.selenium.SessionNotCreatedException:会话未创建已断开连接:无法将消息发送到 ChromeDriver 和 Chrome 的渲染器错误

    我尝试使用 Selenium 在 Java 上运行这个简单的程序 import org openqa selenium WebDriver import org openqa selenium chrome ChromeDriver pub
  • Hibernate 抛出奇怪的错误:类未映射

    这是错误 org hibernate hql ast QuerySyntaxException Payment is not mapped select p from Payment p 我不明白为什么会抛出这个错误 应该映射该类 正如我将
  • 数据库不存在。确保名称输入正确

    为什么我会出现这个错误 如果您查看屏幕截图 您将看到数据库 仅当我连接到两个数据库引擎时才会发生这种情况 它仅检测下面数据库引擎中的数据库 而不检测突出显示的数据库 除了关闭应用程序并仅打开一个数据库引擎之外 还有其他方法可以使用我的数据库
  • 如何使用 EclipseLink 处理以 Oracle 类型作为输入或输出的 Oracle 存储过程调用

    我进行了概念验证 以了解使用 EclipseLink 调用存储过程的效率如何 我能够使用带有标量 原始数据类型 链接整数 varchar 等 的 EclispeLink 来调用 Oracle 存储过程 我想了解如何使用集合 Oracle 类
  • PDO 库比本机 MySQL 函数更快吗?

    我已经阅读了几个与此相关的问题 但我担心它们可能已经过时 因为自这些问题得到解答以来 更新版本的 PDO 库已经发布 我编写了一个 MySQL 类 它构建查询并转义参数 然后根据查询返回结果 目前这个类正在使用内置的mysql函数 我很清楚
  • Nhibernate 出现 TransactionScope 错误 - DTC 事务预准备阶段失败 - 升级到 Nhibernate 3.0

    在事务 Scope Eg 中使用 Nhibernate 和 ADO Net 操作时 出现以下异常 Nhibernate 2 1 没问题 但现在升级到 3 0 会抛出错误 using var scope new TransactionScop
  • 我怎样才能强制Make一直执行一个菜谱

    当前的 Makefile 有这样的内容 target1 lib1 a lib2 a target2 lib1 a lib3 a target3 lib3 a lib1 a MAKE C sub dir all 我想更改此 Makefile
  • Geopandas 数据框指向多边形

    我有一个 geopandas 数据框 由 id 和由 2D 点填充的几何列组成 我想连接每个唯一 id 的点来创建一个多边形 以便我的新数据框将多边形作为其几何形状 我的代码目前看起来像这样 polygons geopandas GeoDa
  • Cocoa - 在另一个 xib 上显示 xib

    谁能告诉我如何 或指导我有关信息 在另一个 xib 笔尖 上显示 xib 笔尖 我希望如何放置它 以便我可以以编程方式将它移动到主笔尖 就像这样 这显然不起作用 void drawRect NSRect dirtyRect NSRect c
  • 如何多线程从列表中读取字典并输入数据库

    我正在尝试对以下代码进行多线程处理 但似乎无法使其正常工作 以下代码 其中我删除了大部分代码只是为了说明目的 目前运行顺利 但速度很慢 对于 3600 条推文的列表大约需要 5 分钟 import dataset import dateti
  • Heroku 上的 Python 入门 - 未找到 pg_config 可执行文件

    我一直在关注文档 直到安装requirements txt 文件 尝试安装第 6 行 psycopg2 2 5 3 时总是失败 这是消息 Downloading unpacking psycopg2 2 5 3 from r require
  • 了解 U-Boot 内存占用

    我不明白加载 U Boot 时 RAM 中发生了什么 我正在开发 Xilinx Zynq ZC702 评估套件 并尝试使用 U Boot 在其上加载 Linux 内核 于是我使用Xilinx工具Vivado和SDK生成了一个BOOT bin