Linux通过伙伴系统申请内核内存的函数有哪些?
封面图
•
2025-10-29
•
Linux
108
0
0
0
在 Linux 内核中,**伙伴系统(Buddy System)** 是用于管理物理内存页的机制,主要用于分配和释放连续的物理内存块。Linux 内核提供了多个函数来通过伙伴系统申请或释放内存。以下是一些常用的与伙伴系统相关的内核内存申请函数: --- ### ✅ 1. `kmalloc()` 虽然 `kmalloc()` 不直接使用伙伴系统,但它内部会调用伙伴系统来获取大块内存。 - **功能**:分配指定大小的内存块,适用于一般内核对象。 - **参数**: ```c void *kmalloc(size_t size, gfp_t flags); ``` - **flags**:通常使用 `GFP_KERNEL`、`GFP_ATOMIC` 等标志。 - **注意**:对于大于 `PAGE_SIZE` 的请求,`kmalloc()` 会使用伙伴系统分配多个页。 --- ### ✅ 2. `__get_free_pages()` 这是直接使用伙伴系统分配连续物理页的函数。 - **功能**:分配连续的物理内存页(以页为单位)。 - **参数**: ```c unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order); ``` - **order**:表示分配的页数是 2^order 个页(例如 order=0 表示 1 页,order=1 表示 2 页)。 - **返回值**:返回第一个页的物理地址(虚拟地址需要通过 `virt_to_phys()` 或 `page_address()` 转换)。 > ⚠️ 注意:这个函数返回的是物理地址,不是虚拟地址,使用时需特别小心。 --- ### ✅ 3. `alloc_pages()` 这是更底层的伙伴系统接口,用于分配页面。 - **功能**:分配一个或多个连续的物理页。 - **参数**: ```c struct page *alloc_pages(gfp_t gfp_mask, unsigned int order); ``` - **返回值**:返回指向第一个 `struct page` 的指针。 - **用途**:常用于需要操作 `struct page` 的场景,比如设备驱动、内存管理模块等。 --- ### ✅ 4. `alloc_page()` 这是 `alloc_pages()` 的简化版本,只分配一页。 - **功能**:分配一页物理内存。 - **参数**: ```c struct page *alloc_page(gfp_t gfp_mask); ``` --- ### ✅ 5. `__free_pages()` 释放由 `__get_free_pages()` 或 `alloc_pages()` 分配的内存。 - **功能**:释放连续的物理页。 - **参数**: ```c void __free_pages(struct page *page, unsigned int order); ``` --- ### ✅ 6. `free_pages()` 这是一个封装函数,用于释放由 `__get_free_pages()` 返回的物理地址。 - **功能**:释放由 `__get_free_pages()` 分配的内存。 - **参数**: ```c void free_pages(unsigned long addr, unsigned int order); ``` --- ## 📌 总结:常用伙伴系统相关函数 | 函数名 | 是否直接使用伙伴系统 | 功能说明 | |--------------------|----------------------|--------------------------------------| | `kmalloc()` | 否 | 分配小块内存(内部可能使用伙伴系统) | | `__get_free_pages()` | 是 | 分配连续物理页(以页为单位) | | `alloc_pages()` | 是 | 分配连续物理页(返回 `struct page`) | | `alloc_page()` | 是 | 分配一页物理内存 | | `__free_pages()` | 是 | 释放由 `alloc_pages()` 分配的内存 | | `free_pages()` | 是 | 释放由 `__get_free_pages()` 分配的内存 | --- ## 🧠 小贴士: - 在内核中,`GFP_KERNEL` 适用于可以睡眠的上下文(如进程上下文),而 `GFP_ATOMIC` 适用于不能睡眠的上下文(如中断处理程序)。 - 如果你只需要分配一个页面,推荐使用 `alloc_page()` 或 `__get_free_page()`。 - 如果你需要分配多个连续的页面,使用 `alloc_pages()` 或 `__get_free_pages()`。 如果你有具体的使用场景(如驱动开发、内存池实现等),我可以提供更针对性的建议。
上一篇:
Linux用户进程间通信主要哪几种方式?
下一篇:
Linux 虚拟文件系统的关键数据结构有哪些?(至少写出四个)
标题录入,一次不能超过6条
留言
评论