首页 > 其他分享 >20211325 2023-2024-1 《信息安全系统设计与实现(上)》第四周学习笔记

20211325 2023-2024-1 《信息安全系统设计与实现(上)》第四周学习笔记

时间:2023-09-30 12:00:10浏览次数:44  
标签:char 调用 文件 int 2024 描述符 2023 20211325 链接

20211325 2023-2024-1 《信息安全系统设计与实现(上)》第四周学习笔记

一、任务要求

自学教材第7,8章,提交学习笔记(10分),评分标准如下

1. 知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容 (4分)

“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”

核心是要求GPT:“请你以苏格拉底的方式对我进行提问”

然后GPT就会给你提问,如果不知道问题的答案,可以反问AI:“你的理解(回答)是什么?”

如果你觉得差不多了,可以先问问GPT:“针对我XXX知识点,我理解了吗?”

GPT会给出它的判断,如果你也觉得自己想清楚了,可以最后问GPT:“我的回答结束了,请对我的回答进行评价总结”,让它帮你总结一下。


2. 问题与解决思路,遇到问题最先使用chatgpt等AI工具解决,并提供过程截图(3分)
3.   实践过程截图,代码链接(2分)
4.    其他(知识的结构化,知识的完整性等,提交markdown文档,使用openeuler系统等)(1分)

二、课本第七、八章内容总结

第七章 文件操作

文件操作级别

分为五个级别,按照从低到高的顺序排列如下。

  • 硬件级别
    硬件级别的文件操作包括:
    fdisk:将硬盘、U盘或SDC盘分区。
    mkfs:格式化磁盘分区,为系统做好准备。
    fsck:检查和维修系统。
    碎片整理:压缩文件系统中的文件。
  • 操作系统内核中的文件系统函数
    每个操作系统内核均可为基本文件操作提供支持。
  • 系统调用
    用户模式程序使用系统调用来访问内核函数
  • I/O库函数
    系统调用可让用户读/写多个数据块,这些数据块只是一系列字节。用户通常需要读/写单独的字符、行或数据结构记录等。如果只有系统调用,用户模式程序则必须自己从缓冲区执行这些操作。大多数用户会认为这非常不方便。为此,C语言库提供了一系列标准的1/O函数,同时也提高了运行效率。
    I/O库函数包括:
 
  FILE mode I/O:fopen(),fread(); fwrite(),fseek(),fclose(),fflush()
  char mode I/O:gete(), getchar(),ugete(); putc(),putchar()
  line mode I/O:gets(),fgets0; puts(),fputs()
  formatted I/O:scanf(),fscanf(),sscanf(); printf(),fprintf(),sprintf()
 

除了读/写内存位置的sscanf()/sprintf()函数之外,所有其他I/O库函数都建立在系统调用之上,它们最终会通过系统内核发出实际数据传输的系统调用。

  • 用户命令
    用户可以使用Unix/Linux命令来执行文件操作,而不是编写程序。
  • sh脚本
    比系统调用方便,但是必须要手动输入命令。

文件I/O操作

图为文件操作示意图,双线上方为内核空间,下方为进程的用户空间

低级别文件操作

  • 分区
    一个块存储设备,如硬盘、U盘SD卡等,可以分为几个逻辑单元,称为分区。各分区均可以格式化为特定的文件系统,也可以安装在不同的操作系统上。大多数引导程序,如 GRUB、LILO等,都可以配置为从不同的分区引导不同的操作系统。分区表位于第一个扇区的字节偏移446(0xIBE)处,该扇区称为设备的主引导记录(MBR)。表有4个条目,每个条目由一个16字节的分区结构体定义。
    一个例子:
    在Linux下,创建一个名为mydisk的虚拟磁盘映像文件。
    dd if=/dev/zero of=mydisk bs=1024 count=1440
    dd是一个将1440(1KB)个0字节块写入目标文件mydisk的程序。
    在磁盘映像文件上运行fdisk: fdisk mydisk
  • 格式化分区
    fdisk只是将一个存储设备划分为多个分区。每个分区都有特定的文件系统类型,但是分区还不能使用。为了存储文件,必须先为特定的文件系统准备好分区。该操作习惯上称为格式化磁盘或磁盘分区。在Linux中,它被称为mkfs,命令:
    mkfs -t TYPE [-b bsize] device nblocks
    表示在一个nblocks设备上创建一个TYPE文件系统,每个块都是bsize字节。如果bsize未指定,则默认块大小为1KB。
  • 挂载分区

EXT2文件系统简介

EXT2文件系统数据结构

在Linux下,我们可以创建一个包含简单EXT2文件系统的虚拟磁盘。
dd if=/dev/zero of=mydisk bs=1024 count=1440
mke2fs -b 1024 mydisk 1440
得到的EXT2文件系统有1440个块,每个块大小为1KB。
Block#0:引导块 B0是引导块,文件系统不会使用它。它用于容纳从磁盘引导操作系统的引导程序。

超级块

Block#1:超级块 (在硬盘分区中字节偏移量为1024)B1是超级块,用于容纳关于整个文件系统的信息。

块组描述符

Block#2:块组描述符块 (硬盘上的s_first_data_blocks-1)EXT2将磁盘块分成几个组。每个组有8192个块(硬盘上的大小为32K)。每组用一个块组描述符结构体描述。

位图

Block#8:块位图 (Bmap)(bg_blockbitmap)位图是用来表示某种项的位序列,例如磁盘块或索引节点。位图用于分配和回收项。在位图中,0位表示对应项处于FREE状态,1位表示对应项处于INUSE状态。一个软盘有1440个块,但是Block#0未被文件系统使用。所以,位图只有1439个有效位。无效位视作INUSE处理,设置为1。
Block#9:索引节点位图 (Imap)(bg_inodebitmap)一个索引节点就是用来代表一个文件的数据结构。EXT2文件系统是使用有限数量的索引节点创建的。各索引节点的状态用 B9中Imap中的一个位表示。在EXT2FS中,前10个索引节点是预留的。所以,空EXT2 FS的Imap以10个1开头,然后是0。无效位再次设置为1。

索引节点

Block#10:索引(开始)节点块 (bginodetable)每个文件都用一个128字节(EXT4中的是256字节)的独特索引节点结构体表示。

第八章 使用系统调用进行文件操作

系统调用

在操作系统中,进程以两种不同的模式运行,即内核模式和用户模式,简称Kmode和 Umode。在Umode中,进程的权限非常有限。它不能执行任何需要特殊权限的操作。特殊权限的操作必须在Kmode下执行。系统调用(简称syscall)是一种允许进程进入Kmode以执行Umode不允许操作的机制。复刻子进程、修改执行映像,甚至是终止等操作都必须在内核中执行。

使用系统调用进行文件操作

系统调用必须由程序发出。它们的用法就像普通函数调用一样。每个系统调用都是一个库函数,它汇集系统调用参数,并最终向操作系统内核发出一个系统调用。例如:
int syscall(int a,int b,int c,int d);
其中,第一个参数a是系统调用编号,b、c、d是对应内核函数的参数。内核的系统调用处理程序根据系统调用编号将调用路由到一个相应的内核函数。当进程结束执行内核函数时,会返回到用户模式,并得到所需的结果。返回值≥0表示成功,-1表示失败。如果失败,errno变量(在errno.h中)会记录错误编号,它们会被映射到描述错误原因的字符串。
简单的系统调用:
access:检查对某个文件的权限 int access(char *pathname, int mode);
chdir:更改目录 int chdir(const char *path);
chmod:更改某个文件的权限 int chmod(char *path, mode_t mode);
chown:更改文件所有人 int chown(char *name, int uid, int gid);
chroot:将(逻辑)根目录更改为路径名 int chroot(char *pathname);
getcwd:获取CWD的绝对路径名 char *getcwd(char *buf, int size);
mkdir:创建目录 int mkdir(char *pathname, mode_t mode);
rmdir:移除目录(必须为空) int rmdir(char *pathname);
link:将新文件名硬链接到旧文件名 int link(char *oldpath, char *newpath);
unlink:减少文件的链接数;如果链接数达到0,则删除文件 int unlink(char *pathname);
symlink:为文件创建一个符号链接 int symlink(char *oldpath, char *newpath);
rename:更改文件名称 int rename(char *oldpath,char *newpath);
utime:更改文件的访问和修改时间 int utime(char *pathname, struct utimebuf *time)
以下系统调用需要超级用户权限。
mount:将文件系统添加到挂载点目录上 int mount(char *specialfile,char *mountDir);
umount:分离挂载的文件系统 intumount(char *dir);
mknod:创建特殊文件 int mknod(char *path,int mode, int device);

常用的系统调用

stat:获取文件状态信息
int stat(char *filename, struct stat *buf)
int fstat(int filedes,struct stat *buf)
int 1stat(char *filename,struct stat *buf)
open:打开一个文件进行读、写、追加 int open(char *file, int flags, int mode)
close:关闭打开的文件描述符 int close(int fd)
read:读取打开的文件描述符 int read(int fd, char buf[ ],int count)
write:写人打开的文件描述符 int writelint fd,char buf[ ], int count)
lseek:重新定位文件描述符的读/写偏移量 int 1seek(int fd, int offset, int whence)
dup:将文件描述符复制到可用的最小描述符编号中 int dup(int oldfd);
dup2:将oldfd复制到newfd中,如果newfd已打开,先将其关闭
int dup2(int oldfd, int newfd)
link:将新文件硬链接到旧文件 int link(char *oldPath,char *newPath)
unlink:取消某个文件的链接;如果文件链接数为0,则删除文件 int unlink(char *pathname);
symlink:创建一个符号链接 int symlink(char *target,char *newpath)
readlink:读取符号链接文件的内容 int readlink(char *path, char *buf,int bufsize)
umask:设置文件创建掩码;文件权限为(mask&~umask) int umask(int umask);

链接文件

Linux允许使用不同的路径名来表示同一个文件,这些文件叫LINK文件。链接有两种类型:硬链接和软链接

  • 硬链接
    命令ln oldpath newpath创建从newpath到oldpath的硬链接。硬链接文件会共享文件系统中相同的文件表示数据结构(索引节点)。文件链接数会记录链接到同一索引节点的硬链接数量。硬链接仅适用于非目录文件。否则,它可能会在文件系统名称空间中创建循环。系统调用:
    unlink(char *pathname)
    会减少文件的链接数。如果链接数变为0,文件会被完全删除。这就是rm(file)命令的作用。
  • 软链接
    命令ln -s oldpath newpath 创建从newpath到oldpath的软链接或符号链接。newpath是LNK类型的普通文件,包含oldpath字符串。软链接适用于任何文件,包括目录。软链接在以下情况下非常有用:
    通过一个较短的名称来访问一个经常使用的较长路径名称;将标准动态库名称链接到实际版本的动态库。

stat系统调用

stat/lstat/fstat系统调用可将一个文件的信息返回。stat按文件名统计指向文件,并在缓冲区中填写stat信息。lstat与stat相同,除非是符号链接,统计链接本身,而不是链接所引用文件。stat遵循链接,lstat不遵循。fstat与stat相同,也只在文件名处说明filedes(由open(2)返回)所指向的打开文件。

open-close-lseek系统调用

open:打开一个文件进行读、写、追加
int open(char *file, int flags,int mode);
close:关闭打开的文件描述符
int close(int fd);
read:读取打开的文件描述符
int readlint fd, char buf[ 1,int count);
write:写人打开的文件描述符int writelint fd, char buf[ ],int count);
lseek:将文件描述符的字节偏移量重新定位为偏移量
int 1seek(int fd, int offset, int whencel;
umask:设置文件创建掩码;文件权限为(mask&~umask)

  • 打开文件和文件描述符
    open()打开一个文件进行读写或追加。它会返回一个进程可用的最小文件描述符,用于后续的read()、write()、seek()和close()系统调用。
  • 关闭文件描述符
    close()关闭指定的文件描述符fd,可重新用它来打开另一个文件。
  • lseek文件描述符
    在Linux中,off_t可定义为u64。当打开某个文件进行读或写时,它的RW-指针被初始化为0,这样就可以从文件的开头开始读/写。每次读/写n个字节后,RW-指针就会前进n个字节进行下一次读/写。lssek()将RW-指针重新定位到指定的偏移量,允许从指定的字节位置开始下一次读/写。

read()系统调用

read()将n个字节从打开的文件描述符读入用户空间中的buf[]。返回值是实际读取的字节数,如果read()失败,会返回-1。

write()系统调用

write()将n个字节从用户空间中的buf[]写人文件描述符,必须打开该文件描述符进行写、读写或追加。返回值是实际写入的字节数,通常等于n个字节,如果write()失败,则为-1。

三、课本代码实现(本周课堂上未出现代码因此本周无linux代码实现)

四、苏格拉底挑战

(1)超级块

(2)read()系统调用

标签:char,调用,文件,int,2024,描述符,2023,20211325,链接
From: https://www.cnblogs.com/Garden-of-Avalon/p/17737717.html

相关文章

  • origin怎么下载-2023全新绿色中文版下载 安装包下载方式
    Origin最新版是一款功能强大的数据分析和绘图软件。这款软件内置了查询工具,用户可通过ADO访问数据库数据进行查询。它还为用户提供了多种模板效果供用户使用,不仅如此,它还支持定制。有需要的小伙伴快来系统城下载origin最新版软件使用吧。软件地址:看置顶贴安装教程1、将本站提供的文......
  • 2023-2024-1 20231327司宏林 《计算机基础与程序设计》第一周学习总结
    学期(2023-2024-1)20231327《计算机基础与程序设计》第1周学习总结作业信息这个作业属于哪个课程<班级的链接>(2023-2024-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>([https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP/homework/13009)这个作......
  • 2023-2024-1 20231308 《计算机基础与程序设计》第一周学习总结
    2023-2024-120231308《计算机基础与程序设计》第一周学习总结作业信息作业课程2023-2024-1-计算机基础与程序设计作业要求2023-2024-1计算机基础与程序设计第一周作业作业目标教材内容学习作业正文2023-2024-120231308《计算机基础与程序设计》第一周学习......
  • [春季测试 2023] 密码锁 题解
    题目传送门闲话duliu题,写了10k。题意形式化地,对于\(1\leqi\leqk\),定义密码锁第\(i\)行的松散度为\[c(i)=\max\limits_{j=1}^na_{i,j}-\min\limits_{j=1}^na_{i,j}\]同时定义整个密码锁的松散度为\[C=\max\limits_{1\leqi\leq......
  • 2023-09-29-周五
    今天中秋节...是的...哈哈可还是很emo回望整整一天,,,好像还是没干什么月饼??这东西我好像吃了很多...都是实验室送的同时,,我想想...我还喝了7~8瓶东方树叶..........
  • 2023.9.29
    今天继续去试着做之前的一道题,但是写的exp报了一些奇怪的错,去查,然后尝试解决,再报新的错,再查,再尝试解决.......总之试了很久,最后发现可能是我当前Ubuntu版本的问题,于是又去找了个对应版本的Ubuntu,重新建了一个虚拟机,安装,配置pwn要用到的各种东西...搞了很久,今天没能做出一道题,明......
  • 20230928
    //accommodate,bargain,concession,consider,dicker,exception,figure,haggle,induce,minimum,practically,atasacrificeaccommodate-容纳Toaccommodatemeanstoprovideaplaceorspaceforsomeoneorsomething.Itcanalsorefertoadjustingorad......
  • 20230929
    //accommodate,bargain,concession,consider,dicker,exception,figure,haggle,induce,minimum,practically,atasacrificeaccommodate-容纳Toaccommodatemeanstoprovideaplaceorspaceforsomeoneorsomething.Itcanalsorefertoadjustingorad......
  • 2023.9.29——每日总结
    学习所花时间(包括上课):0h代码量(行):0行博客量(篇):1篇今天,上午陪同学去医院,下午休息;我了解到的知识点:休息明日计划:休息......
  • CSP2023 游记
    前言:之所以不在标题中加上&这个字符以及后面那几个字,是准备在复赛后加。今年没报J。下文的qbn,yh,lyl,yts。正文:初赛:每次敲code都用g++编译,甚至暑假在jcsy的时候由于配置VC较麻烦,直接手敲命令的,结果选择题第11题还对不了。。。阅读程序最后一题连错两道......