嵌入式面经篇十——驱动开发

文章目录

  • 前言
  • 一、驱动开发
    • 1、Linux 驱动程序的功能是什么?
    • 2、内核程序中申请内存使用什么函数?
    • 3、内核程序中申请内存和应用程序时申请内存有什么区别?
    • 4、自旋锁和信号量在互斥使用时需要注意什么?在中断服务程序里面的互斥是使用自旋锁还是信号量?
    • 5、驱动卸载异常可能是由什么原因引起的?
    • 6、Linux 中引入模块机制有什么好处?
    • 7、Linux 设备驱动程序中,使用哪两个函数进行中断处理程序的注册和注销?
    • 8、写一个中断服务程序需要注意哪些地方?
    • 9、Linux 系统打开设备文件,进程可能处于三种基本状态,如果多次打开设备文件,驱动程序应该实现什么?
    • 10、简述 static 对于工程模块化的作用。
    • 11、并发是什么?驱动里面为什么要有互斥控制?如何实现?
    • 12、Linux 内核有哪些同步方式?
    • 13、在一个多任务嵌入式系统中,有一个 CPU 可直接寻址的 32 位寄存器 REGn,地址为 0x1F000010,编写一个安全的函数将寄存器 REGn 的指定位反转?


前言

记录一些招聘公司在招聘嵌入式软件岗位时的一些问题,此文为第十篇。


一、驱动开发

1、Linux 驱动程序的功能是什么?

  • 对设备初始化和释放。
  • 进行内核与硬件的数据交互。
  • 检测和处理设备出现的错误。

2、内核程序中申请内存使用什么函数?

答:kmalloc()、kzalloc()、vmalloc()。
解读:

  • void *kmalloc(size_t size, gfp_t flags);
    • 申请连续的物理内存,这对于要进行 DMA 的设备十分重要,但大小不能超过 128KB,其中有 16B 是被页描述符占用了。
    • 较常用的 flag 有GFP_ATOMIC(分配内存的过程是一个原子过程)、GFP_KERNEL(正常分配内存)、GFP_DMA(给DMA控制器分配内存)。
    • 对应的内存释放函数为 void kfree(const void *objp)
  • void *kzalloc(size_t size, gfp_

你可能感兴趣的:(嵌入式软件面经,驱动开发)