首页 > 其他分享 >yzy第四次学习笔记

yzy第四次学习笔记

时间:2023-10-01 16:14:08浏览次数:27  
标签:文件 调用 yzy 系统 文件系统 笔记 内核 磁盘 第四次

第七章:文件操作

文件操作级别
硬件级别:
硬件级别的文件操作包括:
fdisk:将硬件、U盘或SDC盘分区。
mkfs:格式化磁盘分区,为系统做好准备。
fsck:检查和维修系统。
碎片整理:压缩文件系统中的文件。
操作系统内核中的文件系统函数:

点击查看代码
kumount(),kumount()
                  (mount/umount file systems)
kmkdir(),krmdir()
                    (make/remove directory)
kchair(),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()                    
(Lseek/close file descriptors)
keymlink(),kreadlink ()
              (create/read symbolic 1ink files)

kstat(),kfstat(),klatat()            (get file status/information)
kopendir(),kreaddir()
                (open/read directories)


系统调用
用户模式程序使用系统调用来访问内核函数。open() read() lseek() 和 close() 函数都是C语言库函数.每个库函数都会发出一个系统调用,使进程进人内核模式来执行相应的内核函数,例如 open 可进入 kopen() , read 可进入 kread()函数,等等.当进程结束执行内核函数时,会返回到用户模式,并得到所需的结果.在用户模式和内核模式之间切换需要大量的操作和时间.因此,内核和用户空间之间的数据传输成本昂贵.虽然可以发出read(fd,buf,1)系统调用来只读取一个字节的数据,但是这种做法是不明智的,因为一个字节也会带来可怕的高成本.我们在每次必须进入内核时,都要尽可能不虚此行.对于读/写文件,最好的方法是匹配内核的功能.内核会按数据块大小(从1KB到8KB)来读取/写入文件.例如,在Linux中,硬盘的默认数据块大小是4KB,软盘的是1KB.因此,每个读/写系统调用还要尝试一次传输一个数据块.
I/O库函数
系统调用可让用户读/写多个数据块,这些数据块只是一系列字节.它们不知道,也不关心数据的意义.用户通常需要读/写单独的字符、行或数据结构记录等。如果只有系统调用,用户模式程序则必须自己从缓冲区执行这些操作。大多数用户会认为这非常不方便.为此,C语言库提供了一系列标准的1/O函数,同时也提高了运行效率。
I/O库函数包括:

点击查看代码
FILE mode I/O: fopen(), fread(),Ewrite(),fseek(),fclose(),fflush()
char mode I/O: getc(),getchar(), ugetc(), putc(),putchar()
line mode I/0: gets(),fgets(), puts(),fputs()

用户命令
用户可以使用Unix/Linux命令来执行文件操作,而不是编写程序.用户命令的示例如下:

点击查看代码
mkdir,rmdir,cd,pwd,1s,1link,unlink,rm,cat,ep,mv,chmod,ete
每个用户命令实际上是一个可执行程序(cd 除外),通常会调用库I/O函数,而库I/O函数再发出系统调用来调用相应的内核函数。用户命令的处理顺序为:
点击查看代码
 Command =>Library I/0 function =>System cal1 =>Kernel Function 
  或:Command======================== >System cal1 =>Kernel Function

sh脚本
sh脚本::虽然比系统调用方便得多,但是必须要手动输入命令,如果使用的是GUI必须要拖放文件图标和点击指向设备来输入,操作烦琐而且耗时.sh脚本是用sh编程语言编写的程序,可通过命令解释程序sh来执行.sh语言包含所有的有效Unix/Linux命令.它还支持变量和控制语句,如if、do、for、while、case等实际上,sh脚本广泛用于Unix/Linux系统编程.除sh之外,Perl和Tcl等其他许多脚本语言也使用广泛.

文件I/O操作

(1)用户模式下的程序执行操作
FILE *fp= fopen("file","r"); or FILE *fp = Efopen("file","w");
(2)fopen()在用户(heap)空间中创建一个FILE结构体,包含一个文件描述符fd、一个fbuf[BLKSIZE]和一些控制变量.它会向内核中的kopen()发出一个fd=open("file",fags=READ or WRITE)系统调用,构建一个OpenTable来表示打开文件示例.OpenTable的mptr指向内存中的文件INODE.对于非特殊文件,
NODE的i_block数组指向存储设备上的数据块.成功后,fp会指向FILE结构体,其中fd是open()系统调用返回的文件描述符。
(3)fread(ubuf,size,nitem,fp):将nitem个size字节读取到ubuf上,通过:将数据从FILE结构体的fbuf上复制到ubuf上,若数据足够,则返回.如果fbuf没有更多数据,则执行(4a).
(4a)发出read(fd, fbuf,BLKSIZE)系统调用,将文件数据块从内核读取到fbuf上,然后将数据复制到ubuf上,直到数据足够或者文件无更多数据可复制.
(4b)fwrite(ubuf,size,nitem,fp):将数据从ubuf复制到fbuf.
-若(fbuf有空间):将数据复制到fbuf上,并返回.
-若(fbuf已满):发出 writefd,fbuf,BLKSIZE)系统调用,将数据块写入内核,然后再次写人fbuf。这样,freadO/fwrite()会向内核发出 readO/writeO系统调用,但仅在必要时发出,而且它们会以块集大小来传输数据,提高效率.同样,其他库I/O 函数,如 fgete/fputc、fgets lputs、fscanf/fprintf等也可以在用户空间内的FILE 结构体中对 fbuf进行操作。
(5)内核中的文件系统函数:假设非特殊文件的read(fd,fbuf),BLKSIZE)系统调用.
(6)在read系统调用中,fd是一个打开的文件描述符,它是运行进程的fd数组中的一个索引,指向一个表示打开文件的OpenTable.
(7)OpenTable包含文件的打开模式、一个指向内存中文件INODE的指针和读/写文件的当前字节偏移量.从OpenTable的偏移量,·计算逻辑块编号Ibk。通过INODE.iblock[]数组将逻辑块编号转换为物理块编号blk.
(8)Minode包含文件的内存INODE.EMODE.iblock[]数组包含指向物理磁盘块的指针.文件系统可使用物理块编号从磁盘块直接读取数据或将数据直接写入磁盘块,但将会导致过多的物理磁盘I/O。
(9)为提高磁盘I/O效率,操作系统内核通常会使用一组IO缓冲区作为高速缓存,以减少物理IO的数量。.
7.3 低级别文件操作
分区
一个块存储设备,如硬盘、u盘、SD卡等,可以分为几个逻辑单元,称为分区,各分区均可以格式化为特定的文件系统,也可以安装在不同的操作系统上。
大多数引导程序,如 GRUB、LILO等,都可以配置为从不同的分区引导不同的操作系统。分区表位于第一个扇 区的字节偏移446(OxlBE)处,该扇区称
为设备的主引导记录(MBR)。表有4个条目,每 个条目由一个16字节的分区结构体定义,即:

点击查看代码
stuct 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在字节偏移量OxlBE处也有一个分区表,只包含两个条目。第一个条目定义了扩展分区的起始房区和大小。第二个条目指向下一个本地MBR。所有本地MBR的扇区编号都与P4的起始扇区有关。照例,链表以最后一个本地MBR中的0结尾。在分区表中,CHS值仅对小于8GB的磁盘有效:对大于8GB但小于4G扇区的磁盘,只有最后两个条目start_sector和nr_sector有意义。接下来,我们将通过示例来演示fdisk和分区。由于使用计算机的真实磁盘进行操作会非常危险,所以我们要使用一个虚拟磁盘映像.它只是一个普通的文件,但是看起来像一个真实磁盘。 **格式化分区** fdisk只是将一个存储设备划分为多个分区。每个分区都有特定的文件系统类型,但是分区还不能使用。为了存储文件,必须先为特定的文件系统准备好分区。该操作习惯上称为格式化磁盘或磁盘分区。在Linux中,它被称为mkfs,表示Make文件系统。Linux支持多种不同类型的文件系统。

EXT2文件系统简介

Block#0:引导块 B0是引导块,文件系统不会使用它。它用于容纳从磁盘引导操作系统的引导程序。

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

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

Block#8:块位图是用来表示某种项的位序列,例如:磁盘块或索引节点。

Block#9:索引节点位图,一个索引节点就是用来代表一个文件的数据结构。

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

直接块:指向直接磁盘块;

间接块:每个块编号指向一个磁盘块;

双重间接块:每个块指向256个磁盘块;

三重间接块:对于小型的“EXT2”文件系统,可以忽略这个块。

数据块:紧跟在索引节点块后面的是文件存储块。

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

基本概念

本章论述了如何使用系统调用进行文件操作;解释了系统调用的作用和Linux的在线手册页;展示了如何使用系统调用进行文件操作;列举并解释了文件操作中最常用的系统调用;阐明了硬链接和符号链接文件;具体解释了stat 系统调用;基于 stat信息,开发了一个类似于ls 的程序来显示目录内容和文件信息;接着,讲解了open-close-lseek系统调用和文件描述符;然后,展示了如何使用读写系统调用来读写文件内容;在此基础上,说明了如何使用系统调用来显示和复制文件;还演示了如何开发选择性文件复制程序,其行为类似于一个简化的Linux dd 实用程序。

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

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

int syscall(int a,int b,int c,int d);

示例程序:mkdir、chdir、getcwd系统调用。

点击查看代码
#include <gtdio.h>

#include <errno.h>

int main()

{

char buf [256],*g;

Int r;

r = mkdir("newdir",0766);// mkdir syscall

if(r <0)

printf("errno=%d : %\n",errno,strerror(errno));

r= chdir("newdir");     // cd into newdir

g = getcwd(buf,256);    // get CWD string into buf[ ]

printf("CWD= %8\n",a);

}

该程序发出一个mkdir()系统调用来创建新目录。mkdir()系统调用需要一个路径名和一个权限(八进制的0766)。如果没有新目录,则系统调用成功。返回值为0。如果不止一次运行该程序,由于目录已经存在,则在第二次或后续任何运行时会失败,返回值为-1。在这种情况下,该程序会打印消息∶

errno=17 : File exits

简单的系统调用:

access:检查对某个文件的权限

chdir:更改目录

chmod:更改某个文件的权限

chown:更改文件所有人

chroot:将(逻辑)根目录更改为路径名

getcwd:获取CWD的绝对路径名

mkdir:创建目录

rmdir:移除目录(必须为空)

link:将新文件名硬链接到旧文件名

unlink:减少文件的链接数;如果链接数达到0,则删除文件

symlink:为文件创建一个符号链接

rename:更改文件名称

utime:更改文件的访问和修改时间

以下系统调用需要超级用户权限。

mount:将文件系统添加到挂载点目录上

umount:分离挂载的文件系统

mknod:创建特殊文件

stat:获取文件状态信息

open:打开一个文件进行读、写、追加

close:关闭打开的文件描述符

read:读取打开的文件描述符

write:写入打开的文件描述符

link:将新文件硬链接到旧文件

unlink:取消某个文件的链接;如果链接文件链接数为0,则删除文件

readlink:读取符号链接文件的内容;

symlink:创建一个符号链接

链接文件

硬链接文件命令:

In oldpath newpath

软连接文件命令:

in -s oldpath newpath

stat结构体

所有的stat系统调用都以stat结构体形式返回信息,其中包含以下片段:

点击查看代码
struct stat{

dev_t    st_dev;

ino_t st_ino;

mode_t st_mode;

st_nlink; nlink_t

uid_t st_uid;

gia_t st_gid;

dev_t st_rdev;

off_t st_size;

u32     st_blksize;

u32     st_block8;

time_t  st_atime;time_E

st_mtime time_t st_ctime;

}

open-close-lseek系统调用

open:打开一个文件进行读、写、追加

close:关闭打开的文件描述符

read:读取打开的文件描述符

write:写入打开的文件描述符

lseek:将文件描述符的字节偏移量重新定位成偏移量

umask:设置文件创建掩码;文件权限(mask&~umask)

read()系统调用

点击查看代码
#include<unistd.h>

int read(int fd,void *buf,int nbytes);

write()系统调用

点击查看代码
#include<unistd.h>

int write(int fd,void *buf, int nbytes);

1.以苏格拉底的方式进行挑战问答截图

2.问题解决截图

3.实验过程代码及截图

(1)虚拟磁盘映像创建

(2)在磁盘映像文件上运行fdisk

(3)使用1440个块把vdisk格式化为EXT2文件系统

(4)在linux中,将格式化后的磁盘挂载到根文件系统中的现有目录中

(5)df -h查看挂载点,然后卸载设备

(6)在vdisk上建立一个分区

(7)用一下扇区数在vdisk的分区1上创建一个循环设备并将所有循环设备显示为/dev/loopN:

(8)mkdir、chdir、getcwd系统调用

(9)软连接文件创建

标签:文件,调用,yzy,系统,文件系统,笔记,内核,磁盘,第四次
From: https://www.cnblogs.com/yzy3655921/p/17738927.html

相关文章

  • SpringCloud微服务学习笔记(二)【Feign,Gateway,Docker】
    Feign先来看我们以前利用RestTemplate发起远程调用的代码:存在下面的问题:•代码可读性差,编程体验不统一•参数复杂URL难以维护Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。基......
  • 模算数学习笔记
    最近正好在搞同余,写一下。同余定义设\(m\in\mathbb{Z^+}\),如果\(a,b\in\mathbbZ\)且\(m\mid(a-b)\),那么称\(a\)和\(b\)模\(m\)同余,记作\(a\equivb\pmodm\);否则称\(a\)模\(m\)不同余于\(b\),记作\(a\not\equivb\pmodm\)。称\(m\)为同余的模......
  • 《信息安全系统设计与实现》学习笔记4
    第七章:文件操作文件操作级别硬件级别fdisk:将硬盘、U盘或SDC盘分区mkfs:格式化磁盘分区,为系统做好准备fsck:检查和维修系统碎片整理:压缩文件系统中的文件操作系统内核中的文件系统函数每个操作系统内核均可为基本文件操作提供支持系统调用用户模式使用系统调......
  • VisionPro学习笔记(4)——PatInspect
    如果需要了解其他图像处理的文章,请移步小编的GitHub地址传送门:请点击我如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPracticeVisionPro有很多的示例和算子,这里再展示一个最新出的算子PatInspectTool。我自己的笔记不会按照顺序一一展示出来的,也......
  • 2023-2024-1 20211306 密码系统设计与实现课程学习笔记4
    20211306密码系统设计与实现课程学习笔记4任务详情自学教材第7,8章,提交学习笔记知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问......
  • 学习笔记4
    学习笔记4@目录学习笔记4一、第七章学习笔记及操作截图1.五个级别2.文件I/O操作3.低级别文件操作4.EXT2文件系统二.第七章部分代码/操作截图三.第八章学习笔记及操作截图1.系统调用2.链接文件3.stat系统调用四.第八章部分代码/操作截图二、苏格拉底检验问题一问题二课程:《Linux......
  • 2023-2024-1 20211211《信息安全系统设计与实现》(上)第七、八章读书笔记
    教材第七、八章读书笔记第七章知识点归纳1文件操作级别-(1)硬件级别:-(2)操作系统中的文件系统函数-(3)系统调用-(4)I/O库函数-(5)用户命令-(6)sh脚本2文件I/O操作-(1)文件I/O操作示意图-(2)用户模式下的程序执行操作3低级别文件操作-(1)分区-(2)格式化分区-(3)挂载分区4EXT......
  • 学习笔记4
    教材7、8章知识点文件操作级别:硬件级别操作系统内核中的文件系统函数系统调用I/O库函数用户命令sh脚本文件I/O操作:打开文件:使用open系统调用打开文件,并返回文件描述符。关闭文件:使用close系统调用关闭文件描述符。读取文件:使用read系统调用从文件中读取数据。......
  • 学习笔记4
    知识点归纳文件I/O操作是指对文件的输入和输出操作。文件输入操作可以读取一个文件的内容,以便后续的处理。常见的文件输入操作包括读取文本文件的内容、读取二进制文件的内容等。文件输出操作可以将处理结果写入到一个文件中。这可以包括将数据写入文本文件、将数据以二进制形......
  • 第四周学习笔记
    1.文件操作硬件级别fdisk:将硬盘、U盘或SDC盘分区。mkfs:格式化磁盘分区,为系统做好准备。fsck:检查和维修系统。碎片整理:压缩文件系统中的文件。操作系统中的文件系统函数#前缀k表示内核函数kmount(),kumount() (mount/umountfilesystems)kmkdir(),krmdir() (make/remo......