对于很多问题的答案,部分从网络上拿过来,或者是在书上看到的,也包括自学的一部分内容。有错误可以提出。
有些是面试中经常遇到的,但就是记不住,没有深刻理解。不断更新中。。。。。
1.简述ARM指令和Thumb指令(大疆)
解答:在ARM的体系结构中,可以工作在三种不同的状态,一是ARM状态,二是Thumb状态及Thumb-2状态,三是调试状态。而ARM状态和Thumb状态可以直接通过某些指令直接切换,都是在运行程序,只不过指令长度不一样而已。
ARM状态:arm处理器工作于32位指令的状态,所有指令均为32位;
Thumb状态:arm执行16位指令的状态,即16位状态;
thumb-2状态:这个状态是ARM7版本的ARM处理器所具有的新的状态,新的thumb-2内核技术兼有16位及32位指令,实现了更高的性能,更有效的功耗及更少地占用内存。总的来说,感觉这个状态除了兼有arm和thumb的优点外,还在这两种状态上有所提升,优化;
调试状态:处理器停机时进入调试状态。
也就是说:ARM状态,此时处理器执行32位的字对齐的ARM指令;Thumb状态,此时处理器执行16位的,半字对齐的THUMB指令。
几个注意点:
ARM处理器复位后开始执行代码时总是只处于ARM状态;
Cortex-M3只有Thumb-2状态和调试状态;
由于Thumb-2具有16位/32位指令功能,因此有了thumb-2就无需Thumb了。
另外,具有Thumb-2技术的ARM处理器也无需再ARM状态和Thumb-2状态间进行切换了,因为thumb-2具有32位指令功能。
2.下面代码片段中有哪些隐患或者错误(云从)
void *get1(){
char buf[12] = {“abc”};
return buf;
}
void get2(int *p){
p = new int[10];
}
int main(){
int *m;
get2(m);
m = get1();
memcpy(m, “aaa”, 3);
return 0;
}
1.首先调用get2(m)的时候,因为是值传递,无法修改m的实际值,即无法将new申请的内存地址传出。
2.再者调用get1(m)的时候,函数内定义的数组是局部变量,对应的内存在这个函数结束的时候就会被释放,因此返回的地址是无效的,调用这样的地址造成严重错误。
3.最后调用memcpy(m,“aaa”,3)往一个没有权限的无效内存空间拷贝数据是非法的。
如果函数的参数是指针,避免用该指针去动态申请内存。如果想用记得使用二级指针。(云从面试)
3.简述SPI IIC UART接口的区别和各自收发数据的方法(大疆)
1、名字上的区别:
SPI: (Serial Peripheral Interface),串行外设接口
IIC: (INTER IC BUS),IC之间的总线
UART: (Universal Asynchronous Receiver Transmitter),通用异步收发器
2、电气信号上的区别
A.SPI总线主要由三条信号线组成:串行时钟(SCLK)、串行数据输出(SDO)、串行数据输入(SDI)。SPI总线可以实现多个SPI设备互相连接。主从设备可以实现全双工通信,当有多个从设备是,还可以增加一条从设备选择线。
B.IIC总线是双向、两线(SCL、SDA)、串行、多控接口标准,具有总线仲裁机制,非常适合器件之间近距离、非经常性的数据通信。
C.UART总线是异步串口,一般由波特率产生器、UART接收器、UART发送器组成,硬件上有两根线,发送与接收各占一根线。
3、SPI和UART可以实现全双工,但是IIC不行。
1.UART是全双工通信方式,两根数据线RX和TX,通信时双方需要共地,数据的传输速度由波特率决定,所以每位数据的收发完全依靠精确的时间来控制。
2.IIC总线是半双工通信方式,支持一个主机多个从机,在通信时主机必须固定,通过地址来区分从机,两根数据线SCL,SDA,数据的收发依靠时钟线进行控制。 3.SPI总线是全双工通信方式,支持一个主机多个从机,通信是主机可以发生改变,是真正的多主机总线,4跟数据线,CS,MISO,MOSI,SCL,通过片选线来控制与哪个从机进行通信,通过时钟线控制数据收发。
4.简述static关键字对于工程模块化的作用(阿里,华为,支付宝)
解答:static主要定义全局静态变量、局部静态变量、静态函数。
定义全局静态变量,有以下特点:在全局数据区分配内存。如果没有初始化,其默认值为0.该变量在文件内从定义开始到文件结束可见。
局部静态变量:该变量在全局数据区分配内存,如果不显示初始化,那么将被隐式初始化为0,它始终驻留在全局数据区,直到程序运行结束,其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。
定义静态函数:静态函数只能在本源文件中使用,在文件作用域中声明的inline函数默认为static类型 。
Extern:将变量和函数声明为外部链接,仅仅是一个变量的声明,其并不是定义,因为不会分配内存空间。定义多次的话会报错。
5.复位电路的原理(诺瓦)
6.TCP和UDP的区别?(诺瓦)
1)UDP是无连接的,即发送数据之前不需要建立连接。
2)UDP使用尽最大努力交付,即不保证可靠交付,同时也不能使用拥塞控制。
3)UDP是面向报文的,UDP没有拥塞控制,很适合多媒体通信要求。
4)UDP支持1对1,1对多,多对1和多对多的交互通信。
5)UDP的首部开销小,只有8个字节。
6)TCP是面向连接的运输层协议
7)每一条TCP连接智能有两个端点,每一条TCP连接只能是点对点
8)TCP提供可靠的交付的服务
9)TCP提供全双工通道
10)TCP是面向字节流的
11)首部最低20字节
7.试描述TCP建立和断开连接时的三次握手和四次挥手(阿里)
网上更详细
8.打开一个网站的时候,发生了什么(小米)
- 在浏览器里输入要网址:
- 浏览器查找域名的 IP 地址
- 浏览器给 web 服务器发送一个 HTTP 请求
- facebook 服务的永久重定向响应
- 浏览器跟踪重定向地址
- 服务器“处理”请求
- 服务器发回一个 HTML 响应
- 浏览器开始显示 HTML
- 浏览器发送获取嵌入在 HTML 中的对象
- 浏览器发送异步(AJAX)请求
9.子进程 父进程(诺瓦,大疆)
子进程继承父进程
○ 用户号 UIDs 和用户组号 GIDs
○ 环境 Environment
○ 堆栈
○ 共享内存
○ 打开文件的描述符
○ 执行时关闭(Close-on-exec)标志
○ 信号(Signal)控制设定
○ 进程组号
○ 当前工作目录
○ 根目录
○ 文件方式创建屏蔽字
○ 资源限制
○ 控制终端
子进程独有
○ 进程号 PID
○ 不同的父进程号
○ 自己的文件描述符和目录流的拷贝
○ 子进程不继承父进程的进程正文(text),数据和其他锁定内存(memory locks)
○ 不继承异步输入和输出
● 父进程和子进程拥有独立的地址空间和 PID 参数。
● 子进程从父进程继承了用户号和用户组号,用户信息,目录信息,环境(表),打开的
文件描述符,堆栈,(共享)内存等。
● 经过 fork()以后,父进程和子进程拥有相同内容的代码段、数据段和用户堆栈,就像父
进程把自己克隆了一遍。事实上,父进程只复制了自己的 PCB 块。而代码段,数据段和用
户堆栈内存空间并没有复制一份,而是与子进程共享。只有当子进程在运行中出现写操作
时,才会产生中断,并为子进程分配内存空间。由于父进程的 PCB 和子进程的一样,所以
在 PCB 中断中所记录的父进程占有的资源,也是与子进程共享使用的。这里的“共享”一词
意味着“竞争”
● 父进程和子进程拥有独立的地址空间和 PID 参数,所以子进程不会继承父进程的地址空
间
● 子进程与父进程的区别在于:
1、父进程设置的锁,子进程不继承(因为如果是排它锁,被继承的话,矛盾了)
2、各自的进程 ID 和父进程 ID 不同
父进程和子进程拥有独立的地址空间和 PID 参数
3、子进程的未决告警被清除;
4、子进程的未决信号集设置为空集。
10.孤儿进程和僵尸进程(CVTE)
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为
孤儿进程。孤儿进程将被 init 进程(进程号为 1)所收养,并由 init 进程对它们完成状态收集
工作。
僵尸进程:一个进程使用 fork 创建子进程,如果子进程退出,而父进程并没有调用 wait 或
waitpid 获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称
之为僵死进程。