西安邮电实验4.5-linux内存映射实现
1.首先简单熟悉一下mmap()系统调用,如下实现cat 功能:
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
char * addr;
int fd;
struct stat sb;
if(argc!=2 || strcmp(argv[1],"--help")==0)
printf("%s file\n",argv[0]);
fd = open(argv[1],O_RDONLY);
if(fd==-1)
printf("open");
if(fstat(fd,&sb)==-1)
printf("fstat");
addr=mmap(NULL,sb.st_size,PROT_READ,MAP_PRIVATE,fd,0);
if(addr==MAP_FAILED)
printf("mmap");
if(write(STDOUT_FILENO,addr,sb.st_size)!=sb.st_size)
printf("partial/failed write");
exit(EXIT_SUCCESS);
}
- 运行过程。
代码在gitee里都有:
1.sudo make
2.sudo insmod map_driver.ko
3.sudo mknod /dev/mapnopage c 240 0 //创建虚拟节点设备
3.运行示意图(重点在于不同进程共享VMM):