韦东山yy公开课笔记(2)--汇编,段,栈,重定位/链接地址,位置无关吗

1. 要不要学习汇编
可以只懂一点,工作中基本不用,一旦用就是出了大问题

ldr : load 读内存
ldr r0, [r1]  : r1里存放的是地址值, 去这个地址读取4字节的内容,存入r0

str : stroe 写内存
str r0, [r1]  : r1里存放的是地址值, 把r0里的4字节数据存入这个地址

所有的汇编、C程序也好,终极目标就是:读写某个地址

2. 程序为何要分为代码段、数据段、BSS段
程序的指令等是只读的,可以把它们归为一类,以便运行时可以放在ROM等设备上,
当然也可以放在内存,只不过这块内存无需写操作

程序的全局变量等,是可读可写的,可以把它们归为一类,放在内存里

假设程序里有1百万个初始值为0的全局变量,
你最终编译出来的bin文件里要不要存放这1百万个0变量?
肯定没那么傻,不存!
怎么办?
把它们归为一类,只记录它们的内存起始地址、结束地址。
在程序运行之前,把这块内存全部清零

3. 栈的作用
3.1
调用C函数之前要设置栈,
因为在C函数的开头要保存某些值(比如返回地址), 这些值肯定要保存在内存里,
这块内存大家约定用sp寄存器指明位置,
这块内存就是栈

3.2 用来保存局部变量

4. 重定位/链接地址
使用全局变量时,是根据它的地址去读写内存。
这个地址跟链接脚本的起始地址密切相关
也可以知道:
要想正确访问到全局变量,程序运行之前应该位于它的链接地址上

4.1 NAND启动时,NAND前4K会被自动复制到片内SRAM并运行
    如果程序远超过4K,那么前4K的代码应该把程序完全复制到SDRAM
    问:SDRAM那么大,应该复制到哪个位置呢?
    答:复制到它的链接地址去
        因为全局变量等是以链接地址来访问的,在程序运行之前,这个地址上应该有正确值

由此也可以得到裸板框架:
a. 必要的硬件初始化:看门狗、时钟、SDRAM
b. 重定位: 把程序到FLASH上读到内存中它的链接地址处
c. 清除BSS
d. 调用C函数

5. 位置无关码
假设程序的链接地址是0x30000000,这是位于SDRAM上,
一上电是从0地址开始执行
问:为何0地址开始的那部分代码可以正确执行?
答:它们是使用位置无关的代码编写的
    a. 不访问全局变量/静态变量
    b. 跳转时使用相对跳转指令b, bl

test1:
                        b  test2  //如何实现跳转?
                                  b 当前值 + (test2 - test1)
....
....
test2:

参考<嵌入式LINUX应用开发完全手册> P38,<3.1.2 arm-linux-ld 选项>

时间: 2024-11-08 09:09:13

韦东山yy公开课笔记(2)--汇编,段,栈,重定位/链接地址,位置无关吗的相关文章

韦东山yy公开课笔记(1)--各种杂的问题

1,第四期的智能猫眼会有打电话和发短信的功能吗? 答:会有打电话功能,硬件上支持打电话就会支持发短信,只是软件上是否实现发短信现在未定.因为短信延迟太严重,不是可靠的. 2,请问关于makefile中的很多设置项,像段啊什么的?是什么意思呢?需要深入学习吗? 3 答:对于裸板才需要我们自己管理“段”,这并不是什么很高深的知识,看过涉及重定位的裸板视频就可以了解清楚了.至于其他设置项,基本上就是编译选项而已.Makefile本身并不复杂,也不应该成为学习的拦路虎:用于裸板的Makefile,它是非

韦东山yy公开课笔记(2)--各种杂的问题

1. 编译器的版本和glibc库有对应关系吗,如何查看glibc的版本(glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc),编译器是不是只带glibc被编译生成的 .so 文件,如果自制系统调用的话是不是还要下载glibc然后重新编译 答:一般来说制作编译器的时候就会选定glibc,所以你得到的编译器里面含有glibc的库,既有so文件,也有.a文件.编译器和Glibc都在更新的,新编译器一般不能使用过老的glibc.但是它们之间的版本关系,我也不了解. 自制系

斯坦福ML公开课笔记13B-因子分析模型及其EM求解

转载请注明:http://blog.csdn.net/stdcoutzyx/article/details/37559995 本文是<斯坦福ML公开课笔记13A>的续篇.主要讲述针对混合高斯模型的问题所采取的简单解决方法,即对假设进行限制的简单方法,最后引出因子分析模型(Factor Analysis Model),包括因子分析模型的介绍.EM求解等. 斯坦福ML公开课笔记13B-因子分析模型及其EM求解,布布扣,bubuko.com

JS公开课笔记一

JS公开课笔记 没特别说明就是和Java语言一样. JS变量:弱类型语言 1.在JS中,true表示1,false表示0.和Java不一样. 2. var y: 提示undefined: 3.如果alert(y+10)://提示NaN 表示 非法值. 4.JS没有字符和字符串区别,所以使用""和'' 是一样. 5. var arr = new Array(3); arr[0] = 'abc'; arr[1] = 123; arr[3] = false; alert(arr); 是正确的

Coursera公开课笔记: 斯坦福大学机器学习第七课“正则化”

Coursera公开课笔记: 斯坦福大学机器学习第七课"正则化" NLPJob 斯坦福大学机器学习第七课"正则化"学习笔记,本次课程主要包括4部分: 1) The Problem of Overfitting(过拟合问题) 2) Cost Function(成本函数) 3) Regularized Linear Regression(线性回归的正则化) 4) Regularized Logistic Regression(逻辑回归的正则化) 以下是每一部分的详细解读

Andrew Ng机器学习公开课笔记 -- Mixtures of Gaussians and the EM algorithm

网易公开课,第12,13课 notes,7a, 7b,8 从这章开始,介绍无监督的算法 对于无监督,当然首先想到k means, 最典型也最简单,有需要直接看7a的讲义   Mixtures of Gaussians 如果要理解Mixtures of Gaussians,那先回去复习一下Gaussians Discriminant Analysis,高斯判别分析 首先高斯判别分析是生成算法, 所以不会直接拟合p(y|x), 而是拟合p(x|y)p(y), 即p(x,y) p(y)符合伯努力分布,

斯坦福ML公开课笔记14——主成分分析

上一篇笔记中,介绍了因子分析模型,因子分析模型使用d维子空间的隐含变量z来拟合训练数据,所以实际上因子分析模型是一种数据降维的方法,它基于一个概率模型,使用EM算法来估计参数. 本篇主要介绍PCA(Principal Components Analysis, 主成分分析),也是一种降维方法,但是该方法比较直接,只需计算特征向量就可以进行降维了.本篇对应的视频是公开课的第14个视频,该视频的前半部分为因子分析模型的EM求解,已写入笔记13,本篇只是后半部分的笔记,所以内容较少. 斯坦福ML公开课笔

斯坦福ML公开课笔记13A——混合高斯模型、混合贝叶斯模型

本文对应公开课的第13个视频,这个视频仍然和EM算法非常相关,第12个视频讲解了EM算法的基础,本视频则是在讲EM算法的应用.本视频的主要内容包括混合高斯模型(Mixture of Gaussian, MoG)的EM推导.混合贝叶斯模型(Mixture of Naive Bayes,MoNB)的EM推导.因子分析模型(Factor Analysis Model)及其EM求解.由于本章内容较多,故而分为AB两篇,本篇介绍至混合模型的问题. 很久没有写这个系列的笔记了,各种事情加各种懒导致的.虽然慢

斯坦福ML公开课笔记15—隐含语义索引、神秘值分解、独立成分分析

斯坦福ML公开课笔记15 我们在上一篇笔记中讲到了PCA(主成分分析). PCA是一种直接的降维方法.通过求解特征值与特征向量,并选取特征值较大的一些特征向量来达到降维的效果. 本文继续PCA的话题,包含PCA的一个应用--LSI(Latent Semantic Indexing, 隐含语义索引)和PCA的一个实现--SVD(Singular Value Decomposition,神秘值分解). 在SVD和LSI结束之后.关于PCA的内容就告一段落. 视频的后半段開始讲无监督学习的一种--IC