一、任务详情
自学教材第7,8章,提交学习笔记(10分),评分标准如下
- 知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容 (4分)
- 问题与解决思路,遇到问题最先使用chatgpt等AI工具解决,并提供过程截图(3分)
- 实践过程截图,代码链接(2分)
- 其他(知识的结构化,知识的完整性等,提交markdown文档,使用openeuler系统等)(1分)
二、知识点归纳
1.第七章
7.1 文件操作级别
(1)硬件级别: 硬件级别的文件操作包括:
fdisk:将硬盘、U盘或SDC盘分区
mkfs:格式化磁盘分区,为系统做好准备
fsck:检查和维修系统
碎片整理:压缩文件系统中的文件
(2)操作系统内核中的文件系统函数
操作系统内核提供了一组文件系统相关的函数,这些函数在内核层面支持基本文件操作。
(3)系统调用
用户模式程序使用系统调用来访问内核函数。
(4)I/O库函数
C语言提供了一系列标准的I/O库函数,这些函数封装了系统调用,提供更高级别的文件操作接口,使用户更方便地读写文件。
(5)用户命令
用户可以使用操作系统的命令行工具来执行文件操作,这些命令通常调用了底层的库函数,最终发出系统调用来执行文件操作。
7.2 文件I/O操作
7.3 低级别文件操作
- 分区:一个块存储设备,如硬盘、U盘、SD卡等,可以分为几个逻辑单元,称为分区。
- 格式化分区:fdisk只是将一个存储设备划分为多个分区。每个分区都有特定的文件系统类型,但是分区还不能使用。为了存储文件,必须先为特定的文件系统准备好分区。
- 挂载分区:
1.dd命令创建一个虚拟硬盘映像
2.在vdisk上运行fdisk来创建一个分区P1
3.使用扇区数在vdisk的分区1上创建一个循环设备
4.格式化/dev/loop1
5.挂载循环设备
6.访问作为文件系统一部分的挂载设备
7.设备使用完毕后卸载
7.4 EXT2文件系统简介
EXT2文件系统是一种在Linux操作系统中常用的文件系统。它是一种日志文件系统,是对EXT2系统的扩展。它兼容EXT2,并且从EXT2转换成EXT3并不复杂。
- 引导块:EXT2的引导块(Block#0)用于引导操作系统,不用于文件系统操作。
- 超级块:超级块(Block#1)包含关于整个文件系统的关键信息。
- 块组描述符:块组描述符块(Block#2)用于描述块组的属性,包括块位图、索引节点位图和索引节点表的位置。
- 位图:
块位图(Bmap)(Block#8):用于表示磁盘块的分配情况,0表示空闲,1表示已分配。
索引节点位图(Imap)(Block#9):用于表示索引节点的分配情况,0表示空闲,1表示已分配。 - 索引节点:索引节点是文件的数据结构,每个文件都有一个相关联的索引节点,其中包含有关文件的元数据和数据块的信息。
- 目录条目:EXT2中的目录由目录条目组成,每个目录条目包括文件名、索引节点号和其他元数据。
2.第八章
8.1 系统调用
系统调用(Syscall)是操作系统提供的一种机制,允许用户程序以有限的权限执行需要特权的操作。这些操作必须在内核模式(Kmode)下执行,而用户程序通常在用户模式(Umode)下运行。
Syscall 是用户程序与操作系统之间的接口,允许用户程序请求执行各种操作,如文件操作、进程管理、内存管理等。
8.2 系统调用手册页
大多数版本的Linux中在线手册页保存在/usr/man/目录
Ubuntu Linux中,保存在/usr/share/man目录
8.3 使用系统调用进行文件操作
系统调用是通过程序来发起的,其用法类似于普通函数调用。每个系统调用都有一个唯一的编号,通常是第一个参数,然后根据编号将请求路由到内核中的相应函数。
8.4 常用的系统调用
stat:获取文件状态信息
open:打开一个文件进行读写追加
close:关闭打开的文件描述符
read:读取打开的文件描述符
write:写入打开的文件描述符
lseek:重新定位文件描述符的读/写偏移量
symlink:创建一个符号链接
8.5 链接文件
- 硬链接文件: 1n oldpath newpath
- 符号链接文件:1n -s oldpathnewpath
8.6 stat系统调用
stat系统调用用于获取文件的状态信息,包括文件的权限、大小、链接数、所有者、组等信息。它需要文件的路径名作为参数,并将文件信息填充到一个 struct stat 结构中。
8.7 open-close-lseek系统调用
- 打开文件和文件描述符:int open(char *pathname,int flags,mode_t mode)
- 关闭文件描述符:int close(int fd)
- lseek文件描述符:off_t lseek(int fd,off_t offset,int whence)
8.8 read()、write()系统调用
- 将n个字节从打开的文件描述符读入用户空间的buf[]
- 将n个字节从用户空间的buf[]写入文件描述符
3.苏格拉底挑战
二、问题与解决思路
问题
(1)我对文件I/O操作的主要步骤不太清楚
(2)我不清楚如何使用系统调用进行文件操作
解决思路
三、实践过程截图
使用系统调用来创建一个新文件并写入一些数据:
使用了open系统调用来打开或创建一个名为test.txt的文件,然后,我们使用write系统调用将字符串"Hello, world!"写入文件中。最后,我们使用close系统调用关闭文件。