当前位置:首页>Linux>嵌入式linux打卡第一天

嵌入式linux打卡第一天

  • 2026-09-05 04:17:13
嵌入式linux打卡第一天
基于正点原子IMX6U左神教程
由于之前看了第一期以及搭建好了裸机开发环境
今天看到了第二期的8.2讲
       1、BOOT ROM做的事情
启动文件
    第1行定义了一个全局标号_start。 第7行就是标号_start开始的地方,相当于是一个_start函数,这个_start就是第一行代码。 
    第10~13行就是设置处理器进入SVC模式,这里我们设置处理器运行在SVC模式下。处理器模式的 设置是通过修改CPSR(程序状态)寄存器来完成的,CPSR寄存器,其中M[4:0](CPSR的bit[4:0])就是设置处理器运行模式的,如果要将处理器设置为SVC模式,那么M[4:0]就要等于0X13。
    11~13行代码就是先使用指令MRS将CPSR 寄存器的值读取到R0中,然后修改R0中的值,设置R0的bit[4:0]为0X13,然后再使用指令 MSR将修改后的R0重新写入到CPSR中。 
    第15行通过ldr指令设置SVC模式下的SP指针=0X80200000,因为I.MX6U-ALPHA开 发板上的DDR3地址范围是0X80000000~0XA0000000(512MB)或者                                0X80000000~0X90000000(256MB),不管是512MB版本还是256MB版本的,其DDR3起始地 址都是0X80000000。
    由于Cortex-A7的堆栈是向下增长的,所以将SP指针设置为0X80200000, 因此SVC模式的栈大小0X80200000-0X80000000=0X200000=2MB,2MB的栈空间已经很大了, 如果做裸机开发的话绰绰有余。 
    第16行就是跳转到main函数,main函数就是C语言代码了。 
Makefile
链接脚本文件
第 2 行设置定位计数器为 0X87800000,因为我们的链接地址就是0X87800000。第 5行设置链接到开始位置的文件为start.o, 因为start.o 里面包含着第一个要执行的指令,所以一定要链接到最开始的地方。第6行是main.o 这个文件,其实可以不用写出来,因为main.o的位置就无所谓了,可以由编译器自行决定链接 位置。在第11、13行有“__bss_start”和“__bss_end”这两个东西?这个是什么呢?“__bss_start” 和“__bss_end”是符号,第11、13这两行其实就是对这两个符号进行赋值,其值为定位符“.”, 这两个符号用来保存.bss 段的起始地址和结束地址。前面说了.bss 段是定义了但是没有被初始化的变量,我们需要手动对.bss段的变量清零的,因此我们需要知道.bss段的起始和结束地址, 这样我们直接对这段内存赋0即可完成清零。通过第11、13行代码,.bss段的起始地址和结束 地址就保存在了“__bss_start”和“__bss_end”中,我们就可以直接在汇编或者 C 文件里面使 用这两个符号。

最新文章

随机文章