1.请写出汇编指令要ldr的三种功能。
1)把立即数放入rd寄存器 。注意立即数没限制, ldr不能用于寄存器给寄存器赋值。
2)ldr rd, [rn] //把rn里的值作为地址,然后把地址上面的值放入rd
3)ldr rd, [rm, rn/#立即数] //把rm寄存器上值加上rn值的结果作为地址,再把地址上值放入rd
4)ldr rd, [rm, rn/#立即数] //把rm寄存器上值加上rn值的结果作为地址,再把地址上值放入rd
2.请说明要lr,sp,PC,cpsr的寄存器的作用
R13: 别名sp, 此寄存器用于装载栈顶的地址
R14: 别名lr, 此寄存器用于装载返回地址
R15: 别名pc, 此寄存器用于装载当前取指令的内存地址
cpsr: 当前程序状态寄存器, 记录当前工作模式,条件位状态等
spsr: 备份的程序状态寄存器, 用于保存cpsr的值
3.请说明在arm程序里,返回值放在哪个寄存器,函数参数是怎么传递的(大哥,看代码才有用)
调用函数时,传的参数从r0寄存器开始存放第1个参数, 直到r3寄存器存放第4个参数. 如还有参数则放入栈里.
被调用的函数会自动从栈里取超出的参数.
4.请说明printf函数体内参数的值是怎么样取出来的
1)printf函数时的第一个参数是一个字符串的地址,通过遍历字符串里的’%’字符,可以得知后面还带有多少个参数。
2)参数是从r0寄存器开始传参数,直到r3寄存器存放要传递的第四个参数,再多的参数就需压栈了。
3)函数的参数也是局部变量在栈里分配空间。
全部参数的地址都是连续的,只要获取其中一个参数的地址,即可通过偏移获取其它所有参数的值
5.请用汇编实现两个数相加的函数
6.请说明栈溢出攻击实现的原理
溢出攻击实现原理:
如上面的代码, buf数组足够大, 接收用户输入时如果不判断长度, 就可以把要执行的指令存入buf数组, 最后通过数组的越界访问,把栈里存放的原lr寄存器的内容改成buf数组的首地址, 那么buf数组里存放的指令就可以执行了.
而已当main函数是管理员执行时, 那么在buf数组里存放的指令执行就具有管理员的权限了, 手机的root用的就是这种方法
防止溢出攻击的方法:
1). 接用户输时判断数据长度, 防止数组越界访问
2). 尽量在堆里分配空间
3). gcc 编译时加上-fstack-protection选项(man gcc里查看
7.请说明b跳转与ldr跳转指令的区别,以及在什么场合使用?
8.请说明在uboot上加入自定义命令的步骤以及具体实现的原理。
在uboot里增加自定义的命令, 只要实现一个功能函数,再调用U_BOOT_CMD宏即可.
具体做法:
1.uboot里命令统一放在源码目录里的cmd目录.每个文件表示一类或一个命令.
2.修改cmd目录里的Makefile, 在第16行:
obj-y += cmd_mytest.o
3.回到orangepi_sdk目录下:
make uboot
make install_uboot sdcard=/dev/sdb
3.重新启动后,在uboot上输入 "help"命令:
可以查看到:
mytest - mytest - usage of mytest
4. 执行命令:
9.当前目录下有文件hello.c aa.c bb.c start.S,要求写一个makefile,最终生成test.bin
10.请说明MMU的工作原理
11.请描arm的异常向量表及每种异常是在什么情况下发生的?
12.请描述控制器的用途及时钟信号的用途
13.请描述按键的中断事件的流程,怎么最终调用中断的处理函数
14.请说明编译uboot源码前:make sp56818-drone_config这具体做了什么
15.请描述裁剪uboot的方法
16.请描述uboot环境变量(bootargs.bootcmd) 在作用
bootcmd // 倒计时到0后,自动执行里面的语句
bootargs // 是用于提供给内核的启动参数语句
如果想要开发板开机后自动引导内核, 可以修改bootcmd环境变量来完成
setenv bootcmd "fatload mmc 0:1 0x43000000 /script.bin; fatload mmc 0:1 0x42000000 /uimage; bootm 0x42000000"
17.请描述uboot启动,过程越详细越好
总结下uboot的配置过程:
1). script/orangepi.conf里的环境变量生效, 及进入uboot源码目录
2). make distclean
3). make orangepi_linux_defconfig
4). make menuconfig
总结下编译主要过程:
1).进入uboot源码目录
2). make -j8
3). 生成boot.src环境变量文件
4). 生成script.bin文件
18.请描述设备驱动的作业及用户程序之间的关系
19.请描述linux内核怎样操作io,列出具体的函数并说明用途
20.请描述,当我们把一个写的设备驱动加入内核代码里徐一起配置编译时的具体实现步骤。
21.请描述设备号有什么组成是背后的作用是什么?
22.请描述linux字符设备驱动的实现步骤及应用程序的调用过程
23.请你描述对vfs调用接口的认识