1 .没有虚拟内存的CPU几乎不能运行多任务操作系统,不能支持多进程。
2 .实现虚拟内存的技术主要有两种:段内存管理和页内存管理,目前页内存管理占主流。
3 .基于页面的内存管理通过将内存划分为大小相同的页面,并由多个页面组成每个进程地址空间,实现了进程空间的隔离。
4。 为什么使用内存映射:读写文件的传统方法要求每次调用open-read/write/lseek-close时进行系统调用,但效率不高,多个进程访问同一文件这是徒劳的。 如果使用mmap将文件作为内存(如数组)进行操作,则没有这种问题。
Linux内存映射: Linux内核将整个内存地址空间视为一系列不同的“文件”映射,但在此将其称为内核对象。 Linux将内核加载到内存的过程是内存映射的过程,加载可执行文件的过程也是内存映射。
5.32位地址虚拟内存: 32位虚拟内存地址最多可以管理4G的物理地址。 32位虚拟地址分为三个部分。 页面目录|页面表|页面内偏移(10|10|12 )。 页面目录可以管理1024个页面表,页面表可以管理1024个页面。 )每1024页分成一个页面表,页面表地址放在页面目录的数组中。 1024页的地址将被放置在页表数组中)
6 .从虚拟地址到物理地址的转换可以应用很多。 进程和进程之间的虚拟地址可以相同,物理地址也可以不同,从而实现空间上的真正隔离。 可以利用页面交换技术将文件映射到存储器,实现mmap这样的系统调用; 通过将相同的虚拟地址转换为相同的物理地址,可以共享线程等数据。 可以在虚拟存储器中反映硬件设备的控制存储区,并通过存储器直接控制设备.
7 .内存映射的缺点
内存映射可能会浪费存储物理空间。 每次不同或相同的进程对同一文件调用mmap时,内存映射技术总是将新页面偏移为0的页面分配给进程,并且多次调用mmap写入的数据不连续。 每次调用mmap时写入的数据占4096的空间越多,浪费的空间就越多。
8.mmap系统调用
void*mmap(void*addr,size_t len,int prot,int flag,int filedes,off_t off );
intmunmap(void*addr,size_t len ); //释放地图
#包含
#包含
#包含
#包含
#包含
#包含
#包含
#包含
#define PAGE_SIZE 4096
(intmain(intargc,char *argv[] ) ) ) ) ) ) ) ) ) ) )
{
Int软盘;
int i;
未指定的char * p _ map;
//打开设备
FD=open(Liujin.txt )、O_RDWR );
是if(FD0 )
{
打印机(打开故障(n ) );
退出(1;
}
//内存映射
p _ map=(未指定的char * ) mmap(0,PAGE_SIZE,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0 );
if(p_map==map_failed ) )。
{
打印机(mmap故障(n ) );
goto here;
}
snprintf (p _ map 5,10,' bye!' );
//打印映射后内存的前10字节内容
for(I=0; i10; I )
printf(%c(n ),p_map[i];
here:
munmap(p_map,PAGE_SIZE );
返回0;
}
显示文件中的数据: od -tx1 -tc liujin.txt