网站建设工具哪个好,兰州网络推广优化怎样,广告设计公司属于什么行业,黄山旅游网页设计作业文章目录 前言一、驱动开发1、Linux 驱动程序的功能是什么#xff1f;2、内核程序中申请内存使用什么函数#xff1f;3、内核程序中申请内存和应用程序时申请内存有什么区别#xff1f;4、自旋锁和信号量在互斥使用时需要注意什么#xff1f;在中断服务程序里面的互斥是使用… 文章目录 前言一、驱动开发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_t flags); kzalloc() 相对 kmalloc() 只是额外增加了 __GFP_ZERO 标志除了申请内存外还会对申请到的内存内容清零。对应的释放函数也是 kfree()。 void *vmalloc(unsigned long size); 申请虚拟地址连续的内存空间但其对应的物理内存不一定连续因此对申请的内存大小没有限制。对应的内存释放函数为 void vfree(const void *addr)。注意vmalloc() 和 vfree() 可以睡眠因此不能在中断上下文调用。
3、内核程序中申请内存和应用程序时申请内存有什么区别
答内核中申请内存空间用的是函数 kmalloc、kzalloc、vmalloc应用程序申请内存用的函数是malloc。 解读
kmalloc/kzalloc 直接分配连续的物理地址虚拟地址也是连续的。vmalloc 分配连续的虚拟地址但物理地址不一定连续。分配时实际分配了物理内存不过这个物理内存页面是在公共的页表进行了映射并没有在本进程的页表进行映射当访问这段内存时触发 do_page_fault 异常缺页中断才完成页表的同步工作。malloc 是用户空间申请内存的方法分配连续的虚拟地址物理地址一般不会连续。在分配时并没有做实际物理页的分配动作实际分配物理页的动作是在 do_page_fault 异常缺页中断处理中完成的。
4、自旋锁和信号量在互斥使用时需要注意什么在中断服务程序里面的互斥是使用自旋锁还是信号量
使用自旋锁的进程不会睡眠 而使用信号量的进程会睡眠。中断服务程序使用的是自旋锁原因是中断服务程序处于中断上下文中断上下文是不参与调度的也就没有保护现场与恢复现场一旦睡眠就回不来了。
5、驱动卸载异常可能是由什么原因引起的
可能是因为有进程在使用该模块。
6、Linux 中引入模块机制有什么好处
应用程序在退出时可以不管资源的释放或者其他的清除工作而把这些任务交给模块退出函数(exit)。模块机制有助于缩短模块的开发周期因为模块的安装和卸载都很方便。
7、Linux 设备驱动程序中使用哪两个函数进行中断处理程序的注册和注销
注册中断int request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long flag, const char *dev_name, void *dev_id); 参数的意义依次是中断号中断处理函数中断管理有关掩码中断请求设备名中断信号线。注销中断void free_irq(unsigned int irq, void *dev_id);参数的意义分别是中断号和中断信号线。
8、写一个中断服务程序需要注意哪些地方
中断服务程序应该尽可能短把能放在底半部tasklet、workqueue的任务尽量放在底半部。中断服务程序中不能有阻塞操作因为中断期间是完全占用 CPU 的不存在内核调度中断被阻塞住其他进程将无法推进。中断服务程序的返回值要用操系统定义的宏而不能用自己定义的。中断服务程序不能有不可重入的操作如浮点数计算、printf() 等。
9、Linux 系统打开设备文件进程可能处于三种基本状态如果多次打开设备文件驱动程序应该实现什么
互斥。
10、简述 static 对于工程模块化的作用。
static 可以让全局变量或函数的作用域限制在当前模块不会与其他模块发生冲突。因为在嵌入式系统中一个程序可能是很多程序员共同完成的在定义变量及函数的过程中可能会重命名给系统集成带来麻烦。
11、并发是什么驱动里面为什么要有互斥控制如何实现
并发是指多个执行单元同时、并行地被执行而并发的执行单元对共享资源硬件资源和软件上的全局变量、静态变量的访问很容易导致竞态。解决竞态问题的途径是保证对共享资源的互斥访问。访问共享资源的代码区域被称为临界区临界区需要用某种互斥机制加以保护中断屏蔽、原子操作、信号量、自旋锁都是 Linux 设备驱动中可以采取的互斥机制。
12、Linux 内核有哪些同步方式
原子操作、信号量、自旋锁、读写锁、顺序锁等。
13、在一个多任务嵌入式系统中有一个 CPU 可直接寻址的 32 位寄存器 REGn地址为 0x1F000010编写一个安全的函数将寄存器 REGn 的指定位反转
答
void bit_reverse(uint32_t nbit)
{ *((volatile unsigned int *)0x1F000010) ^ (0x01 nbit);
} 注意
指定位反转用异或 ^。由于是寄存器地址因此强制类型转换的时候要加上 volatile。 我的qq2442391036欢迎交流