首页 > 其他分享 >2023-2024-1 20211211《信息安全系统设计与实现》(上)第七、八章读书笔记

2023-2024-1 20211211《信息安全系统设计与实现》(上)第七、八章读书笔记

时间:2023-10-01 11:22:06浏览次数:40  
标签:char 调用 文件 int 读书笔记 系统 2024 2023 链接

教材第七、八章读书笔记

第七章知识点归纳

  • 1 文件操作级别
    - (1)硬件级别:
    - (2)操作系统中的文件系统函数
    - (3)系统调用
    - (4)I/O库函数
    - (5)用户命令
    - (6)sh脚本
  • 2文件I/O操作
    - (1)文件I/O操作示意图
    - (2)用户模式下的程序执行操作
  • 3低级别文件操作
    - (1)分区
    - (2)格式化分区
    - (3)挂载分区
  • 4EXT2文件系统简介
    - (1)EXT2文件系统数据结构
    - (2)超级块
    - (3)块组描述符
    - (4)位图
    - (5)索引节点

1 文件操作级别

文件操作 分为五个级别:

(1)硬件级别

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

(2)操作系统中的文件系统函数

每个操作系统内核均可为基本文件操作提供支持,下文列出了类unix系统内核中的一些函数,其中前缀k表示内核函数。

kmount () . kumount ( )			(mount/umount file systems)
kmkdir(), krmdir()				(make/ remove directory)
kchdir(), kgetcwd ()				(change directory, get CWD pathname)
klink(),kunlink()				(hard link/unlink files)
kchmod(), kchown(),kutime()		 (change r|w|x permissions, owner,time)
kcreat (), kopen()				(create/open file for R,W,RW,APPEND)
kread(),kwrite()				(read/write opened files)
klseek(): kclose()				(lseak/close file descriptors)
ksymlink(), kreadlink ()			(create/read symbolic link files)
kstat(), kfstat(),klstat()			 (get file status/information)
kopendir(), kreaddiz()			(open/read airectories)

(3)系统调用

用户模式程序使用系统调用来访问内核函数

open(),read(),lseek()和close()都是c语言库函数。每个库函数都会发出一个系统调用,使进程进入内核模式来执行相应的内核函数,当进程结束执行内核函数使,会返回到用户模式,并得到所需的结果。

(4)I/O库函数

系统调用可以让用户读/写多个数据块,这些数据块只是一系列字节。他们不知道,也不关心数据的意义。用户通常需要读/写单独的字符、行或数据结构记录等。C语言库提供了一系列标准的I/O函数,包括:

FILE mode I/O: fopen(),fread();fwrite(),fseek(),fclose(),fflush()
char mode I/O: getc(), getchar(); ugetc(); putc(),putchar()
line mode I/O: gets() , fgets();puts( ) , fputs()
formatted I/O: scanf(),fscanf().sscanf(); printf(),fprintf() , sprintf()

(5)用户命令

用户可以使用Unix/Linux命令来执行文件操作,而不是编写程序。用户命令如下:
mkdir,rmdir,cd,pwd,ls,link,unlink,rm,cat,cp,mv,chmod,etc.

(6)sh脚本

虽然比系统调用方便的多,但是必须要手动呼入命令

2文件I/O操作

(1)文件I/O操作示意图

(2)用户模式下的程序执行操作

打开一个读文件流

FILE *fp = fopen("file", "r");
或:
打开一个读/写文件流
FILE *fp = fopen("file", "w");

  • fopen()在用户( heap)空间中创建一个FILE结构体,包含一个文件描述符fd、一个fbuf [BLKSIZE]和一些控制变量。它会向内核中的 kopen()发出一个fd = open("file",flags=READ or WRITE)系统调用,构建一个OpenTable来表示打开文件示例。成功后,fp会指向FILE结构体,其中fd是 open()系统调用返回的文件描述符。
  • fread(ubuf,size,nitem,fp):将nitem个size字节读取到ubuf上
    • 将数据从FILE结构体的fbuf上复制到ubuf上,若数据足够,则返回。
    • 如果fbuf没有更多数据,则执行(4a)。
  • 发出read(fd, fbuf, BLKSIZE)系统调用,将文件数据块从内核读取到fbuf上,然后将数据复制到ubuf上,直到数据足够或者文件无更多数据可复制
  • fwrite(ubuf,size,nitem, fp):将数据从ubuf复制到 fbuf
    • 若(fbuf有空间):将数据复制到fbuf上,并返回
    • 若(fbuf已满);发出 write(fd,fbuf,BLKSIZE)系统调用,将数据块写入内核,然后再次写入fbuf
      这样,fread()/fwrite()会向内核发出read()/write()系统调用,但仅在必要时发出,而且它们会以块集大小来传输数据,提高效率。同样,其他库IO函数,如 fgetc/fputc、fgetsllputs、fscanf/fprintf等也可以在用户空间内的FILE结构体中对fbuf进行操作。

3低级别文件操作

(1)分区

一个块存储设备,如硬盘、U盘、SD卡等,可以分为几个逻辑单元,称为分区。各分区均可以格式化为特定的文件系统,也可以安装在不同的操作系统上。大多数引导程序,如GRUB、LILO等,都可以配置为从不同的分区引导不同的操作系统。分区表位于第一个扇区的字节偏移446(0x1BE)处,该扇区称为设备的主引导记录(MBR)。表有4个条目,每个条目由一个16字节的分区结构体定义,即:

struct partition {
    u8 drive;           // 0x80 - active
    u8 head;            // starting head
    u8 sector;          // starting sector
    u8 cylinder;        // starting cylinder
    u8 sys_type;        // partition type
    u8 end_head;        // end head
    u8 end_sector;      // end sector
    u8 end_cylinder;    // end cylinder
    u32 start_sector;   // starting sector counting from  0
    u32 nr_sectors;     // number of sectors in partition
};

每个扩展分区的第一个扇区是一个本地MBR。每个本地MBR在字节偏移量0xIBE处也有一个分区表,只包含两个条目。第一个条目定义了扩展分区的起始扇区和大小。第二个条目指向下一个本地MBR。

(2)格式化分区

fdisk只将一个存储设备划分为多个分区。每个分区都有特定的文件系统类型,但是分区还不能使用。为了存储文件,必须先为特定的文件系统准备好分区。该操作习惯上称为格式化磁盘或磁盘分区。在Linux中,它被称为mkfs,表示Make文件系统。Linux支持多种不同类型的文件系统。每个文件系统都期望存储设备上有特定的格式。在Linux中,命令

mkfs -t TYPE [-b bsize] device nblocks
在一个nblocks设备上创建一个TYPE文件系统,每个块都是bsize字节。如果bsize未指定,则默认块大小为1KB。具体来说,假设是EXT2/3文件系统,它是Linux的默认文件系统。因此,
mkfs -t ext2 vdisk 1440

mke2fs vdisk 1440
格式化后的磁盘应是只包含根目录的空文件系统。但是,Linux的mkfs始终会在根目录下创建一个默认的lost+found目录。
/mnt目录通常用于挂载其他文件系统。

(3)挂载分区

第八章知识点归纳

系统调用

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

系统调用手册页

在Unix以及大多版本的Linux中,在线手册页保存在/usr/man/目录中(Goldt等1995;Kerrisk 2010,2017)。而在Ubuntu Linux中,则保存在/usr/share/man目录中。man2子目录中列出了所有系统调用手册页。sh命令man 2 NAME显示了系统调用名称的手册页。例如:

man 2 stat
man 2 open
man 2 read

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

系统调用必须由程序发出。它们的用法就像普通函数调用一样。每个系统调用都是一个库函数,它汇集系统调用参数,并最终向操作系统内核发出一个系统调用
列举一些简单的文件操作系统调用:

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:分离挂载的文件系统
int umount (chaz *dir);

mknod:创建特殊文件
int mknod(char *path, int mode,int device);
  • 常用的系统调用
stat:获取文件状态信息
int stat (char*filename, struct stat *buf)
int fstat(int tiledes,struct stat *buf)
int lstat (char*至ilename, 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 write(int fa,char buf[ 1, int count)
                          
lseck:重新定位文件描述符的读/写偏移量
int lseek(int fa, int offset,int whence)
                          
dup:将文件描述符复制到可用的最小描述符编号中
int dup(int oldrd);
                          
dup2:将oldfd复制到newfd中,如果newfd已打开,先将其关闭
intdup2(int oldfd, int newfd)
                          
link:将新文件硬链接到旧文件
int link ( char *o1dPath, 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);
  • 链接文件
    在Unix/Linux中,每个文件都有一个路径名。但是,Unix/Linux允许使用不同的路径名来表示用一个文件。这些文件叫作LINK(链接)文件。有两种类型的链接,即硬链接和软链接或符号链接
    • (1)硬链接文件
      ln oldpath newpath
      创建从newpath到oldpath的硬链接。对应的系统调用为:
      link(char *oldpath,char *newpath)
      硬链接文件会共享文件系统中相同的文件表示数据结构。文件链接会记录链接到同一索引结点的硬连接数量。相反,系统调用:
      unlink(char *pathname)
      会减少文件的链接数。如果链接变为0,文件就被完全删除。

    • (2)符号链接文件
      ln -s oldpath newpath #in command with the -s flag
      创建从newpath到oldpath的软链接或符号链接。对应的系统调用是:
      symlink(char *oldpath,chat *newpath)
      newpath是LNK类型的普通文件,包含oldpath字符串。与硬链接不同,软链接适用于任何文件,包括目录。
      软链接在以下情况下非常有用。
      通过一个较短的名称来访问一个经常使用的较长的路径名称,例如:
      x -> aVeryLongPathnameFile
      将标准动态库名称链接到实际版本的动态库,例如:
      libc.so.6 -> libc.2.7.so
      当将实际动态库更改为不同版本时,库安装程序只需更改(软)链接以指向新安装的库。
      软链接的一个缺点是目标文件可能不复存在了。在Linux中,会通过ls命令以适当的深色RED显示此类危险,提醒用户链接已断开。此外,如果foo -> /a/b/c是软链接,open("foo", 0)系统调用将打开被链接的文件/a/b/c,而不是链接文件自身。所以open()/read()系统调用不能读取软链接文件,反而必须要用readlink系统调用来读取软链接文件的内容。

  • stat系统调用
    • (1)stat文件状态
    • (2)stat结构体
    • (3)stat与文件索引节点
    • (4)文件类型和权限
    • (5)opendir-readdir函数
      目录也是一个文件。我们应该能像其他任何普通文件一样,打开一个READ目录,然后读取和显示它的内容。然而,根据文件系统的不同,目录文件的内容可能会有不同。因此,用户可能无法正确读取和解释目录的内容。鉴于此,POSIX为目录文件指定了以下接口函数。
#include <dirent.h>
DIR *open(dirPath);     // open a directory named dirPath for READ
struct dirent *readdir(DIR *dp);    // return a dirent pointer
Linux中dirent结构体是:
struct dirent {
    u32 d_ino;  // inode number
    u16 d_reclen;
    char d_name[];
};

在dirent结构体中,POSIX只要求必须保留d_name字段。其他字段取决于具体的系统。
opendir()返回一个DIR指针dirp。每个readdir(dirp)调用返回一个dirent指针,指向目录中下一个条目的dirent结构体。当目录中没有更多条目时,则返回一个NULL指针。我们用一个例子来说明它们的用法。下面的代码段可打印目录中的所有文件名称。

#include <dirent.h>
struct dirent *ep;
DIR *dp = opendir("dirname");
while (ep = readdir(dp)) {
    printf("name=%s ", ep->d_name);
}
  - (6)readlink函数
  - (7)ls程序
  • open-close-lseek系统调用
    • (1)打开文件和文件描述符
    • (2)关闭文件描述符
    • (3)lseek文件描述符
  • read()系统调用
  • write()系统调用
  • 文件操作示例程序
    • (1)显示文件内容
    • (2)复制文件
    • (3)选择性文件复制

苏格拉底挑战





标签:char,调用,文件,int,读书笔记,系统,2024,2023,链接
From: https://www.cnblogs.com/yogahuu/p/17736830.html

相关文章

  • 2023-2024-1 20231312 《 计算机基础与程序设计》第1周学习总结
    作业信息|这个作业属于哪个课程|<班级的链接>2023-2024-1-计算机基础与程序设计||这个作业要求在哪里|<作业要求链接>2023-2024-1计算机基础与程序设计第一周作业||这个作业的目标|<快速浏览一遍教材《计算机科学概论》,并提出自己不......
  • 9.30 读书笔记
    《代码大全2》是一个经典的软件开发书籍,是一本非常有价值的资源,包含了许多软件开发中的重要主题。书中提醒读者以解决问题为导向,不仅仅是完成任务。防御式编程,防御式编程不是指不让别人批评代码,而是指确保要承担的责任,保证方法不会因为传入错误数据而破坏,看似微小的防范,收益可能......
  • 2023.9.30
    得了支气管炎,上午去医院挂水,下午回来,继续解决之前pwn相关东西遇到的一些问题,今天是去把新的ubuntu虚拟机也装了个vmware_tool,然后LibcSearcher有点问题没法用,花了很长时间搞定这个最后实验可行。明天继续......
  • 代码大全读书笔记
    代码质量和软件开发的关系:代码质量直接影响软件开发的效率和可维护性。良好的代码质量可以提高代码的可读性、可理解性和可扩展性,减少调试和修复错误的时间和工作量。编写高质量代码的原则:模块化和信息隐藏:将代码分解为小的、独立的模块,并通过封装隐藏内部实现细节。适当......
  • 学期2023-2024-1 学号20231315 《计算机基础与程序设计》第一周学习总结
    学期2023-2024-1学号20231315《计算机基础与程序设计》第一周学习总结作业信息这个作业属于哪个课程?2023-2024-1《计算机基础与程序设计》这个作业要求在哪里?2023-2024-1《计算机基础与程序设计》这个作业的目标?**快速浏览一遍教材计算机科学概论,课本每章提出......
  • 读书笔记-9月
    读了程序员修炼手册的第一章,学到了一些东西。看视频教程的时候要跟着做,一行一行的跟着敲,一个项目敲完了,再试着加一些自己的功能,按照自己的思路敲一些代码,收获远比干听大的多。量变会引起质变的。学习的时候要先建立知识点的体系,体系学完了再慢慢抠细节,这样才有足够的学习效率。......
  • 《架构师之路:软件架构之美》第三章读书笔记
    第三章的主题是"ArchitecturePrinciples"(架构原则),该章介绍了软件架构设计中的一些重要原则和指导方针。以下是该章的一些主要观点和内容:架构原则的重要性:该章解释了架构原则在软件开发中的关键作用。架构原则是一组基本规则和准则,用于指导软件系统的整体设计和组织。常见......
  • 2023年计算机保研经验(天大,东南,华科,华师)
    浅浅记录一下曲折的保研历程[个人情况]本科学校:中流不知名211本科专业:计算机科学与技术排名:绩点排名为5/150,综排开出后来到了1/150英语:四六级均580+荣誉:一年国奖但是莫得优秀学生竞赛:一个ECFinal铜和ICPC其它区域赛铜,还有一些算法竞赛类的水奖,CSP350分项目科研:这部分非......
  • 9月读书笔记2
    正交性,设计自足的软件,让软件的各个部分不会过度互相依赖,提高生产效率并且降低风险。曳光代码,在不完全了解用户需求的情况下,我们可以向初始框架中添加曳光代码,虽然并不能百分百命中,但其代码得以保存复用,这样的代码往往简约但复用率高。构建原型,这与本学期所学的uml建模类似,用非代码......
  • 2023-2024-1 20211327 信息安全系统设计与实现 学习笔记4(必做)
    学习笔记4文件操作使用系统调用进行文件操作实践过程文件操作1.文件操作级别(1)硬件级别:fdisk:将硬盘、U盘或SDC盘分区mkfs:格式化磁盘分区,为系统做好准备fsck:检查和维修系统碎片整理:压缩文件系统中的文件(2)操作系统内核中的文件系统函数:前缀k表示内核函数(3)系......