首页 > 其他分享 >《信息安全系统设计与实现》第四周学习笔记

《信息安全系统设计与实现》第四周学习笔记

时间:2023-09-30 23:14:04浏览次数:28  
标签:文件 调用 int 信息安全 笔记 char 描述符 fd 四周

《信息安全系统设计与实现》第四周学习笔记

第七章:文件操作

文件操作级别

  • 硬件级别
    • fdisk:将硬盘、U盘或SDC盘分区
    • mkfs:格式化磁盘分区,为系统做好准备
    • fsck:检查和维修系统
    • 碎片整理:压缩文件系统中的文件
  • 操作系统内核中的文件系统函数
    • 每个操作系统内核均可为基本文件操作提供支持
  • 系统调用:用户模式使用系统调用来访问内核函数
  • 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()
  • 用户命令:用户可以使用Unix/Linux命令来执行文件操作,而不是编写程序
  • sh脚本:sh脚本是用sh编程语言编写的程序,可以通过命令解释程序sh来执行

文件I/O操作

  • (1)用户模式下的程序执行操作
    FILE *fp = fopen("file","r");or FILE *fp = fopen("file","w");
  • (2)fopen在用户(heap)空间中创建一个FILE结构体,向内核中的kopen()发出一个fd = open("file",flags = READ or WRITE)系统调用,构建一个Opentable表示打开文件实例。成功后,fp会指向FILE结构体.
  • (3)fread(ubuf,size,nitem,fp)`:将nitem个size字节读取到ubuf上,通过:
    • 若数据足够,则返回、
    • 如果fbuf没有更多数据,则执行(4a)
  • (4a)发出read(fd,fbuf,BLKSIZE)系统调用,将文件从内核读取到fbuf,然后将数据复制到ubuf上,直到数据足够或者文件无更多数据可复制
  • (4b)fwrite(ubuf,size,nitem,fp):将数据从ubuf复制到fbuf
    • 若(fbuf有空间):将数据复制到fbuf上,并返回
    • 若(fbuf已满):发出write(fd,fbuf,BLKSIZE)系统调用,将数据块写入内核,然后再次写入fbuf
  • (5)内核中的文件系统函数:
    假设非特殊文件的read(fd,fbuf[],BLKSIZE)系统调用。
  • (6)read()系统调用中,fd是一个打开的文件描述符,指向一个表示打开文件的OpenTable
  • (7)OpenTable包含文件的打开模式、一个指向内存中文件INODE的指针和读/写文件当前字节偏移量
    • 计算逻辑块编号1bk
    • 通过INODE.i_block[ ]数组将逻辑块编号转换为物理块编号blk
  • (8)Minode包含文件的内存INODE
  • (9)为了提高磁盘I/O效率,操作内核通常会使用一组I/O缓冲区作为高速缓存
  • (9a)对于read(fd, buf, BLKSIZE)系统调用,要确定所需的(dev,blk)编号,然后查询I/O缓冲区高速缓存
  • (9b)对于write(fd, fbuf, BLKSIZE)系统调用,要确定需要的(dev,blk)编号,然后查询I/O缓冲区高速缓存
  • (10)设备I/O:I/O缓冲区上的物理IO最终会仔细检查设备驱动程序,设备驱动程序由上半部分的start_io()和下半部分的磁盘中断处理程序组成

低级别文件操作

  • 分区
    一个块存储设备,如硬盘、U盘、SD卡等,可以分为几个逻辑单元,称为分区。分区表位于第一个扇区的字节偏移446(0x1BE)处,成为设备的主引导记录(MBR)。每一个扩展分区的第一个扇区是一个本地MBR
  • 格式化分区
    为了存储文件,必须先为特定的文件系统准备好分区,该操作成为格式化磁盘或磁盘分区。在Linux中,称为mkfs,表示Make文件系统。Linux支持多种不同类型的文件系统。
  • 挂载分区
    • (1)使用dd命令创建一个虚拟磁盘映像:
      dd if=/dev/zero of=vdisk bs=1024 count=32768
    • (2)在vdisk上运行fdisk来创建一个分区P1:
      fdisk vdisk
    • (3)在vdisk来创建一个分区P1
    • (4)格式化/dev/loop1
    • (5)挂载循环设备
    • (6)访问作为文件系统一部分的挂载设备
    • (7)设备使用完毕后,将其卸载
    • (8)循环设备使用完毕后,将其断开

EXT2文件系统简介

  • EXT2文件系统数据结构
    • Block#0:引导块,文件系统不使用它,用于容纳从磁盘引导操作系统的引导程序
    • 创建一个包含简单EXT2文件系统的虚拟盘
    dd if=/dev/zero of=mydisk bs=1024 count=1440
    mke2fs -b 1024 mydisk 1440
  • 超级块
    Block#1:超级块B1是超级块,用于容纳关于整个文件系统的信息。
  • 块组描述符
    Block#2:块组描述符块,EXT2将磁盘分成几个组(每组8192块),每组用一个块组描述符结构体描述
  • 位图
    Block#8:块位图,用来表示某种项的位序列
    Block#9:索引节点位图,用来代表一个文件的数据结构
  • 索引节点
    Block#10:索引节点,每个文件都用一个128字节(EXT4的是256字节)的独特索引节点结构体表示

第八章

系统调用

在操作系统中,以内核模式和用户模式运行,简称Kmode和Umode,syscall,是一种允许进程进入Kmode以执行Umode不允许操作的机制。

系统调用手册页

    man 2 stat
    man 2 open
    man 2 read

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

mkdir,chdir,getcwd系统调用

    #include<stdio.h>
    #include<errno.h>
    int main()
    {
        char buf[256],*s;
        int r;
        r = mkdir("newdir",0766);	//mkdir syscall
        if(r<0)
            printf("error=%d : %s\n",errno,strerror(errno));
        r = chdir("newdir");	//cd into newdir
        s = getcwd(buf,256);	//get CWD string int buf[]
        printf("CWD = %s\n",s);
    }

常用的系统调用

  • 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 fd, char buf[], int count);
  • lseek:重新定位文件描述符的读/写偏移量
    int lseek(int fd,int offset,int whence);
  • dup:将文件描述符复制到可用的最小描述符编号中
    int dup(int oldfd);
  • dup2:将oldfd复制到newfd中,如果文件链接数为0,则删除文件
    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);

链接文件

  • 硬链接文件
    ln oldpath newpath
  • 对应系统调用:
    link(char *oldpath,char *newpath)
  • 减少文件链接数:
    unlink(char *pathname)
  • 符号链接文件
    • ln -s oldpath newpath
    • 创建符号链接或软链接
      symlink(char *oldpath,char *newpath)

stat系统调用

  • stat文件状态
  • stat结构体
    • st_size使用字节表示的文件大小
    • st_block值是使用512字节表示的文件大小
    • 并非所有的Linux文件系统都能实现所有的时间字段
  • stat与文件索引节点
    • 每个索引节点在存储设备上都有唯一的索引节点编号(ino)。每个设备都由一对(主,次)设备号标识,例如0x0302表示/dev/hda2,0x0803表示/dev/sda等
  • 文件类型和权限
    • st_mode字段说明:
      st_mode的类型是一个u16(16位),前4位是文件类型,接下来的3位表示文件的特殊用法,其余9位是文件保护权限位。
    • st_mode:
      第一个字母表示文件类型,后面9个字符基于权限位,如果位是1,每个字符打印为r|w|x;如果位是0,则打印-。x位表示是否允许访问目录。
  • opendir-readdir函数
    • 目录也是一个文件,我们应该像其他文件一个打开一个READ目录
具体代码:
              struct dirent
               {
                    long d_ino; /* inode number 索引节点号 */  
                    off_t d_off; /* offset to this dirent 在目录文件中的偏移 */  
                    unsigned short d_reclen; /* length of this d_name 文件名长 */  
                    unsigned char d_type; /* the type of d_name 文件类型 */  
                    char d_name [NAME_MAX+1]; /* file name (null-terminated) 文件名,最长255字符 */
               }
  • readlink函数
    要想读取符号链接文件的内容,我们必须使用readlink系统调用,即:
    int readlink(char *pathname,char buf[],int bufsize);
    将符号连接文件的内容复制到buf中,并将世纪复制的字节返回。
  • ls程序

open-close-lseek系统调用

  • open:打开一个文件,读、写、追加
  • close:关闭打开的文件描述符
  • read:读取打开的文件描述符
  • write:写入
  • lseek:将文件描述符的字节偏移量重新定位为偏移量
  • umask:设置文件创建掩码;

苏格拉底挑战

  • 1.低级别文件操作





  • 2.链接文件




遇到的问题及解决过程

问题

在学习第八章的时候,对于系统调用是如何与用户空间和内核空间交互的这个问题感到疑惑

解决

GPT的回答:

标签:文件,调用,int,信息安全,笔记,char,描述符,fd,四周
From: https://www.cnblogs.com/fanchaoming/p/17738371.html

相关文章

  • 读书笔记-9月
    读了程序员修炼手册的第一章,学到了一些东西。看视频教程的时候要跟着做,一行一行的跟着敲,一个项目敲完了,再试着加一些自己的功能,按照自己的思路敲一些代码,收获远比干听大的多。量变会引起质变的。学习的时候要先建立知识点的体系,体系学完了再慢慢抠细节,这样才有足够的学习效率。......
  • 《架构师之路:软件架构之美》第三章读书笔记
    第三章的主题是"ArchitecturePrinciples"(架构原则),该章介绍了软件架构设计中的一些重要原则和指导方针。以下是该章的一些主要观点和内容:架构原则的重要性:该章解释了架构原则在软件开发中的关键作用。架构原则是一组基本规则和准则,用于指导软件系统的整体设计和组织。常见......
  • 9月阅读笔记1
    这本书强调了编程不仅仅是写出可以工作的代码,而是一门艺术和科学的结合。以下是一些我从书中学到的原则导向的编程观点:持续学习:编程是不断演进的领域,要不断学习新技术和方法,以保持竞争力。做好基础工作:仔细设计、文档化和测试代码是成功的关键。不要急于编写代码,要先规划和......
  • 9月阅读笔记2
    本书提供了关于软件开发哲学的深刻洞察。以下是一些我认为特别重要的思想:机械式编码不足够:简单地编写代码是不够的,需要思考和规划。解决问题的过程涉及到设计、抽象、模块化和理解问题的本质。了解领域:了解解决问题的领域非常重要。软件开发者应该主动与领域专家合作,以便更......
  • 9月读书笔记2
    正交性,设计自足的软件,让软件的各个部分不会过度互相依赖,提高生产效率并且降低风险。曳光代码,在不完全了解用户需求的情况下,我们可以向初始框架中添加曳光代码,虽然并不能百分百命中,但其代码得以保存复用,这样的代码往往简约但复用率高。构建原型,这与本学期所学的uml建模类似,用非代码......
  • 计组学习笔记1.2——计算机的基本组成
    计算机的基本组成一、冯•诺依曼计算机的特点1.计算机由五大部件组成存储器、运算器、控制器输入设备:将信息输入计算机的外部设备,它将人们熟悉的信息形式转换成计算机能接受并识别的信息形式。常用的输入设备有键盘、鼠标、扫描仪和模/数(A/D)转换器等。输出设备:将计算机运算结......
  • 2023-2024-1 20211327 信息安全系统设计与实现 学习笔记4(必做)
    学习笔记4文件操作使用系统调用进行文件操作实践过程文件操作1.文件操作级别(1)硬件级别:fdisk:将硬盘、U盘或SDC盘分区mkfs:格式化磁盘分区,为系统做好准备fsck:检查和维修系统碎片整理:压缩文件系统中的文件(2)操作系统内核中的文件系统函数:前缀k表示内核函数(3)系......
  • 《信息安全系统设计与实现》第四周学习笔记
    《信息安全系统设计与实现》第四周学习笔记第七章:文件操作文件操作级别硬件级别fdisk:将硬盘、U盘或SDC盘分区mkfs:格式化磁盘分区,为系统做好准备fsck:检查和维修系统碎片整理:压缩文件系统中的文件操作系统内核中的文件系统函数前缀为k表示内核函数系统调用:用户模......
  • 9月《程序员修炼之道:从小工到专家》阅读笔记(2)
    三、基本工具14纯文本的威力纯文本可以获得自描述的,不依赖于创建他的应用的数据流。纯文本可以保证不过时,更容易测试等。15shell游戏对程序员来说,工作台就是命令shell。GUI无法让我们超越设计者提供的模型,而我们往往需要这种操作,这时候shell就是你最顺手的工具。16强力编辑......
  • 《软件工程:一种实践方法》读书笔记三
    需求工程:书中详细介绍了需求工程的重要性和方法。它强调了需求分析的关键作用,帮助读者了解如何有效地收集、分析和管理需求。此外,它还介绍了一些常见的需求工程技术和工具,如用例建模和需求跟踪。设计原则和模式:这本书提供了许多设计原则和模式,帮助读者在软件设计过程中做出高......