linux驱动开发--内核空间中内存的申请与释放

简介: <p>1、Linux内存管理</p> <p>linux内存最小管理单位为页(page),通常一页为4kb。<br> linux系统中,在初始化时,内核为每个物理内存页建立一个page的管理结构,操作物理内存时实际上就是操作page页。<br></p> <p>物理地址:出现在cpu地址总线上的寻址物理内存的地址信号,是地址变换的最终结果。<br> 线性地址(虚拟地址):在32位cpu

1、Linux内存管理

linux内存最小管理单位为页(page),通常一页为4kb。
linux系统中,在初始化时,内核为每个物理内存页建立一个page的管理结构,操作物理内存时实际上就是操作page页。

物理地址:出现在cpu地址总线上的寻址物理内存的地址信号,是地址变换的最终结果。
线性地址(虚拟地址):在32位cpu架构上,可以表示4G的地址空间,也就是0x00000000-0xFFFFFFFF。
逻辑地址:实际上是一个相对地址,是程序代码经过编译之后在汇编程序中出现的地址。


linux内核地址转换:出现在机器语言指令(程序编译后得到的二进制机器码序列)中的内存地址都是逻辑地址,逻辑地址必须被转换为线性地址,MMU将线性地址转换成物理地址,最终实现对应物理内存的访问。在linux系统中,逻辑地址和线性地址(虚拟地址)是一致的。

2、实例代码

/**
*Copyright (c) 2013.TianYuan
*All rights reserved.
*
*文件名称: kernelspace.c
*文件标识: 内核空间中内存的申请与释放
*
*当前版本:1.0
*作者:wuyq 
*
*取代版本:xxx
*原作者:xxx
*完成日期:2013-11-18
*/
#include <linux/init.h>
#include <linux/module.h>

#include <linux/fs.h>
#include <linux/slab.h>
#include <linux/vmalloc.h>

MODULE_LICENSE("GPL");
#define	PAGE_NUM	4/*编码幻数*/

unsigned char *kernelkmalloc = NULL;
unsigned char *kernelpagemem = NULL;
unsigned char *kernelvmalloc = NULL;

static int __init kernelspace_init(void)
{
	int ret = -ENOMEM;
	/*
	*GFP_KERNEL:分配内存,分配过程中可能导致睡眠。
	*GFP_ATOMIC:分配过程中不会导致睡眠。
	*GFP_DMA:申请到的内存通常情况下,位于0~16M之间
	*__GFP_HIGNMEM:申请高端内存(物理地址896M以上的)
	*/
	kernelkmalloc = (unsigned char *)kmalloc(100, GFP_KERNEL);
	if(IS_ERR(kernelkmalloc)){
		printk("kmalloc failed!\n");
		ret = PTR_ERR(kernelkmalloc);
		goto failure_kmalloc;
	}
	printk("kmalloc space :0x%lx!\n",(unsigned long)kernelkmalloc);
	
	kernelpagemem = (unsigned char *)__get_free_pages(GFP_KERNEL, PAGE_NUM);/*请求或释放的页数的2的幂*/
	if(IS_ERR(kernelpagemem)){
		printk("get_free_pages failed!\n");
		ret = PTR_ERR(kernelpagemem);
		goto failure_get_free_pages;
	}
	printk("get_free_pages address:0x%lx\n",(unsigned long)kernelpagemem);
	
	kernelvmalloc = (unsigned char *)vmalloc(1024*1024);
	if(IS_ERR(kernelvmalloc)){
		printk("vmalloc failed!\n");
		ret = PTR_ERR(kernelvmalloc);
		goto failure_vmalloc;
	}
	printk("vmalloc address: 0x%lx\n",(unsigned long)kernelvmalloc);
	return 0;
failure_vmalloc:
	free_pages((unsigned long)kernelpagemem, PAGE_NUM);
failure_get_free_pages:
	kfree(kernelkmalloc);
failure_kmalloc:
	return ret;
}

static void __exit kernelspace_exit(void)
{
	vfree(kernelvmalloc);
	free_pages((unsigned long)kernelpagemem, PAGE_NUM);
	kfree(kernelkmalloc);
}

module_init(kernelspace_init);
module_exit(kernelspace_exit);

KERNELDIR ?=/root/Desktop/work/ldd3/linux-2.6.31_TX2440A
PWD := $(shell pwd)
obj-m += kernelspace.o

default:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

clean:
	@rm -f *.o *.ord* *.sy* *.mod.* *.ko



目录
相关文章
|
18天前
|
缓存 监控 Linux
Linux内存问题排查命令详解
Linux服务器卡顿?可能是内存问题。掌握free、vmstat、sar三大命令,快速排查内存使用情况。free查看实时内存,vmstat诊断系统整体性能瓶颈,sar实现长期监控,三者结合,高效定位并解决内存问题。
66 0
Linux内存问题排查命令详解
|
9月前
|
缓存 Linux
linux 手动释放内存
在 Linux 系统中,内存管理通常自动处理,但业务繁忙时缓存占用过多可能导致内存不足,影响性能。此时可在业务闲时手动释放内存。
440 17
|
5月前
|
缓存 Linux 数据安全/隐私保护
Linux环境下如何通过手动调用drop_caches命令释放内存
总的来说,记录住“drop_caches” 命令并理解其含义,可以让你在日常使用Linux的过程中更加娴熟和自如。
1063 23
|
7月前
|
监控 Linux Python
Linux系统资源管理:多角度查看内存使用情况。
要知道,透过内存管理的窗口,我们可以洞察到Linux系统运行的真实身姿,如同解剖学家透过微观镜,洞察生命的奥秘。记住,不要惧怕那些高深的命令和参数,他们只是你掌握系统"魔法棒"的钥匙,熟练掌握后,你就可以骄傲地说:Linux,我来了!
243 27
|
8月前
|
消息中间件 Linux
Linux中的System V通信标准--共享内存、消息队列以及信号量
希望本文能帮助您更好地理解和应用System V IPC机制,构建高效的Linux应用程序。
300 48
|
8月前
|
缓存 NoSQL Linux
Linux系统内存使用优化技巧
交换空间(Swap)的优化 禁用 Swap sudo swapoff -a 作用:这个命令会禁用系统中所有的 Swap 空间。swapoff 命令用于关闭 Swap 空间,-a 参数表示关闭 /etc/fstab 文件中配置的所有 Swap 空间。 使用场景:在高性能应用场景下,比如数据库服务器或高性能计算服务器,禁用 Swap 可以减少磁盘 I/O,提高系统性能。
303 3
|
8月前
|
缓存 Linux
Linux查看内存命令
1. free free命令是最常用的查看内存使用情况的命令。它显示系统的总内存、已使用内存、空闲内存和交换内存的总量。 free -h • -h 选项:以易读的格式(如GB、MB)显示内存大小。 输出示例: total used free shared buff/cache available Mem: 15Gi 4.7Gi 4.1Gi 288Mi 6.6Gi 9.9Gi Swap: 2.0Gi 0B 2.0Gi • to
613 2
|
3月前
|
存储
阿里云轻量应用服务器收费标准价格表:200Mbps带宽、CPU内存及存储配置详解
阿里云香港轻量应用服务器,200Mbps带宽,免备案,支持多IP及国际线路,月租25元起,年付享8.5折优惠,适用于网站、应用等多种场景。
928 0
|
3月前
|
存储 缓存 NoSQL
内存管理基础:数据结构的存储方式
数据结构在内存中的存储方式主要包括连续存储、链式存储、索引存储和散列存储。连续存储如数组,数据元素按顺序连续存放,访问速度快但扩展性差;链式存储如链表,通过指针连接分散的节点,便于插入删除但访问效率低;索引存储通过索引表提高查找效率,常用于数据库系统;散列存储如哈希表,通过哈希函数实现快速存取,但需处理冲突。不同场景下应根据访问模式、数据规模和操作频率选择合适的存储结构,甚至结合多种方式以达到最优性能。掌握这些存储机制是构建高效程序和理解高级数据结构的基础。
262 1

热门文章

最新文章