一、Linux内核虚拟文件系统学习总结

Linux支持各种文件系统,Linux内核通过虚拟文件系统了对各种文件系统共性的进行抽象,并对外提供统一接口,从面向对象编程的角度来看,称为抽象文件系统更为合适。虚拟文件系统(VFS virtual file system)用来管理挂接(mount)各种具体文件系统(如:ext4文件系统)。具体的文件系统可设计成可加载模块,在系统需要时进行加载,例如VFAT就被实现成一个模块,当挂接VFAT文件系统时VFAT文件系统模块将被加载。

挂接具体文件系统时,VFS读取它的超级块,得到具体文件系统的拓扑结构并将这些信息映射到VFS超级块结构中。

当进程或shell命令(如:ls)访问目录和文件时,shell命令及应用程序分解成系统调用,系统调用进入内核空间,遍历虚拟文件系统的VFS节点(inode),而VFS节点指向了具体文件系统的节点,通过底层块I/O函数调用IDE接口,然后再通过块驱动程序访问块设备(如:硬盘),得到了文件数据。文件系统的运行流程示意图如下:

虚拟文件系统对文件系统共有的内核上层及底层部分进行了处理,上层处理如:文件路径的查找、文件的读写操作从用户空间向下传递到具体文件系统的部分;底层进行各种缓存的处理,如:块缓存(buffer)。

1、VFS数据结构:

VFS的数据结构定义了VFS对象和对象的操作函数集,它们是一个接口标准,具体文件系统必须提供VFS接口标准对应的数据结构和操作函数。体文件系统在使用前,必须将自己的结构及操作函数映射到VFS中,这样被访问到。

2、超级块操作函数集:

超级块对象的各种操作方法由超级块操作函数集结构super_operations定义,通过超级块对象的成员s_op可找到该操作函数集,如:

sb->s_op->read_inode(inode)。

结构super_operations列出如下:

struct super_operations {
struct inode *(*alloc_inode)(struct super_block *sb); /*分配节点对象空间*/
void (*destroy_inode)(struct inode *); /*销毁节点*/ void (*dirty_inode) (struct inode *); /*处理脏节点,ext4用它更新文件系统日志*/
int (*write_inode) (struct inode *, int); /*将节点的内容写回到磁盘节点*/
void (*drop_inode) (struct inode *);
void (*delete_inode) (struct inode *); /*删除节点及对应磁盘上的数据*/
void (*put_super) (struct super_block *); /*释放超级块对象*/
void (*write_super) (struct super_block *); /*将超级块信息写回磁盘*/
/*日志系统用来同步更新文件系统数据结构在磁盘上的数据*/
int (*sync_fs)(struct super_block *sb, int wait);
void (*write_super_lockfs) (struct super_block *); /*锁住文件系统将超级块信息写回磁盘*/
void (*unlockfs) (struct super_block *); /*解锁文件系统*/
int (*statfs) (struct dentry *, struct kstatfs *); /*得到文件系统的一些统计信息*/
int (*remount_fs) (struct super_block *, int *, char *); /*重新挂接文件系统*/
void (*clear_inode) (struct inode *); /*清除节点*/
void (*umount_begin) (struct super_block *); /*开始卸载文件系统的操作*、 int (*show_options)(struct seq_file *, struct vfsmount *); /*显示文件系统特定的选项*/
int (*show_stats)(struct seq_file *, struct vfsmount *); /*显示状态信息*/
#ifdef CONFIG_QUOTA
/*读限额,限额系统调用用该方法读取数据*/
ssize_t (*quota_read)(struct super_block *, int, char *, size_t, loff_t);
/*写限额,限额系统调用用该方法将数据写入文件*/
ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t);
#endif
};

二、Linux内核块IO学习笔记

1、基本设备类型

基本的设备类型有字符设备和块设备两种:字符设备按照字符流的方式被有序访问;系统中能够随机而不需要按顺序访问固定大小数据片的设备称为块设备。这些数据片称为块。

2、扇区是硬件单元

块设备中最小的可寻址单元是扇区。扇区的大小是设备的物理属性,扇区是所有块设备的基本单元,块设备无法对比它还小的单元进行寻址和操作,许多块设备能够一次传输多个扇区。

3、扇区的大小

扇区大小一般是2的整数倍,最常见的大小是512字节。

4、块是软件单元

各种软件都会用到自己的最小逻辑可寻址单元——块。块是文件系统的一种抽象,只能基于块来访问文件系统。虽然物理磁盘寻址是按照扇区级进行的,但是内核执行的所有磁盘操作都是按照块进行的。

5、块的大小

由于扇区是设备的最小可寻址单元,所以块不能比扇区还小,只能是扇区的整数倍。另外,内核还要求块大小是2的整数倍,而且不能超过一个页的长度,所以,块的大小必须是扇区大小的2的整数倍,并且要小于页面大小。通常块大小是512字节、1K或4K。

6、别名

扇区——设备的最小寻址单元,有时会被称作“硬扇区”或“设备块”;块——文件系统的最小寻址单元,有时会被称作“文件块”或“I/O块”。

7、缓冲区

当一个块被调入内存时,也就是说,在读入后或等待写出时,它要存储在一个缓冲区中。每个缓冲区与一个块对应,它相当于是磁盘块在内存中的表示。块包含一个或多个扇区,但大小不能超过一个页面,所以一个页可以容纳一个或多个内存中的块。

三、linux内核装载和启动一个可执行程序实验总结

1、实验过程

打开Makefile,首先静态编译了hello.c,生成根文件系统时把init和hello都放入rootfs image里面,这样执行exec的时候就自动的帮我们加载hello这个文件

执行结果,hello world! 是新加载的一个可执行程序输出的

单步调试,窗口被冻结

设置三个断点: sys_execve,load_elf_binary , start_thread

list列出来跟踪, 输入s可以进入do_execve的内部。按c继续执行,跑到load_elf_binary。list查看代码,输入n一句一句跟踪,nnnc,追踪到start_thread。

看看hello这个可执行程序的入口,发现也是0x8048d0a,和new_ip的位置一样。new_ip是返回到用户态第一条指令的地址。

将new_ip和new_sp赋值,并设了一个新堆栈。

二、实验总结

新进程开始。调用系统调用execve(),其中/bin/ls作为一个参数被传递进去;sys_execve()服务例程修改当前进程的执行上下文;以上系统调用终止后,新进程开始执行放在可执行文件中的代码,也就是执行在当前目录下显示文件的功能。 当ELF被load_elf_binary()装载完成后,函数返回至do_execve()在返回至sys_execve()。

静态地拷贝到可执行文件中运行(静态库)缺点:占用大量的磁盘空间 利用动态链接器(ld.so)指向库名。

在程序运行时,被链接(或者说映射)到进程(共享库)

缺点:动态链接的程序启动时间长 直接复制库代码的某些部分。

20169211《Linux内核原理与分析》 第九周作业的更多相关文章

  1. 2019-2020-1 20199303<Linux内核原理与分析>第二周作业

    2019-2020-1 20199303第二周作业 1.汇编与寄存器的学习 寄存器是中央处理器内的组成部份.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中 ...

  2. 20169219 linux内核原理与分析第二周作业

    "linux内核分析"的第一讲主要讲了计算机的体系结构,和各寄存器之间对数据的处理过程. 通用寄存器 AX:累加器 BX:基地址寄存器 CX:计数寄存器 DX:数据寄存器 BP:堆 ...

  3. 2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

    1.基础学习内容 1.1 冯诺依曼体系结构 计算机由控制器.运算器.存储器.输入设备.输出设备五部分组成. 1.1.1 冯诺依曼计算机特点 (1)采用存储程序方式,指令和数据不加区别混合存储在同一个存 ...

  4. Linux内核原理与分析-第一周作业

    本科期间,学校开设过linux相关的课程,当时的学习方式主要以课堂听授为主.虽然老师也提供了相关的学习教材跟参考材料,但是整体学下来感觉收获并不是太大,现在回想起来,主要还是由于自己课下没有及时动手实 ...

  5. 2019-2020-1 20199314 <Linux内核原理与分析>第一周作业

    前言 本周对实验楼的Linux基础入门进行了学习,目前学习到实验九完成到挑战二. 学习和实验内容 快速学习了Linux系统的发展历程及其简介,学习了下的变量.用户权限管理.文件打包及压缩.常用命令的和 ...

  6. Linux内核原理与分析-第二周作业

    写之前回看了一遍秒速五厘米:如果

  7. 2020-2021-1 20209307 《Linux内核原理与分析》第九周作业

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)> 这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第九周作业> 这个作业的目标 & ...

  8. 2018-2019-1 20189221《Linux内核原理与分析》第一周作业

    Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...

  9. 2018-2019-1 20189221 《Linux内核原理与分析》第九周作业

    2018-2019-1 20189221 <Linux内核原理与分析>第九周作业 实验八 理理解进程调度时机跟踪分析进程调度与进程切换的过程 进程调度 进度调度时机: 1.中断处理过程(包 ...

  10. 2019-2020-1 20199329《Linux内核原理与分析》第九周作业

    <Linux内核原理与分析>第九周作业 一.本周内容概述: 阐释linux操作系统的整体构架 理解linux系统的一般执行过程和进程调度的时机 理解linux系统的中断和进程上下文切换 二 ...

随机推荐

  1. Java时间格式转换工具类

    把当前时间修改成指定时间 //把当前时间修改成指定时间 public String dateUtil(Integer seconds, String dateFormatPattern){ Date ...

  2. android 自定义TODO

    1.找到setting -> editor -> TODO 2. 正则的写法参考以前的就可以 这样我们就可以自己写一个todo了 3.TODO过滤: 4. 然后选择要展示的TODO 这里就 ...

  3. JAVA编程之——反射Reflect

    说到反射,首先要说一下Java中的类和对象. 在Java中万事万物皆对象(有两个 例外,一个是普通数据类型,另一个是静态的东西,静态的东西不是对象的,是属于类的). 在Java中,类也是对象,类是ja ...

  4. Ubuntu 15.04 双击运行 *.sh、*.py文件

    源 起 之前一直在Windows下用AndoridStudio,今天试了一下在Linux系统Ubuntu 15.04中配置Android Studio: 过程和Windws下差不多,但是最后没有生成桌 ...

  5. Python练习-内置函数的应用

    说真的,我感觉这几天egon没有睡好,或者是egon心里有事儿,练习给留的太过简单了 # 编辑者:闫龙 # 用map来处理字符串列表,把列表中所有人都变成sb,比方alex_sb #name=['al ...

  6. C++ Primer 5th 第14章 重载运算与类型转换

    当运算符作用域类类型的对象时,可以通过运算符重载来重新定义该运算符的含义.重载运算符的意义在于我们和用户能够更简洁的书写和更方便的使用代码. 基本概念 重载的运算符是具有特殊名字的函数:函数名由关键词 ...

  7. 网站发布IIS后堆栈追踪无法获取出错的行号

    一.问题起因 系统发布上线后,有时会发生错误,那么错误的记录就很重要,它对于错误的排查和问题的发现有着重要的作用,通常我们采取的方式为Log日志文件记录和数据库错误记录.文本不会讨论错误记录的方式以及 ...

  8. jQuery核心函数——(一)

  9. pip pytorch安装时出现的问题

    pytorch 的安装命令在官网就有,这里就不说了 执行安装命令 pip3 install http://download.pytorch.org/whl/cu80/torch-0.2.0.post3 ...

  10. Shell-输入密码转换为*

    Code: read -p "请输入使用者都名称:" USER echo -e "请输入使用者密码: \c" while : ;do char=` #这里是反引 ...