20211301 学习笔记4

学习笔记4

教材知识总结

7.1 文件操作级别

  • 文件操作:分为5个级别(从高到低如下)
  1. 硬件级别:

fdisk(硬盘、U盘、sdc盘分区
mkfs:格式化磁盘分区,为系统做好准备
fsck:检查和维修系统
碎片整理:压缩文件系统中的文件

  1. 操作系统内核中的文件系统函数

  2. 系统调用

  3. I/O库函数

  4. 用户命令

  5. sh脚本

7.2 文件IO操作

  1. 用户模式、内核模式
  • 读写文件

  • fopen在用户空间中创建FILE结构体,包含文件描述符fd,一个fbuf和一些控制变量,会像内核中的kopen发出一个fd的系统调用,创建一个opentable来表示打开文件实例

  • fread:将nitem个size字节读取到ubuf上,若数据足够则返回,若不够则发出read系统调用读取文件数据块到ubuf,直到足够

  • fwirite:将数据从ubuf复制到fbufs

  • fd:是运行进程的fd数组中的一个索引,指向一个表示打开文件的opentable

7.3 低级别文件操作

  1. 分区:各分区可以格式化特定的文件系统,也可以安装在不同的操作系统上
  • 分区表:位于第一个扇形的字节偏移446处,称为主引导记录,表有四个条目,每个条目由一个16字节的分区结构体定义

  • 扩展分区链表:每个扩展分区是一个本地MBR,第一个条目定义了起始扇区和大小,第二个条目指向下一个本地MBR

  1. 格式化分区:在linux中,被称为mkfs,表示Make文件系统
  • 创建TYPE文件系统

mkfs -t TYPE [-b bsize] device nblocks

  • 必须挂载到根文件系统中的现有目录中,因为虚拟文件系统不是真正的设备

  • 使用完成后,将cd从/mnt中取出输入sudo umount vdisk卸载设备

  1. 挂载分区
  • 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++;

问题与解决方案

  • 问题一:运行系统调用进行文件读写的代码时报错
  • 问题一解决方案:

苏格拉底提问










posted @ 2023-10-01 22:11  20211301郑润芃  阅读(5)  评论(0编辑  收藏  举报