买了块板子不到两个月,匆匆忙忙做了一些教学项目就跑去面试了,准备从魔都滚蛋了,地方虽好,穷逼留不下。写个博文记录一下面试题。
C语言
怎么将二进制数据解析成float
这个题当时我理解错了,之前看CSAPP时看到过,要通过什么IEEE制定的协议,将存储的数据按照、符号位、阶码、尾数、长度进行解析,当时我人傻了,这么深么???然后没说出来。后面又仔细回顾了一下面试官的问题,他描述的应该是某个地址中存着一个float型的数据,怎么对它进行解析。只要做过数据传输方面的小伙伴都应该熟悉这个问题,简直就是送分题。
最常用和简单的就是union,由于char数组和float的起始地址是一样的,用char数组接受读取的数据,直接输出成float型即可,在传输的时候还注意大小端的问题。
vloatile const inline
初学者的高频面试题,对于这个不熟的基本可以认为没怎么做过实际项目。因为常问的几个问题就是:
以下区别是啥?
const int a; a是只读int变量
int const a; a是只读int变量
const int *a; a是指针,指向一个只读int变量,指向可以变
int * const a; a是只读指针,指向int变量,指向不能变
一个参数既可以是const还可以是volatile吗?
可以,只读的状态寄存器
内敛函数的声明与定义。
C语言中,如果一些函数被频繁的调用,不断地用函数入栈,即函数栈,则会造成栈空间或者栈内存的大量消耗,为了解决这个问题,特别的引入了inline关键字,表示为内联函数。
关键字inline必须与函数的定义体放在一起,才能使函数成为内联函数,仅仅将inline放在函数声明前面不起作用。
inline的展开与否是由编译器决定,inline只是告诉编译器,这个函数可以被展开。
对于const,写作常量,读作只读。建议将其理解为只允许程序去读,说白了就是不能变。
而volatile是说这变量可能会被意想不到地改变,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
linux
这块问的就很杂了,基本把基础知识过了一个遍,我就把问题都记录一下。
- 内核空间与用户空间
- 自旋锁,互斥锁,信号量,顺序锁。自旋锁单CPU和多CPU有啥区别,交叉着中断方面的知识。
- platform总线
- 说一个你熟悉的硬件总线(i2c,usb等),并简述下在linux驱动中的相关模型。
- kmalloc,vmalloc。配合着高端内存、线性区的知识回答。
- 中断下半部的三种机制
- contain_of
- RCU
- 有没有遇见硬件问题导致死机?怎么解决?
还有其他的没记住,当时问的忒多了,怼了一个小时。其中涉及到临界区和临界资源方面的问题,都要配合中断和抢占(进程调度相关知识)进行理解。
进程的话我整理了一个框图,基于5.4内核,有兴趣的可以看看。基于陈华才的《用芯探核》写的读书笔记。