问题标签 [powerpc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
silverlight - PowerPC Mac 上的月光
Silverlight 在 1.0 版之后停止支持 PowerPC Mac。Moonlight 2.0 能否在 PowerPC Mac 上运行?
我们正在考虑编写下一代产品,并且正在考虑 Silverlight。但是,由于我们现有的客户群,我们目前无法切断 PowerPC Mac 用户,我们希望避免并行开发。
linux - 开放固件设备树概述/参考手册
我正在尝试为嵌入式 PowerPC 板设置驱动程序,而今天正确的方法是使用 OpenFirmware 设备树数据结构(.dtb 文件,从 .dts 文件编译而来)。创建树非常容易,但是如何让设备驱动程序找到它的节点和其中的数据?我还没有找到任何好的参考资料,像“Linux 设备驱动程序”这样的书籍在 x86 领域中的内容太多,对主要与基于 Power Architecture 的机器(Linux 内核中的 arch powerpc)相关的设备树有很大帮助术语)。
caching - 尝试刷新 PowerPC 750 数据缓存
我正在编写一个例程来在使用回写模式时将其关闭之前刷新 PowerPC750 数据缓存。
我找到了关于编程缓存的IBM 应用说明,其中包括一个刷新例程,但我对示例代码感到困惑。我认为这可能是示例中的错误,但我想我会检查一下。在清单 2 中有两个循环,其中包括“移动到下一个块”的指令。通过将 0x10 添加到当前地址来实现移动到下一个块。我原以为这是 0x20 (32) 的添加,因为我认为缓存行是 32 字节宽。谁能证实或否定我的想法?!
c - 如何在 C 中取消引用 NULL 指针不会使程序崩溃?
我需要一位真正的 C 大师的帮助来分析我的代码中的崩溃。不是为了修复崩溃;我可以很容易地修复它,但在这样做之前,我想了解这种崩溃是如何发生的,因为这对我来说似乎完全不可能。
此崩溃仅发生在客户计算机上,并且我无法在本地重现它(因此我无法使用调试器单步执行代码),因为我无法获取此用户数据库的副本。我的公司也不允许我只更改代码中的几行并为该客户进行自定义构建(因此我无法添加一些 printf 行并让他再次运行代码),当然客户的构建没有调试符号。换句话说,我的调试能力非常有限。尽管如此,我还是可以确定崩溃并获得一些调试信息。但是,当我查看该信息然后查看代码时,我无法理解程序流如何到达有问题的行。代码应该在到达该行之前很久就崩溃了。我完全迷失在这里。
让我们从相关代码开始。这是非常少的代码:
已经是这样了。它在 strlcpy 中崩溃。我什至可以告诉你 strlcpy 在运行时是如何被真正调用的。strlcpy 实际上是使用以下参数调用的:
知道这一点,strlcpy 崩溃的原因就很明显了。它试图从 NULL 指针中读取一个字符,这当然会崩溃。而且由于最后一个参数的值是1,所以原来的长度一定是0。我的代码这里显然有一个bug,它没有检查名称数据是否为NULL。我可以解决这个问题,没问题。
我的问题是:
这段代码首先是如何到达 strlcpy 的?
为什么这段代码不会在 if 语句中崩溃?
我在我的机器上本地尝试过:
此代码永远不会通过 if 语句。它在 if 语句中崩溃,这绝对是意料之中的。
那么谁能想到为什么如果 name->data 真的为 NULL,第一个代码可以通过该 if 语句而不会崩溃?这对我来说是完全神秘的。这似乎不是确定性的。
重要的额外信息:
两个注释之间的代码真的很完整,没有遗漏任何内容。此外,该应用程序是单线程的,因此没有其他线程可以意外更改后台的任何内存。发生这种情况的平台是 PPC CPU(一个 G4,以防万一)。如果有人想知道“kind.”,这是因为“信息”包含一个名为“kind”的“联合”,而 name 又是一个结构(kind 是一个联合,每个可能的联合值都是不同类型的结构);但这一切在这里都不重要。
我很感激这里的任何想法。如果这不仅仅是一个理论,我会更加感激,如果有一种方法可以验证这个理论是否真的适用于客户。
解决方案
我已经接受了正确的答案,但以防万一有人在 Google 上找到这个问题,这就是真正发生的事情:
指针指向已经被释放的内存。释放内存不会使其全部为零或导致进程立即将其还给系统。因此,即使内存被错误地释放,它也包含正确的值。在执行“ if check ”时,所讨论的指针不为 NULL 。
在那次检查之后,我分配了一些新的内存,调用 malloc。不确定 malloc 在这里究竟做了什么,但每次调用 malloc 或 free 都会对进程的虚拟地址空间的所有动态内存产生深远的影响。在 malloc 调用之后,指针实际上是 NULL。不知何故 malloc (或某些系统调用 malloc 使用)将指针本身所在的已释放内存归零(不是它指向的数据,指针本身位于动态内存中)。将该内存归零,指针现在的值为 0x0,在我的系统上等于 NULL,当调用 strlcpy 时,它当然会崩溃。
所以导致这种奇怪行为的真正错误是在我的代码中完全不同的位置。永远不要忘记:释放的内存会保持它的价值,但它会持续多久是你无法控制的。要检查您的应用程序是否存在访问已释放内存的内存错误,只需确保释放的内存在释放之前始终为零。在 OS X 中,您可以通过在运行时设置环境变量来做到这一点(无需重新编译任何东西)。当然,这会大大减慢程序的速度,但您会更早地发现这些错误。
cross-compiling - 在 Eclipse 中为 PPC 405 目标在 Windows 上进行交叉编译
有没有人知道如何使用 MinGW 或 Cygwin 设置 Eclipse 来构建、开发和交叉编译要部署在具有 PPC 405 架构的机器上的代码?是像为编译器设置正确的标志一样简单,还是有更多的参与?我正在为在 PPC 处理器上运行 Linux 的嵌入式系统在 Windows 上进行开发。任何正确方向的帮助或指示将不胜感激。
assembly - 哪个 32 位/64 位 CPU 架构具有最简单的指令集?
处理 32 位 PowerPC 汇编代码让我感觉非常舒服,但在尝试理解 x86 代码时我完全迷失了方向。ARM、MIPS、Sparc 等其他常见架构是否比 x86 指令集更容易?
assembly - 在 PowerPC 上处理外部异常时使用 r1 堆栈指针
我正在编写一个汇编程序来处理 EABI 嵌入式 PowerPC 应用程序中的 0x500 外部/递减器异常。
在从 0x500 向量点调用的汇编程序例程中,我想在分支到“C”中的处理函数之前使用一些内存来上下文保存寄存器。
因为 i) 异常模型保证前面的指令将在异常处理程序运行时完成并且 ii) 调用约定似乎在进入新函数时首先更新堆栈指针 (r1),然后再使用释放的新堆栈空间通过移动它(并将堆栈指针移回函数末尾的最后一个位置)
在我看来,我可以安全地使用 r1 在异常处理例程中的正常堆栈上为自己留出更多空间,前提是我显然遵守调用约定并将堆栈放回我找到它的方式并确保 SRR0 和 SRR1 是未修改。
我不会允许在处理过程中使用堆栈的异常嵌套(尽管实际上使用这种方法我不确定是否会出现问题)。
您认为这是一种明智的方法,还是应该使用单独的堆栈进行异常处理?- 我认为这可能会带来它自己的问题。
assembly - 什么是 MTMSREE PowerPC op?
我正在查看使用 MSVC 编译的 (Xenon) PowerPC 可执行文件的核心转储。我正在调试的函数有一个 MSVC 反汇编程序调用的操作mtmsree r13
。mtmsree
不在 PPC 的 IBM 文档中;这个操作是做什么的?
它紧跟在 a 之后mfmsr
,显然它正在向机器状态寄存器移动一些东西,但我不知道那个ee
后缀应该是什么意思。对于 PPC 文档称为不同的操作的操作,它一定是某种可爱的 Microsoft 昵称。
exception-handling - 为什么我的新 PowerPC 中断处理程序仅在缓存打开时崩溃
我正在使用 PowerPC 750,并且刚刚开始尝试使用外部中断。
我有一个中断驱动的小程序,只要数据缓存关闭,它就可以正常工作。如果我打开缓存,PowerPC 在外部中断触发后第一次访问内存映射外围设备时崩溃。
这让我感到惊讶,因为:
我的理解是,当调用异常处理程序时,处理器的寻址处于“实模式”,并且由于我的所有地址在实模式和转换模式下都是相同的,因此访问应该正常工作。
外设在 DBAT 中标记为非缓存的空间中
在我错过了外部异常之后,您是否与缓存/寻址有关?
boost - 为 VxWorks 6.4 交叉编译 Boost 1.40
我正在尝试将使用 Boost(特别是 boost::thread 和 boost::asio)的项目迁移到 VxWorks。
我无法使用 vxworks gnu 编译器进行编译。我认为这不会成为问题,因为我在 boost trac 上看到了声称使这成为可能的补丁,并且由于 vxworks 编译器是 gnu 工具链的一部分,我应该能够按照说明进行操作用于交叉编译的 boost 文档。
我正在为 ppc vxworks 在 Windows 上构建。
我更改了 boost 文档中指定的 user-config.jam 文件,并将 target-os=linux 选项用于 bjam,但 bjam 在编译之前似乎挂起。仔细检查 bjam 发出的命令(通过使用 -n 选项调用它)发现它正在尝试使用 boost::thread 的 win32 文件进行编译。这不可能,因为 vxworks 使用 pthreads。
我的 bjam 命令:.\bjam --with-thread toolset=gcc-ppc target-os=linux
gcc-ppc 在用户配置中设置为指向 g++ppc vxworks 交叉编译器。
我究竟做错了什么?我相信我已经完全按照文档进行了操作。