(一)虚拟地址
(1)虚拟地址空间
虚拟地址:当创建一个变量等情况,所使用的地址(&)都是虚拟地址,内核会将此虚拟地址和真正的物理地址放入一个一对一
目录
的内存映射表中。
(&a→a的虚拟地址→内存映射表→物理地址)
虚拟地址空间:虚拟地址所存在的范围,表示程序的寻址能力。
32位系统:虚拟地址范围:0x00000000到0xFFFFFFFF(4G的范围)
其中0~3G-1的范围归用户使用,3G~4G-1的范围归内核使用
64位系统:
用户地址范围:0x0000 0000 0000 0000~0x0000 FFFF FFFF FFFF
内核地址范围:0xFFFF 0000 0000 0000~0xFFFF FFFF FFFF FFFF
(2)虚拟地址空间布局
不同性质的变量,操作系统给划分虚拟地址的时候会给划分到不同的区域
地址由高到低(代码区地址最小,参数和环境区地址最大)
字面值常量是字符串的地址,可执行指令可以是函数等。
(3)内存映射的建立与解除
没有与物理地址建立映射关系的虚拟地址无法直接使用,所以可以通过mmap函数去手动建立虚拟地址和物理地址的映射关系。
mmap函数:先创建一个物理地址,然后给出该物理地址和虚拟地址的映射关系,返回值为映射区虚拟内存的首地址。
Void* mmap(void* start,size_t_length,int port,int flags,int fd,off_t offset);
(该函数在:#include<sys/mman.h>的头文件里面)
参数:start:映射区虚拟空间的首地址,一般情况写NULL。
Length:映射区的字节数,自动按页分配(一页是4096个字节)。
Prot:映射区操作权限,取值为:
PROT_READ -映射区可读
PROT_WRITE -映射区可写
Flags:映射标志,取值为:
MAP_ANONYMOUS -匿名映射,将虚拟地址内存映射到物理内存而 非文件,忽略fd和offset参数。
MAP_PRIVATE -对映射区的写操作只反映到缓冲区中并不会真正写 入文件
MAP_SHARED -对映射区的写操作只反映到文件中
MAP_FIXED -若在start上无法创建映射,则失败
注:(MAP_PRIVATE和MAP_SHARED必须二选一,且要加MAP_ANONYMOUS)
Fd:文件描述符。
Offset:文件偏移量,自动按页(4k)对齐。
munmap函数:解除虚拟内存到物理内存的磁盘映射关系。(成功返回0,失败返回-1)
Int munmap(void* start,size_t length);
参数:
Start:映射区虚拟空间的首地址。
Length:映射区字节数,自动按页取整。
(二)文件系统
(1)文件的存储
文件存储在磁盘之中,通过i节点+数据块的方式进行存储。
数据块:用于存储文件的内容数据。
i节点:文件的基本信息+数据块的索引。
i节点(索引节点index node,inode)包括:
①文件的类型和权限
②文件的硬链接数
③文件的用户和组
④文件的字节大型
⑤文件的最后访问时间、最后修改时间和最后状态改变时间
⑥文件数据块索引表
(2)文件的打开与关闭
①文件的打开
int open(char const* pathname,int flags,mode_t mode);
(注:使用时需添加头文件:#include<fcntl.h>)
功能:打开已有的文件获创建新文件
参数:pathname -文件路径
flags -文件的状态标志,取值为:
O_RDONLY -只读
O_WRONLY -只写
O_RDWR -读写
O_APPEND -追加
O_CREAT -不存在即创建,已存在即打开
O_EXCL -不存在即创建,已存在即报错
O_TRUNC -不存在即创建,已存在即清空
mode -权限模式,取值为:8进制的数,0abc(其中a代我,b代表同组人员,c代表用户,读取值为4;写取值为2;运行取值为1)即如果想让所有人都可以读写运行则mode值为:0777。
返回值:返回的是一个文件的描述符,且是当前未被使用的。
eg:mode为0764代表自己可以读写运行,同组人员只能读写,用户只能读
注:O_CREAT与O_EXCL(O_TRUNC)一定是配合使用,且前三个参数必须选一个
eg:open(./a.txt, O_RDWR | O);
②文件的关闭
int close(int fd);
(注:使用时需添加头文件:#include<unistd.h>)
功能:关闭文件
参数:fd -打开文件时所生成的文件描述符
返回值:成功返回0,失败返回-1.