嵌入式驱动 bsp工程师 笔试 面试题

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

(1)对设备初始化和释放。

(2)进行内核与硬件的数据交互。

(3)检测和处理设备出现的错误。


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

答案:kmalloc()、kzalloc()、vmalloc()。

解读:

(1)void *kmalloc(size_t size, gfp_t flags);

①申请连续的物理内存,这对于要进行DMA的设备十分重要,但大小不能超过128KB,其中有16B是被页描述符占用了。

②较常用的flag有GFP_ATOMIC(分配内存的过程是一个原子过程)、GFP_KERNEL(正常分配内存)、GFP_DMA(给DMA控制器分配内存)。

③对应的内存释放函数为void kfree(const void *objp)。

(2)void *kzalloc(size_t size, gfp_t flags);

①kzalloc()相对kmalloc()只是额外增加了__GFP_ZERO标志,除了申请内存外,还会对申请到的内存内容清零。

②对应的释放函数也是kfree()。

(3)void *vmalloc(unsigned long size);

①申请虚拟地址连续的内存空间,但其对应的物理内存不一定连续,因此对申请的内存大小没有限制。

②对应的内存释放函数为void free(const void *addr)。

③注意:vmalloc()和vfree()可以睡眠,因此不能在中断上下文调用。


1.3内核程序中申请内存和应用程序时申请内存有什么区别?

答案:内核中申请内存空间用的是函数kmalloc、kzalloc、vmalloc,应用程序申请内存用的函数是malloc。

解读:

(1)kmalloc/kzalloc直接分配连续的物理地址(虚拟地址也是连续的)。

(2)vmalloc分配连续的虚拟地址,但物理地址不一定连续。分配时实际分配了物理内存,不过这个物理内存页面是在公共的页表进行了映射,并没有在本进程的页表进行映射,当访问这段内存时,触发do_page_fault异常(缺页中断)才完成页表的同步工作。

(4)malloc是用户空间申请内存的方法,分配连续的虚拟地址,物理地址一般不会连续。在分配时并没有做实际物理页的分配动作,实际分配物理页的动作是在do_page_fault异常(缺页中断)处理中完成的。


1.4自旋锁和信号量在互斥使用时需要注意什么?在中断服务程序里面的互斥是使用自旋锁还是信号量?

(1)使用自旋锁的进程不会睡眠, 而使用信号量的进程会睡眠。

(2)中断服务程序使用的是自旋锁,原因是中断服务程序处于中断上下文,中断上下文是不参与调度的,也就没有保护现场与恢复现场,一旦睡眠就回不来了。

以上内容摘自专刊《嵌入式岗位笔试面试真题讲解》,该专刊不仅有真题讲解,还有经验分享,不清楚嵌入式该学什么的同学,想找嵌入式实习/正式工作的同学,都可以来看看:                




引流:   华为       小米         OPPO    、VIVO、    CVTE         大疆    、insta360影石、美的   TCL  小米   经纬恒润   、小鹏、图森未来   百度   滴滴、蔚来、理想、   联发科、紫光展锐   、全志、 寒武纪   晶晨半导体 、汇顶、华为   中兴   浪潮   TP-LINK、  讯飞、商汤、海康威视   、浙江 大华   、360。
#23届找工作求助阵地##软件开发薪资爆料##你们的毕业论文什么进度了##我的实习求职记录##驱动开发#
全部评论
来充实知识储备了
点赞
送花
回复
分享
发布于 2023-02-16 13:21 天津
来看看来看看
点赞
送花
回复
分享
发布于 2023-02-16 13:21 浙江
滴滴
校招火热招聘中
官网直投
多谢分享!狠狠需要了!
点赞
送花
回复
分享
发布于 2023-02-16 13:54 重庆
来看看大佬新的文章
点赞
送花
回复
分享
发布于 2023-02-16 19:29 四川
很有用,果断收藏了
点赞
送花
回复
分享
发布于 2023-02-17 09:05 湖北
感谢分享!学习了!
点赞
送花
回复
分享
发布于 2023-02-17 15:49 浙江
太厉害了
点赞
送花
回复
分享
发布于 2023-02-21 08:48 湖北
谢谢分享,已收藏!
点赞
送花
回复
分享
发布于 2023-02-21 09:38 湖北
多谢分享
点赞
送花
回复
分享
发布于 2023-02-21 18:25 四川
感谢分享
点赞
送花
回复
分享
发布于 2023-02-21 21:26 黑龙江
感谢分享
点赞
送花
回复
分享
发布于 2023-02-22 23:25 江西
干货满满,要抓紧学习了
点赞
送花
回复
分享
发布于 2023-02-23 09:36 广东
感谢分享,大佬专栏对学习和复习嵌入式知识很有帮助
点赞
送花
回复
分享
发布于 2023-02-23 13:25 四川
谢谢分享
点赞
送花
回复
分享
发布于 2023-02-24 09:05 江西
感谢分享
点赞
送花
回复
分享
发布于 2023-02-24 12:36 安徽

相关推荐

1. 页面置换算法有哪些?FIFO、LFU和LRU分别是如何工作的?2. 如何实现一个可以在任意时刻设置触发时间的定时器功能?3. 如何实现取消之前设置的定时器任务?4. 如何快速查找一个IP地址对应的天气信息?5. 如何编写一个程序判断计算机的字节序(大端还是小端)?6. 如何手写一个求素数的算法?7. 如何实现宏定义交换两个数的值?8. 如何将一个数字转换为字符串?9. 如何判断一段代码是否存在错误?10. 解释内存对齐的概念及其重要性。11. 进程和线程的区别是什么?12. 什么是优先级反转?如何解决优先级反转问题?13. 为什么内核区要放在虚拟内存的高位地址?14. 自旋锁的底层实现原理是什么?为什么自旋锁不能让线程睡眠?15. 操作系统中有哪些内核同步的方式?16. 如何避免多个线程抢占共享资源?17. 互斥锁的原理是什么?18. 如果有一个线程长时间占用资源,会产生什么问题?19. 操作系统如何管理物理地址空间?20. 如果向0地址写或读数据,操作系统会发生什么?21. 什么是局部性原理?它为什么能提高缓存命中率?22. 操作系统中常见的进程调度算法有哪些?各有什么优缺点?23. 用户态和内核态之间是如何切换的?24. 哪些进程间通信方式是单向的?哪些需要借助内核?25. 简要描述计算机的工作原理。26. STM32的选型依据有哪些?27. STM32有哪几种启动方式?28. ARM体系结构中常用的寄存器有哪些?29. 如何在中断函数中等待数据准备完成?30. BIOS的作用是什么?它如何引导后续的启动过程?问题总结在专栏  c++/嵌入式面经专栏-牛客网 https://www.nowcoder.com/creation/manager/columnDetail/MJNwoM
点赞 评论 收藏
转发
9 81 评论
分享
牛客网
牛客企业服务