uboot1.1.6/lowlevel.S详解

2023-05-16

_TEXT_BASE:
.word TEXT_BASE // 这个TEXT_BASE是在uboot1.1.6/board/smdk2410/config.mk内定义的,TEXT_BASE = 0x33F80000。config.mk内有注释,这个地址是规划用来运行uboot的SDRAM区域开始地址。所以这个地址定义在这里主要是给链接器使用的,让链接器在链接时,重定位步骤中,将uboot代码重定位到这个地址(重定位涉及到某些指令的指令码修改,因为有一些指令是位置相关的)。


.globl lowlevel_init // lowlevel_init 函数完成的功能只有一个,那就是初始化SDRAM。初始化过程跟2440启动代码中的init.S中的初始化过程完全一样,说白了就是配置SDRAM控制器的13个寄存器内容。配置成什么样的值呢?一般来说要根据板子上实际用的SDRAM来确定。但是因为大家基本都是用现代的内存,所以基本上用的是一套配置参数。这里不想讲这些配置参数什么意思,只是重点分析这个函数的配置过程和技巧。

lowlevel_init:
/* memory control configuration */
/* make r0 relative the current location so that it */
/* reads SMRDATA out of FLASH rather than memory ! */
ldr     r0, =SMRDATA // 使用objdump查看可知,SMRDATA链接后地址为0x33f80430,而_TEXT_BASE 处存放的即是链接重定位时的基地址0x33f80000,所以r0-r1得到0x430,这就是SMRDATA这个数据结构在uboot可执行文件中相对于零点的偏移量。不管从nand还是nor启动,总之uboot可执行档起初都是在零地址开始的空间内的。所以这里r0-r1得到的即是启动时SMRDATA在nand/nor中的绝对地址,从这个内存地址(这里的内存不是SDRAM,而是SRAM或者norflash)去寻址即可读出SRMDATA数值。
ldr r1, _TEXT_BASE
sub r0, r0, r1
ldr r1, =BWSCON /* Bus Width Status Controller */
add     r2, r0, #13*4
0:
ldr     r3, [r0], #4 // 这里是一个循环来完成从SMRDATA到BWSCON开始的地址连续的13个SDRAM配置相关寄存器的设置
str     r3, [r1], #4 // r3是值中转寄存器,r2和r0的对比来判断13个是否已完成,r0指向SMRDATA源,r1指向目标寄存器地址
cmp     r2, r0 // 这里的关键其实就是理解SMRDATA的寻找过程。因为链接时重定位了,所以SMRDATA的地址直接引用的话,指向的将是他将来被加载
bne     0b // 到SDRAM后对应的地址。而这里初始化SDRAM时代码还在SRAM(对应nand启动)或nor(对应norflash启动)中,这些都是重定位之前
// 的地址,所以要通过上面的-TEXT_BASE的值来得到SMRDATA重定位之前的地址。

/* everything is fine now */
mov pc, lr


.ltorg
/* the literal pools origin */


SMRDATA:
    .word (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
    .word ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))
    .word ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))
    .word ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))
    .word ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))
    .word ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))
    .word ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))
    .word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))
    .word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))
    .word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)
    .word 0x32
    .word 0x30

    .word 0x30

总结:
1、代码链接时的重定位,让代码中使用位置相关代码时情况变的复杂起来了。这一块要彻底想通透,是需要花一些时间的。
2、objdump工具确实很有用,可以让你看到重定位后的符号和地址的对应关系,建议大家好好利用。
3、上面的r0-r1 = 0x430 < 4K,可见这个安排nand/nor启动都是支持的。如果启动部分比较大,SMRDATA的绝对地址(即相当于_start的地址)大于了4K,则这个代码就不能使用nand启动了。因为nand启动时只能映射前4k代码到SRAM。而nor启动则没有这个限制,因为nor启动在SDRAM运行代码前可支配的地址空间是0到norflash大小。

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

uboot1.1.6/lowlevel.S详解 的相关文章

  • 我可以更改用户的键盘输入吗?

    我找到了这个键盘挂钩代码 我试图根据我的目的对其进行稍微修改 http blogs msdn com toub archive 2006 05 03 589423 aspx 总的来说 我想让用户按下一个键 例如 E 然后让键盘向焦点所在的任
  • 为什么 Java 和 C# 有位移运算符?

    整数乘法 暂时忘记除法 之间的差异是否仍然有利于移位 如果是的话 差异有多大 它看起来只是一个低级优化 即使您想要它 在大多数情况下 C Java 字节码编译器或 jit 不应该捕获它吗 注意 我测试了 C 的编译输出 使用 gmcs Mo
  • 为什么位字节顺序是位字段中的一个问题?

    任何使用位域的可移植代码似乎都会区分小端和大端平台 请参阅Linux内核中struct iphdr的声明此类代码的示例 我根本不明白为什么位字节顺序是一个问题 据我了解 位域纯粹是编译器构造 用于促进位级操作 例如 考虑以下位字段 stru
  • Windows系统中是否有无缓冲的I/O?

    我想找到低级 C C API 相当于 Linux 系统中的 写入 但没有缓冲区 有吗 fread fwrite 等缓冲 I O 不是我想要的 Look at 创建文件使用 FILE FLAG NO BUFFERING 选项
  • C 低级标准输入接受文件名,然后将文件内容打印到标准输出

    我想通过标准输入从用户那里获取文件名 使用 open 打开文件并将其分配给文件描述符 然后将该文件的内容打印到标准输出 这是我的代码 它不能正常工作 问题 printf 输入文件名 声明永远不会出现 它永远不会打开文件 相反 无论用户输入什
  • 使用低级键盘钩子更改键盘字符

    我正在创建自定义键盘布局 作为开始步骤 我想让用户按下一个键 让我的键盘钩子拦截它 并输出我选择的不同键 我找到了这个键盘挂钩代码 我试图根据我的目的对其进行稍微修改 http blogs msdn com toub archive 200
  • 为什么需要内存对齐?

    我知道这个问题已经被问过一千次了 我已经阅读了每一个答案 但我仍然不明白 我的 RAM 模型可能存在一些根本性错误 使我无法理解任何答案 我从互联网上得到了所有这些小信息 但我就是无法将它们联系起来 以下是我认为到目前为止所知道的 以 IA
  • 为什么使用函数调用而不是变量地址来检测堆栈增长方向?

    我读到了对检测堆栈增长检测问题的不同回答 我了解到 在现代架构中 堆栈可能会随机增长 可能会在堆外创建 等等 然而 在这个经典的面试问题中 我想明白why人们使用函数调用而不是比较同一函数中的两个局部变量 我认为这样做一定有一些特殊的原因
  • 如何使用低级 8 位标志作为条件?

    在我的键盘钩子中 每次按键都会有一个标志 表明它是否被注入 http msdn microsoft com en us library ms644967 VS 85 aspx http msdn microsoft com en us li
  • C 标准库的更安全替代品

    C 标准库在 I O 安全方面是出了名的差劲 许多函数都有缓冲区溢出 gets scanf 或者如果没有给出正确的参数 scanf 等等 每隔一段时间 我就会遇到一位有进取心的黑客 他编写了自己的库 但没有这些缺陷 您见过的这些库中最好的是
  • WinDbg - 将字符串参数与内存中的字符串进行比较

    我需要比较一个字符串 作为参数传递给WinDbg用记忆中的字符串 如何才能实现这一目标 例如 该字符串位于加载的 PE 内的特定偏移处 所以 我可以通过执行轻松读取字符串da c 100
  • Windows 进程的内存映射是什么样的?

    这可能是一个重复的问题 我想知道windows进程的内存映射是什么样的 我正在寻找细节 请提供博客 文章和其他相关文献的链接 我总是喜欢能够真正看到事物 而不仅仅是阅读理论 事实证明 根据这篇博文 http www nynaeve net
  • 堆栈里面有什么?

    如果我运行一个程序 就像 include
  • 操作 TCP 标头中 ISN 编号的最有效方法 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我目前正在尝试编写一个程序 该程序将
  • 如何在Code::Blocks中查看反汇编?

    I read 本文 http altdevblogaday com 2011 11 09 a low level curriculum for c and c 关于 C C 的一些底层基础 作者基本上是通过编译器生成的汇编代码逐行向我们展示
  • Linux 中上下文切换需要多长时间?

    我很好奇在 Linux 中更改上下文需要多少个周期 我专门使用 E5405 Xeon x64 但我也很想看看它与其他平台的比较 有一个名为 LMBench 的免费应用程序 由 Larry McVoy 和朋友编写 它提供了一系列操作系统和硬件
  • 如何在 iOS 中访问 JPEG COM 段?

    JPEG 有很多标记段级别 我想读取和写入注释标记段级别 COM 读 写 它需要低级编程 我如何在 iOS 中访问它 参考 http help accusoft com ImageGear v18 1 Mac IGDLL 10 05 htm
  • 3D 数组如何在 C 中存储?

    据我所知 C 中的数组是按行优先顺序分配的 因此 对于 2 x 3 数组 0 1 2 3 4 5 存储在内存中为 0 1 2 3 4 5 但是 如果我有一个 2 x 3 x 2 数组怎么办 0 1 2 3 4 5 and 6 7 8 9 1
  • 原始 ssh 连接(低级)

    作为一个小型 大型 业余爱好项目 我开始用 C 制作一个 非常原始的 ssh 2 0 客户端 这是为了探索和更好地理解 DH 并帮助加深我对加密的熟悉程度 根据 RFC 4253 我已经开始这样的初始连接 省略不相关的变量预设等 Rando
  • 哪些编程语言不被视为高级语言? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在信息学理论中 我一直听到和读到有关高级和低级语言的内容 然而我不明白为什么这仍然相关 因为除了今天使用的汇编语言之外 没有任何 相关的 低级语

随机推荐

  • 【Halcon】 Halcon 22.11 常用设置及界面介绍

    文章目录 1 设置语言 2 自带示例 3 示例文件 图片 等路径 4 工具栏设置 1 设置语言 第一次打开 默认繁体字 2 自带示例 3 示例文件 图片 等路径 先随便打开一个示例程序 然后 点打开程序 就可以看到示例文件路径了 C spa
  • 【Halcon】新建程序 读取图片 路径设置

    文章目录 1 新建程序 2 读取一张图片 3 图片路径 4 图片格式读取报错 5 快速添加 绝对路径 1 新建程序 点击新程序图标 即可新建 程序另存为 会弹出保存路径 2 读取一张图片 span class token function
  • 机器视觉 与 人眼错觉

  • 【Halcon】重置程序执行

    程序执行完毕后 xff0c 光标会停止在程序最后一行 xff08 没有设置stop xff09 的情况下 xff09 此时再点运行 xff0c 是没反应的 点一下 工具栏的 重置 xff0c 此时光标会回到第一行 xff0c 再次点击运行
  • 【Halcon】找到设备上的 标识牌

    如图 找到设备上的 标识牌 标识牌最明显的特征是比其他区域亮 二值化选择出亮区域 再通过面积选择出目标区域 先显示图片 span class token operator span 获取图片的大小 span class token func
  • Halcon 检测电路板上焊盘圆点 并显示焊盘的直径

    文章目录 1 问题描述 2 代码实现 3 halcon示例 1 问题描述 如图 检测电路板上焊盘圆点 并显示焊盘的直径 效果 2 代码实现 思路 焊盘颜色比较黑 可以用二值化 找到对应区域 但是可以观察原图上边缘部分颜色和焊盘接近 二值化减
  • Halcon 亚像素检测指定区域 瑕疵 轮廓

    如图 找到下图中铭牌上 面积最大的瑕疵快 认为黑点是瑕疵 span class token operator span 读取图片 并获取尺寸 span class token function read image span span cl
  • Halcon 阈值分割(全局阈值threshold、binary_threshold、动态阈值 dyn_threshold)、直方图

    文章目录 1 图像直方图 2 全局阈值 threshold 3 binary threshold 4 动态阈值mean image dyn threshold 5 代码和原图 1 图像直方图 图像直方图 Image Histogram 是用
  • uboot开篇 — arm-linux-gcc安装及编译uboot

    最近由于工作的原因需要研究下uboot在2440上的移植 xff0c 于是乎今天开始着手 首先下载了uboot的源码 xff08 源码下载官网http www icdev com cn batch viewlink php itemid 6
  • Halcon 找到产品上 圆圈中的7个点

    文章目录 1 关键实现环节演示 2 完整代码 及 原图 文章目录 1 关键实现环节演示 2 完整代码 及 原图 找到下图 圆圈中的7个点 思路 先找到圆圈外面的矩形 再找到里面的圆圈 最后找到圆圈里面的 圆点 1 关键实现环节演示 二值化
  • 安装endnote 之后打开word出现乱码

    文章目录 1 安装endnote 之后打开word出现乱码3 EndNote X9 插入参考文献常见问题总结4 EndNote X9 快速上手教程 xff08 毕业论文参考文献管理器 xff09 1 安装endnote 之后打开word出现
  • EndNote X9 引用参考 单击文献编号,不能跳转到文尾文献列表处,咋解决?文献编号 不能跳转 ,怎么办?

    文章目录 1 正常情况下 引用文献编号 是可以跳转的2 问题分析3 解决方法4 EndNote X9 插入参考文献常见问题总结5 EndNote X9 快速上手教程 xff08 毕业论文参考文献管理器 xff09 1 正常情况下 引用文献编
  • EndNote X9 参考文献附录列表 格式调整

    文章目录 1 参考文献附录列表 格式调整2 EndNote X9 插入参考文献常见问题总结3 EndNote X9 快速上手教程 xff08 毕业论文参考文献管理器 xff09 1 参考文献附录列表 格式调整 注意 xff1a 这里讲的是对
  • EndNote X9 导入知网文献 插入引用文献 方法

    文章目录 1 EndNote X9 导入知网文献2 EndNote X9 插入参考文献常见问题总结3 EndNote X9 快速上手教程 xff08 毕业论文参考文献管理器 xff09 1 EndNote X9 导入知网文献 下载知网参考文
  • endNote X9 导入英文文献(谷歌学术、web of science 等)

    文章目录 1 导入英文文献 xff08 谷歌学术 web of science 等 xff09 2 EndNote X9 插入参考文献常见问题总结3 EndNote X9 快速上手教程 xff08 毕业论文参考文献管理器 xff09 1 导
  • endNote X9 增加 / 删除参考文献 文献编号自动更新

    文章目录 1 增插参考文献2 删减参考文献3 EndNote X9 插入参考文献常见问题总结4 EndNote X9 快速上手教程 xff08 毕业论文参考文献管理器 xff09 1 增插参考文献 61 61 61 61 61 61 61
  • windows10 通过vnc方式远程连接服务器

    以下摘抄至腾讯云文档 xff0c 记录一下 腾讯云 文档中心 轻量应用服务器 最佳实践 搭建Ubuntu可视化界面 VNC xff08 Virtual Network Console xff09 是虚拟网络控制台的缩写 它是一款优秀的远程控
  • UART串口接收设计

    一 设计思路 1 端口设置 为实现UART串口接收 xff0c 所设计的模块应具有如下端口 xff1a 时钟 复位 波特率设置 串行数据输入 并行数据输出 一次数据接收完成标志 如图 xff1a module span class toke
  • (十)性能分析工具的使用(上)

    性能分析工具的使用 1 数据库服务器的优化步骤2 查看系统性能参数3 统计SQL的查询成本 xff1a last query cost4 定位执行慢的 SQL xff1a 慢查询日志4 1 开启慢查询日志参数1 开启slow query l
  • uboot1.1.6/lowlevel.S详解

    TEXT BASE word TEXT BASE 这个TEXT BASE是在uboot1 1 6 board smdk2410 config mk内定义的 xff0c TEXT BASE 61 0x33F80000 config mk内有注