学习笔记4
教材知识总结
7.1 文件操作级别
- 文件操作:分为5个级别(从高到低如下)
- 硬件级别:
fdisk(硬盘、U盘、sdc盘分区
mkfs:格式化磁盘分区,为系统做好准备
fsck:检查和维修系统
碎片整理:压缩文件系统中的文件
-
操作系统内核中的文件系统函数
-
系统调用
-
I/O库函数
-
用户命令
-
sh脚本
7.2 文件IO操作
- 用户模式、内核模式
-
读写文件
-
fopen在用户空间中创建FILE结构体,包含文件描述符fd,一个fbuf和一些控制变量,会像内核中的kopen发出一个fd的系统调用,创建一个opentable来表示打开文件实例
-
fread:将nitem个size字节读取到ubuf上,若数据足够则返回,若不够则发出read系统调用读取文件数据块到ubuf,直到足够
-
fwirite:将数据从ubuf复制到fbufs
-
fd:是运行进程的fd数组中的一个索引,指向一个表示打开文件的opentable
7.3 低级别文件操作
- 分区:各分区可以格式化特定的文件系统,也可以安装在不同的操作系统上
-
分区表:位于第一个扇形的字节偏移446处,称为主引导记录,表有四个条目,每个条目由一个16字节的分区结构体定义
-
扩展分区链表:每个扩展分区是一个本地MBR,第一个条目定义了起始扇区和大小,第二个条目指向下一个本地MBR
- 格式化分区:在linux中,被称为mkfs,表示Make文件系统
- 创建TYPE文件系统
mkfs -t TYPE [-b bsize] device nblocks
-
必须挂载到根文件系统中的现有目录中,因为虚拟文件系统不是真正的设备
-
使用完成后,将cd从/mnt中取出输入
sudo umount vdisk
卸载设备
- 挂载分区
- man/losetup:显示用于系统管理的实用工具命令:
用dd命令创建一个虚拟磁盘映像
用vdisk上运行fdisk来创建一个分区p1:
使用以下扇区数在vdisk的分区1上创建一个循环设备
格式化
挂载循环设备
访问作为文件系统一部分的挂载设备
设备使用完成,将其卸载
断开
8.1 系统调用
-
内核模式K和用户模式U:Umode(进程权限非常有限)Kmode(特殊权限操作)
-
系统调用:syscall 允许进程进入k以执行u不允许操作的机制
- 手册页:要描述以上参数,否则会因函数名称类型不匹配发出许多警告
8.2 系统调用进行文件操作
- 每个系统调用就像一个库函数,汇集系统调用参数,并最终向操作系统内核发出一个系统调用
int syscall(int a,int b,int c,int d)
-
第一个参数:a是系统调用编号,bcd是对应内核函数的参数
-
linux:系统调用是由汇编指令实现,将CPU从用户模式切换到内核模式,进程结束在返回
-
简单系统调用
- 常用系统调用
-
链接文件:不同路径名来表示同一个文件,这些文件叫LINK,分为硬链接和软连接
-
硬链接:
ln oldpath newpath
对应系统调用link,不能创建循环 -
软连接:
ln -s oldpath newpath
,对应系统调用symlink-
通过较短的名称来访问一个经常使用的较长路径名称
-
将标准动态库名称链接到实际版本的动态库
-
8.3 stat系统调用
- stat文件状态:以下函数会返回指定文件的信息,不需要拥有文件的访问权限即可获取该信息
- stat结构体:
-
opendir—readdir函数:目录也是文件,下面代码段课打印目录中所有文件名称
-
ls程序:类似linux的ls命令
代码实现
- 读取文件某字节
#include<fcnt1.h>
char buf[512];
int fd=open("mydisk",O_RDONLY);
read(fd,buf,512);
struct partition *p=(struct partition *)&buf[0x1BE];
printf("p->start_sector = %d\n",p->start_sector);
p++;
苏格拉底提问