6.2 Linux 驱动开发 内核
一、内核中申请内存有哪几个函数?有什么区别?
1. kmalloc:分配的物理地址是连续的,一般只能分配 几百 KB
void *kmalloc(size_t size, gfp_t flags) // 示例:使用 __GFP_ZERO 标志分配并清零内存 void *ptr = kmalloc(512, GFP_KERNEL | __GFP_ZERO);
2. vmalloc:虚拟地址连续,但物理地址是离散的,可以分配上 G,可以申请大块内存。
void *vmalloc(unsigned long size)
3. dma_alloc_coherent:
主要是为了在 DMA 操作中确保数据在 CPU 和设备之间的正确传输与共享,具体如下:
- 保证数据一致性:在 DMA 数据传输时,它能确保 CPU 和设备访问的内存数据一致,避免因缓存等问题导致数据不一致的错误。
- 提供连续物理地址:许多 DMA 设备要求数据缓冲区的物理地址连续,该函数能满足这一要求,保证 DMA 设备可高效地进行数据传输。
void *dma_alloc_coherent(struct device *dev, size_t size, ma_addr_t *dma_handle, gfp_t gfp)
//struct device *dev:指向与 DMA 操作相关的设备结构体的指针。这个结构体包含了设备的各种信息,例如设备的硬件特性、总线类型等。内核会根据这个设备信息来确定如何分配适合该设备的内存。
//size_t size:需要分配的内存块的大小,以字节为单位。
//dma_addr_t *dma_handle:这是一个输出参数,函数会将分配的内存块对应的 DMA 地址存储在这个指针所指向的位置。DMA 地址是设备可以直接访问的地址,与 CPU 访问的虚拟地址可能不同。设备使用这个 DMA 地址来进行数据的读写操作。
//gfp_t gfp:分配内存时使用的标志,与 kmalloc 函数中的 gfp 标志类似。这些标志用于控制内存分配的行为,例如是否允许睡眠、从哪个内存区域分配等。常见的标志如 GFP_KERNEL 表示允许睡眠,GFP_ATOMIC 表示不允许睡眠。
4. ioremap
void * ioremap (unsigned long offset, unsigned long
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
C++/嵌入式开发 秋招面经 文章被收录于专栏
一名985硕,在25年秋招中斩获多个C++/嵌入式开发Offer。本专栏将分享我的面经,涵盖C/C++、操作系统、计算机网络、ARM体系与架构、Linux应用/驱动开发、Qt、通信协议及开发工具链等核心内容。