22. 驱动开发与操作系统(52道)***1***
1.驱动开发(13道)
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 vfree(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自旋锁和信号量在
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
包含241道笔试面试真题详解,还有岗位及校招介绍,简历制作、笔试准备、面试准备的经验分享,以及嵌入式软件工程师技能树解读。你想知道的所有关于嵌入式求职的问题,几乎都可以在这里找到答案。 订阅即赠送学习笔记、简历模板、面试提纲模板、内推机会,需要的同学点击我头像私信即可!