嵌入式工程师笔试题

时间:2022-04-10 08:35:56

1. linux内核里面,内存申请有哪几个函数,各自的区别?

 Kmalloc 连续物理内存

 vmalloc 虚拟内存连续 物理上非连续 

2. IRQ和FIQ有什么区别,在CPU里面是是怎么做的?

Irq 普通中断

FIQ 快速中断 有自己的寄存器,省去寄存器内容存储的时间。

3. 

int *a;

char *b;

和 b本身是什么类型?

本身应该为无符号长整个型

a、b里面本身存放的只是一个地址,难道是这两个地址有不同么? 

只是一个地址,只是指向的内容不同,一个指向整型,一个指令字符串

4. 中断的上半部分和下半部分的问题:

讲下分成上半部分和下半部分的原因,为何要分?讲下如何实现?

5. 内核函数mmap的实现原理,机制?

Mmap函数实现是把一个文件映射到一个内存区域,从而我们可以像读写内存一样读写文件,他比单纯调用read/write也要快上许多。在某些时候我们可以把内存的内容拷贝到一个文件中实现内存备份,当然,也可以把文件的内容映射到内存来恢复某些服务。另外,mmap实现共享内存也是其主要应用之一,mmap系统调用使得进程之间通过映射同一个普通文件实现共享内存。

6. 驱动里面为什么要有并发、互斥的控制?如何实现?讲个例子?

     并发(concurrency)指的是多个执行单元同时、并行被执行,而并发的执行单元对共 享资源(硬件资源和软件上的全局变量、静态变量等)的访问则很容易导致竞态(race conditions)。

      解决竞态问题的途径是保证对共享资源的互斥访问,所谓互斥访问就是指一个执行单元 在访问共享资源的时候,其他的执行单元都被禁止访问。

访问共享资源的代码区域被称为临界区,临界区需要以某种互斥机 制加以保护,中断屏蔽,原子操作,自旋锁,和信号量都是linux设备驱动中可采用的互斥途径。

7. spinlock自旋锁是如何实现的?

自旋锁在同一时刻只能被最多一个内核任务持有,所以一个时刻只有一个线程允许存在于临界区中。这点可以应用在多处理机器、或运行在单处理器上的抢占式内核中需要的锁定服务。 

8. 任务调度的机制?

9 framebuffer机制? 

Linux抽象出FrameBuffer这个设备来供用户态进程实现直接写屏。Framebuffer机制模仿显卡的功能,将显卡硬件结构抽象掉,可以通过Framebuffer的读写直接对显存进行操作。用户可以将Framebuffer看成是显示内存的一个映像,通过mmap将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节,这些都是由Framebuffer设备驱动来完成的。通过mmap调用把显卡的物理内存空间映射到用户空间