Linux系统学习笔记(第四天)

虚拟内存

每个进程都有各自独立的4G字节的虚拟地址空间,我们在编程时使用的永远都是这4G的虚拟地址空间中的地址。永远无法直接访问物理地址。
操作系统不让程序直接访问物理内存而只能使用虚拟地址空间,一方面为了操作系统自身的安全,另一方面可以让程序使用到物理内存更大的地址空间(把硬盘上的特殊文件)
4G的虚拟地址空间被分为两个部分:
	0~3G 	为用户空间
	3G~4G 	为内核空间
注意:用户空间的代码不能直接访问内核空间的代码和数据,但可以通过系统调用(不是函数,但以函数形式调用)进入到内核态,间接的与内核交换数据。
	如果使用了没有映射过的虚拟内存地址,或者访问了没有权限的虚拟内存地址,就会产生段错误(非法内存访问)。
	一个进程对应一个用户空间,进程一旦切换,用户空间也会发生变化,内核空间由操作系统管理,它不会随着进程的切换而变化,内核空间由内核所管理的一张独立且唯一的init_mm表进行内存映射,而用户空间的表是每个进程一张。
	每个进程的内存空间完全独立,不同的进程间交换虚拟内存地址没有任何意义,所以进程之间不能直接进行通信。需要由内核中转、协调。
	虚拟内存到物理内存的映射以页为单位,(一页等于4k=4096字节)。

内存管理API

它们都可以进行映射内存和取消映射(系统级的内存管理)。
void *sbrk(intptr_t increment);
increment:
	0	获取未分配前的内存首地址(也就是已分配内存尾地址)
	>0	增加内存空间
	<0	释放内存空间
返回值:未分配前的内存首地址,以字节为单位。
int brk(void *addr);
功能:设置未分配内存的首地址
返回值:成功返回0,失败返回-1
它们背后维护着一个指针,该指针记录的是未分配的内存的首地址(当前堆内存的最后一个字节的下一个位置)。
它们都有进行映射内存和取消映射的功能(系统级的内存管理),但为了方便起见,sbrk一般用于分配内存,brk用于释放内存。
注意:sbrk/brk分配和释放的都是使用权,真正的映射工作由其它系统调用完成(mmap/munmap);
#include<sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
功能:把虚拟内存地址与物理内存或文件建立映射关系。
addr:要映射的虚拟内存地址,如果为NULL操作系统会自动选择一个虚拟地址与物理内存映射。
length:要映射的字节数
prot:权限
flags:映射标志
fd:文件描述符(与内存映射没有关系)
offset:文件映射偏移值
返回值:映射成功后的虚拟内存地址,如果出错返回值为0xffffffff。
int munmap(void *addr, size_t length);
功能:取消映射
addr:需要取消映射的内存首地址
length:需要映射的字节数
返回值:成功返回0,失败返回-1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值