说明:
- 面试群,群号: 228447240
- 面试题来源于网络书籍,公司题目以及博主原创或修改(题目大部分来源于各种公司);
- 文中很多题目,或许大家直接编译器写完,1分钟就出结果了。但在这里博主希望每一个题目,大家都要经过认真思考,答案不重要,重要的是通过题目理解所考知识点,好应对题目更多的变化;
- 博主与大家一起学习,一起刷题,共同进步;
- 写文不易,麻烦给个三连!!!
目录
1.内核如何传参
答案:
uboot传的是R0,R1,R2参数,R0默认是0,R1存放的就是CPU的型号,R2里面存放的是些基地址,比如内存的起始地址,内存大小,根文件系统的信息。
规定参数的格式:
Linux内核2.4以后都是以标记列表tagged_list的形式来传递参数,标记列表就是挨着存放多个标记,标记列表以标记ATAG_CORE开始,ATAG_NONE结束。
该结构体有两部分组成,结构体tag_header,和联合体
2.uboot为什么要关闭caches
答案:
Caches是cpu的2级缓存,主要作用是将常用的指令和数据存在cpu内部,刚上电CPU还不能管理caches,指令caches可以关闭,也可以不关闭,但是数据caches必须关闭,否则可能由于刚开始的代码到caches里面取数据的时候,由于caches还没准备好,会导致数据异常。
3.驱动申请内存的函数
答案:
Kmalloc会在“lowmem : 0xc0000000 - 0xef600000”地址空间里申请内存(底端内存);
Vmalloc 会在0xef800000 - 0xfee00000”地址空间里申请内存(高端内存)。
kmalloc 分配的内存大小有限制(128KB),而 vmalloc 没有限制;
kmalloc 分配内存的开销小,因此 kmalloc 比 vmalloc 要快。
内核中一般使用 kmalloc(),而只有在需要获得大块内存时才使用 vmalloc(),得到的地址非线性
kmalloc获取到的是连续的地址,vmalloc获取的是不连续的,一般情况下,vmalloc申请的是以M为单位,kmalloc申请的是以B为单位。
函数 devm_kzalloc() 和kzalloc()一样都是内核内存分配函数
但是devm_kzalloc()是跟设备(device)有关的,当设备(device)被detached或者驱动(driver)卸载(unloaded)时,内存会被自动释放。另外,当内存不在使用时,可以使用函数devm_kfree()释放。
而kzalloc()则需要手动释放(使用kfree()),但如果工程师检查不仔细,则有可能造成内存泄漏
4.AD转换的原理
答案:
A/D转换器的工作原理,主要有以下三种方法:
1.逐次逼近法;
2.双积分法;
3.电压频率转换法。
A/D转换四步骤:采样、保持、量化、编码。
采用电压频率转换法的A/D转换器,由计数器、控制门及一个具有恒定时间的时钟门控制信号组成,它的工作原理是V/F转换电路把输入的模拟电压转换成与模拟电压成正比的脉冲信号。电压频率转换法。
电压频率转换法的工作过程是:当模拟电压Vi加到V/F的输入端,便产生频率F与Vi成正比的脉冲,在一定的时间内对该脉冲信号计数,时间到,统计到计数器的计数值正比于输入电压Vi,从而完成A/D转换。
5.开发板的启动流程
答案:
启动过程:四部曲
(无论是uboot、Linux内核、设备树、根文件系统,都必须拷贝到芯片内存才能使用,因为这些都是事先存在外存中)
开发板上电之后,会先找到地址为0的地址空间,即96k的iROM,这个是芯片厂家事先固化好的程序,这个程序主要是初始化时钟,栈,还有依据拨码开关找到bootloader的位置即是在SD卡还是在MMC或其他外存,对应图中的1,
之后把Bootloader的前4KB数据从外存拷贝到iRAM内存中,它包含了启动数据的地址以及长度,告诉boot ROM将启动数据拷贝到哪里以及拷贝多大,然后初始化外部DRAM控制器对应图2,
在初始化完DRAM控制器之后,bootloader主体部分被拷贝至外部DRAM中,对应图3,
bootloader随后便将linux操作系统镜像从引导设备加载到DRAM中,并对OS完整性检查,引导完成之后,bootloader跳到操作系统中去运行,启动Linux内核,对应图4。
6.移植需要做哪些工作
答案:
Uboot----->linux内核------->设备树------->根文件系统
说明:
在移植Linux系统之前需要先移植一个bootloader,这个bootloader用于启动linux内核,常用的有u-boot,移植好uboot之后就可以移植linux内核,这还不能够正常启动,还需要移植一个根文件系统rootfs,这个根文件系统里面就包含了常用的命令和文件
所以一个完整的Linux系统包括uboot、linux kernel(含设备树)、rootfs
7.bootloader基本功能
答案:
初始化软硬件环境,比如:内存地址
引导加载Linux内核
给Linux内核传参
执行用户命令
8.uboot
答案:
uboot是bootloader的一种,主要作用就是在芯片上电一段时间后初始化DDR,然后将Linux内核的镜像从SD或者MMC、NAND(这些都是外存)拷贝到DDR(内存),启动内核。
外存是相当于ROM(和电脑硬盘)掉电不消失也叫闪存,内存是RAM掉电消失。
Uboot的区别
9.Uboot常用命令
答案:
Help----->列出所有支持的命令。或指定的命令的帮助
Reset--->重启uboot
Setenv----->设置/修改/删除环境参数的值
Printenv----->打印环境的值
Md---->查看内存地址的值
Mw---->修改内存地址的值
Echo---->打印
Run---->执行某条环境变量参数命令
Bootz---->在内存引导内核启动
Load---->从文件系统中加载二进制文件到内存
10.IIC为什么要加上拉电阻,为什么使用开漏输出
答案:
上拉电阻
1.当IIC总线在空闲状态,SDA和SCL需要处于高电平状态
2.开漏输出无法输出高电平,使用上拉电阻可以完成高低电平之间的转换
开漏输出
1.加入使用推挽输出可能导致器件的烧毁
2.实现线与功能