[务必收藏] Linux用户空间和内核空间所有15种内存分配方法总结

2025-01-09 282550 电脑数码

在linux操作系统中,内存管理被视为一个至关重要的系统功能。为了在用户空间和内核空间中有效地管理内存,分别使用了不同的函数来进行内存申请。以下是linux用户空间内存申请函数的详细列表:

1. malloc() 函数:

void* malloc(size_t size);

用于在堆区分配一块指定大小的内存空间。如果成功分配,返回一个指向这块内存的指针;否则,返回NULL。

2. calloc() 函数:

void* calloc(size_t num, size_t size);

分配并初始化为0的一块连续内存空间。它会为num个大小为size的对象分配内存,并将所有字节初始化为0。

3. realloc() 函数:

void* realloc(void* ptr, size_t new_size);

改变之前通过malloc()或calloc()等函数分配的内存块的大小。它可以扩大或缩小已分配的内存区域。如果内存无法重新分配,则返回NULL,原有的内存区域保持不变。

4. alloca() 函数(非标准库函数,某些编译器支持):

void* alloca(size_t size);

在栈上动态分配内存。它的优点是不需要手动释放,但缺点是可能导致栈溢出。

5. 使用静态存储区:

在程序开始时就为其分配了内存,由编译器自动管理,生命周期从程序开始到结束。

6. 使用全局变量和局部静态变量:

全局变量在整个程序运行期间都存在,而局部静态变量只在声明它们的函数或代码块退出后才被销毁。

请注意,在使用这些函数分配内存之后,必须确保在不再需要该内存时调用相应的内存释放函数来释放它,以避免内存泄漏。对于malloc()、calloc()和realloc()分配的内存,应使用free()函数进行释放。

Linux内核空间内存申请函数

1. kmalloc() 函数:

void *kmalloc(size_t size, gfp_t flags);

分配指定大小的连续物理内存块,并返回指向该内存块的指针。flags参数用于控制内存分配的行为和特性。

2. vmalloc() 函数:

void *vmalloc(unsigned long size);

分配虚拟内存,而不是连续的物理内存。分配的内存可能分布在多个物理页面上,但对进程来说是连续的。

3. get_free_pages()和 __get_free_page()函数:

unsigned long get_free_pages(gfp_t gfp_mask, unsigned int order);

unsigned long __get_free_page(gfp_t gfp_mask);

这两个函数分别用于分配特定数量的连续物理页(以2的幂为单位)和单个物理页。order参数表示需要多少个连续的页,例如order=0代表一页。

4. alloc_pages(), __alloc_pages():

struct page *alloc_pages(gfp_t gfp_mask, unsigned int order);

struct page *__alloc_pages(gfp_t gfp_mask, unsigned int order);

与get_free_pages()类似,这些函数用于分配一组连续的物理页,但它们返回一个指向struct page结构体的指针列表。

5. alloc_page(), __alloc_page():

struct page *alloc_page(gfp_t gfp_mask);

struct page *__alloc_page(gfp_t gfp_mask);

分配一个单独的物理页,返回一个指向struct page的指针。

6. dma_alloc_coherent():

void *dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flag);

在设备映射区域分配一块连续的物理内存,以便于DMA传输。分配的内存对于处理器来说是可直接访问的,并且确保不会被内核抢占或迁移。

7. kzalloc():

void *kzalloc(size_t size, gfp_t flags);

类似于kmalloc(),但在分配内存后将其所有字节初始化为0。

8. kfree():

void kfree(const void *ptr);

释放通过上述内核内存分配函数分配的内存。

9. 其他特殊的内存分配函数

如page_frag_cache()、__get_dma_pages()等,用于满足特定场景的需求。

请注意,在使用这些函数时,应根据具体需求选择适当的内存分配函数,并遵循正确的使用规则,避免内存泄漏或其他问题。

以上就是[务必收藏] Linux用户空间和内核空间所有15种内存分配方法总结的详细内容,更多请关注就爱读【www.biniku.com】其他相关内容。

谷歌空间如何通过二维码分享游戏给好友

支持PlayGames的游戏才能生成有效分享二维码,需先确认商店页面有“支持成就”等标识;再通过PlayGamesApp或Chrome浏览器生成24小时有效的二维码,扫码即可直达游戏页面。 想把谷歌空间(GooglePlayGames)里刚通关的关卡或高分截图快速发给好友,又不想手动复制一长串链接?用二维码分享能一步到位,对方手机一扫就打开游戏页面。 确认游戏是否支持PlayGames深度链接 不...

Mac系统怎么查看当前系统的确切内核版本

最简捷权威的方式是执行终端命令uname-r,直接输出Darwin内核确切版本号(如24.3.0),该值由内核自身声明,无需推断或查表,且与系统报告、sysctlkern.osproductversion及官方映射一致。 要确认当前Mac系统运行的Darwin内核确切版本号(例如24.3.0),必须获取由内核直接输出的原始标识字符串,而非仅依赖macOS用户界面显示的操作系统主版本;因为同一mac...

如何查看vivo浏览器当前正在使用的底层Webview内核版本号?

vivo浏览器实际调用的底层Webview内核版本需通过三种方式确认:1.访问https://liulanmi.com/labs/core.html直接检测;2.在系统设置中查看AndroidSystemWebView应用版本;3.从User-Agent字符串中提取Chrome/后的版本号。 要确认vivo浏览器当前实际调用的底层Webview内核版本,不能只看浏览器应用自身的版本号,因为vivo...

MacBook 出现“内核崩溃”自动重启怎么办?查看崩溃日志寻找原因【干货】

MacBook出现六国语言重启提示即KernelPanic,需通过控制台、终端命令、诊断报告及内核日志分析shutdowncause代码、唤醒日志和第三方驱动(如NemuDrv)定位根本原因。 如果您在MacBook上遭遇“因出现问题而重新启动”的六国语言提示,伴随自动重启现象,则极可能发生了内核崩溃(KernelPanic),其根本原因通常隐藏在系统自动生成的崩溃日志中。以下是直接定位崩溃诱因的...

谷歌空间如何安装适配X86架构的应用

核心在于应用必须包含x86或x86_64原生库;若缺失,即使设备为x86平台,Play商店也会拒绝安装或运行崩溃。需通过修改build.prop、清除Play数据、验证ABI及APK结构等步骤确保识别与兼容。 在谷歌空间(GooglePlay)中安装适配x86架构的应用,核心在于确保应用本身包含x86或x86_64原生库,而非仅提供ARM版本;若应用未内置对应ABI,即使设备是x86平台,Play...

Oracle数据库怎么创建表空间 Oracle表空间管理方法【教程】

应为新业务创建独立用户表空间,如users_data和temp_users,使用本地管理与自动段空间管理,并分配给app_user用户;需以SYS/SYSTEMASSYSDBA登录,确保数据文件路径存在且有写权限。 在Oracle数据库中为新业务分配独立存储区域,避免与SYSTEM、SYSAUX等系统表空间混用,防止用户对象挤占关键系统空间导致数据库异常。 以DBA身份连接到数据库实例 打开SQL...

修复Windows 11提示“此驱动程序无法在此设备上加载” 修复内核完整性

应关闭内存完整性、禁用易受攻击驱动程序阻止列表、用pnputil清理残留驱动包、在安全模式下重装驱动。该提示源于Win11内核完整性机制拦截未认证或过时驱动,上述四步可协同解决。 当你在Windows11中安装指纹识别器、USB-C扩展坞、老款打印机或自定义显卡驱动时,突然弹出“此驱动程序无法在此设备上加载”提示,说明系统内核完整性机制已主动拦截该驱动——它不是安装失败,而是被安全策略当场拒绝加载...

如何开启 Windows 11 的“内核隔离”保护 提高系统内存完整性安全性设置

内存完整性不可用需排查硬件虚拟化、驱动冲突或策略锁定;可通过Windows安全中心、组策略(专业版及以上)或注册表(家庭版适用)三种方式启用,均须重启生效。 您需要在Windows11中启用“内核隔离”功能来防止恶意代码篡改系统核心进程,但设置界面中“内存完整性”开关显示为灰色不可用,或点击开启后提示不兼容、重启无效——这通常是因为硬件虚拟化未就绪、驱动冲突或系统策略锁定所致。 通过Windows...