嵌入式linux学习笔记三--笔试面试题

2019-07-13 00:36发布

linux进程间通信方式:管道和信号


static的作用:1.隐藏。只能在本程序中使用,在编译多个文件时所有为static的函数和全局变量具有全局可见性。
若加了这个static就会对其他源文件隐藏,利用这一特性可以在不同的文件中定义相同名字的变量和函数。
 2.保持变量内容的持久.存储在静态存储区里的变量会在程序刚开始运行时就完成初始化,也是唯一的一次
初始化。
 3.默认初始化为0;



怎样定义一个全局变量?
全局变量是在函数外面定义的变量,它不属于任何一个函数,而属于一个源文件,其作用域是从定义该变量位置开始至源文件结束
全局变量被定义以后系统会为它分配内存,并且可以被其他模块通过C语言中关键字extern调用。函数中使用全局变量一般需要做说明,
若这个全局变量在函数之前定义的则可以不用声明。
全局变量和static变量存储在静态存储区里


linux编译出的.o文件和可执行文件是什么文件?.a文件又是什么文件?
.o文件是可重定位目标文件,虽然打包了机器语言指令,但他还需要与其他的库做链接生成可执行文件,然后才能加载到内存中执行。
.a文件是archive,静态库文件,将若干个.o文件打包生成,作为一个库为外部程序提供接口和函数


.global _start
_start:

ldr r0,=0xxxxx        //将地址0xxxx赋给r0,    ldr r0,0xxxxx//把地址0xxxxx处的值赋给r0
orr r0,r0,#0x13//逻辑或运算,r0=r0|0x13 即把第1/2/5位置1
mcr p15,0,r0,c15,c2,4 
mcr指令是将ARM处理器中的寄存器中的数据传送到协处理器的寄存器中,p15,0为格式要求,r0为源寄存器,c15为目标寄存器,c2为附加目标寄存器,
用于区分同一个编号的不同物理寄存器?(不懂什么意思)


ldr r0,=0xxxxxx
mov r1,#0
str r1,[r0]  将r1的值写到r0中所存内存地址处



重定位:
一上电,硬件自动把nandflash中的前8K内容原原本本的拷贝到处理器的片内内存中(sram),然后从零开始运行,而程序中的链接地址为0x5xxxx(内存地址)
此时的程序的地址不再其连接地址处但程序依然可以运行,这是因为,前一小段代码是用位置无关的指令来写的,这段代码需要做的事情有:初始化时钟、初始化DDR
此时DDR可以使用,然后重定位,把代码从片内内存中复制到DDR中,然后清楚BSS段,因为bin文件中是不包含bss段的,此时程序位于其链接地址处了,继续运行。
addr r0,_start //伪汇编指令,取_start的当前地址到r0中
ldr r1,=_start //也是伪汇编指令,取_start的链接地址到r1中


ldr r2,=bss_start
cmp r0,r1
beq clean_bss  //比较_start的链接地址和当前地址,若相等则执行clean_bss,若不相等继续执行下边的代码


copy_loop:
ldr r3,[r0],#4  //将r0中的值写到r3中,然后r0中加4
str r3,[r1],#4
cmp r1,r2       //比较r1,r2,若不相等则运行bne copy_loop
bne copy_loop


clean_bss
ldr r0,=bss_start
ldr r1,=bss_end
mov r3,#0x
cmp r0,r1
beq on_addr
clean_loop
str r3,[r0],#4
cmp r0,r1
bne clean_loop

on_ddr //执行到这里都处于片内内存中
ldr pc,=main     //pc等于main函数的链接地址,直接跳到ddr中执行main函数