linux之根文件系统

article/2025/9/19 19:38:41

前言

1、板卡上电后首先由UBOOT启动初始化板卡,将Linux内核移到内存中运行

2、由linux内核自行做了初始化等操作,挂在了第一个应用程序上(根文件系统/linuxrc)

3、根文件系统会提供磁盘管理服务,glibc设备节点,配置文件,应用程序shell(Android就是一个Linux多了个文件系统)

文件系统的重要组成

宏观:

1、标准库,glibc, OpenGL,media,Framework

2、配置文件 /etc/init.d/rcS 想要开机运行什么软件,载入什么画面 执行什么命令,都可以写在rcs

​ ** sys/ 开机要挂载的设备节点**

3、设备节点: /dev/console 控制台节点

/dev/null

4、架构程序:对多种服务和功能进行系统接口封装

5、SEHLL的实现:对所有的shell命令都在文件系统中

根文件系统就是最小的文件系统

索引节点和目录项

  • 索引节点,简称为 inode,用来记录文件的元数据,比如 inode 编号、文件大小、访问 权限、修改日期、数据的位置等。索引节点和文件一一对应,它跟文件内容一样,都会 被持久化存储到磁盘中。所以记住,索引节点同样占用磁盘空间。

  • 目录项,简称为 dentry,用来记录文件的名字、索引节点指针以及与其他目录项的关联 关系。多个关联的目录项,就构成了文件系统的目录结构。不过,不同于索引节点,目录项是由内核维护的一个内存数据结构,所以通常也被叫做目录项缓存。

    image-20220227080742513

    常见的文件系统有三类:基于磁盘的文件系统基于内存的文件系统网络文件系统。这些文件系统,要先挂载到 VFS 目录树中的某个子目录(称为挂载点),然后才能访问其中的文件。拿第一类,也就是基于磁盘的文件系统为例,在安装系统时,要先挂载一个根 目录(/),在根目录下再把其他文件系统(比如其他的磁盘分区、/proc 文件系统、/sys 文件系统、NFS 等)挂载进来。

    image-20220226220418875

文件系统IO

文件读写方式的各种差异,导致 I/O 的分类多种多样。最常见的有:

​ **缓冲与非缓冲 I/O **

直接与非直接 I/O

阻塞与非阻塞 I/O

同步与异步 I/O 等*

​ 1、缓冲与非缓冲 I/O:根据是否利用标准库缓存,可以把文件 I/O 分为缓冲 I/O 与非缓冲 I/O。缓冲 I/O,是指利用标准库缓存来加速文件的访问,而标准库内部再通过系统调度访问文件。非缓冲 I/O,是指直接通过系统调用来访问文件,不再经过标准库缓存。

注意,这里所说的“缓冲”,是指标准库内部实现的缓存。比方说,你可能见到过,很多程序遇到换行时才真正输出,而换行前的内容,其实就是被标准库暂时缓存了起来。无论缓冲 I/O 还是非缓冲 I/O,它们最终还是要经过系统调用来访问文件。我们知道,系统调用后,还会通过页缓存,来减少磁盘的 I/O 操作。
2、直接IO和非直接IO:根据是否利用操作系统的页缓存,可以把文件 I/O 分为直接 I/O 与非直接 I/O。直接 I/O,是指跳过操作系统的页缓存,直接跟文件系统交互来访问文件。非直接 I/O 正好相反,文件读写时,先要经过系统的页缓存,然后再由内核或额外的系统调用,真正写入磁盘。想要实现直接 I/O,需要你在系统调用中,指定 O_DIRECT 标志。如果没有设置过,默认 的是非直接 I/O。不过要注意,直接 I/O、非直接 I/O,本质上还是和文件系统交互。如果是在数据库等场景中,还会看到,跳过文件系统读写磁盘的情况,也就是我们通常所说的裸 I/O。

3、阻塞与非阻塞 I/O :根据应用程序是否阻塞自身运行,可以把文件 I/O 分为阻塞 I/O 和非阻塞 I/O。所谓阻塞 I/O,是指应用程序执行 I/O 操作后,如果没有获得响应,就会阻塞当前线程,自然就不能执行其他任务。所谓非阻塞 I/O,是指应用程序执行 I/O 操作后,不会阻塞当前的线程,可以继续执行其他的任务,随后再通过轮询或者事件通知的形式,获取调用的结果。

比方说,访问管道或者网络套接字时,设置 O_NONBLOCK 标志,就表示用非阻塞方式访问;而如果不做任何设置,默认的就是阻塞访问。

4、同步IO和异步IO:根据是否等待响应结果,可以把文件 I/O 分为同步和异步 I/O。

所谓同步 I/O,是指应用程序执行 I/O 操作后,要一直等到整个 I/O 完成后,才能获得 I/O 响应。

所谓异步 I/O,是指应用程序执行 I/O 操作后,不用等待完成和完成后的响应,而是继续执行就可以。等到这次 I/O 完成后,响应会用事件通知的方式,告诉应用程序。

例如,在操作文件时,如果设置了 O_SYNC 或者 O_DSYNC 标志,就代表同步 I/O。如果设置了 O_DSYNC,就要等文件数据写入磁盘后,才能返回;而 O_SYNC,则是在 O_DSYNC 基础上,要求文件元数据也要写入磁盘后,才能返回。

再比如,在访问管道或者网络套接字时,设置了 O_ASYNC 选项后,相应的 I/O 就是异步I/O。这样,内核会再通过 SIGIO 或者 SIGPOLL,来通知进程文件是否可读写。

我们可能发现了,这里的好多概念也经常出现在网络编程中。比如非阻塞 I/O,通常会跟 select/poll 配合,用在网络套接字的 I/O 中。

我们可能发现了,这里的好多概念也经常出现在网络编程中。比如非阻塞 I/O,通常会跟 select/poll 配合,用在网络套接字的 I/O 中。


http://chatgpt.dhexx.cn/article/hvKeG4M8.shtml

相关文章

Linux:根文件系统构建

文章目录 一、编译 BusyBox 构建根文件系统1.创建BusyBox路径并解压2.修改顶层Makefile3.修改 busybox 源码4.配置busybox5.编译busybox6.向 rootfs 的“/lib”目录添加库文件7.向 rootfs 的“usr/lib”目录添加库文件创建其他文件夹 二、NFS挂载根文件系统1.bootargs 环境变量…

制作嵌入式Linux根文件系统

文章目录 1. 根文件系统布局2. 使用BusyBox生成二进制工具2-1. 获取BusyBox源码2-2. 配置BusyBox2-2-1. 选择编译静态库2-2-2. 选择交叉编译工具链2-2-3. 选择安装目录2-2-4. 编译安装 3. 构建根文件系统3-1. 完善目录结构3-2. 添加C运行库文件3-3. 添加初始化配置脚本3-3-1. 修…

[架构之路-30]:目标系统 - 系统软件 - Linux OS根文件系统rootfs的概念、组成、制作以及用busybox制作根文件系统

目录 前言: 第1章 什么是根文件系统 1.1 什么是文件 1.2 什么是文件系统 1.3 文件系统组织文件的方式:树形结构 1.4 统一的虚拟文件系统 1.5 物理存储介质与物理文件系统类型 1.5 什么是根文件系统 第2章 根文件系统的标准结构 2.1 根文件系统…

安装Ubuntu 16.04时出现:没有定义根文件系统,请到分区菜单修改

在安装Ubuntu 16.04时,尤其是选项空闲硬盘新建分区安装时,容易出现这种情况,这个是由于没有配置挂载点导致的,解决方法如下: 在挂在点输入“/”。 原理: Linux和Windows的文件系统不一样&#x…

Ubuntu提示“没有根文件系统 ”

安装Ubuntu时,提示“没有定义根文件系统” 原因:分区错误 解决: 将Ubuntu分区,删除重新创建分区,注意挂载点为“/” 此时就可以单击“继续”,进行下一步安装 以上分区方式,是没有交换分区的,下面提供两种带交换分区的分区方式: 第一种,包含4个分区,分别为 /分区(…

安装linux显示没有定义根文件系统,XP用Wubi安装Ubuntu提示“没有定义根文件系统,请返回分区菜单...

在安装Ubuntu时,到自定义分区一步时,会出现“没有根文件系统”,这时千万别将硬盘分区表重建,那样会让硬盘到数据都格式化到,你只需在ext4 或者 ext3 分区项上双击,加上挂载点为“\”就可以了。 有图有真相&…

在虚拟机安装中遇到的问题

问题一:在命令行模式下输入ifconfig时,显示系统不能识别这个命令,需要安装,输入sudo apt install net-tools。 问题二:sudo命令输入密码时,光标不移动,只要输入正确密码,回车就可以。…

安装Ubuntu时,提示“没有根文件系统 ”

安装Ubuntu时,提示“没有定义根文件系统” 原因:分区错误 解决: 将Ubuntu分区,删除重新创建分区,注意挂载点为“/” 此时就可以单击“继续”,进行下一步安装 以上分区方式,是没有交换分区的&a…

synchronized,voliate-详解

一.synchronized底层原理: synchronized关键字,在底层编译后的jvm指令中,会有monitorenter(枷锁)和monitorexit(释放锁)两个指令. monitorenter指令执行的时候会干什么呢? 每个对象都有一个关联的monitor,比如一个对象实例就有一个monitor…

volatile的作用及原理

前言 voliate关键字的两个作用: 1、 保证变量的可见性:当一个被volatile关键字修饰的变量被一个线程修改的时候,其他线程可以立刻得到修改之后的结果。当一个线程向被volatile关键字修饰的变量写入数据的时候,虚拟机会强制它被值刷…

voliate和synchronized

线程安全考虑三个方面:原子性,可见性,有序性 为什么使用voliate关键字? 正常情况下编译器为了加快程序运行的速度,对一些变量的写操作会先在寄存器或者是CPU缓存上进行,最后才写入内存.而在这个过程,变量的新值对其他线程是不可…

关于voliate关键字

现象 private static boolean is false;public static void main(String[] args) {new Thread(new Runnable() {Overridepublic void run() {System.out.println("thread 1 start");while (!is) {}System.out.println("thread 1 end");}}).start();try {T…

并发专题之---Voliate引发的各种原理问题

文章目录 前言JMMvoliate不保证原子性不保证原子性的解释AtomicInteger解决不保证原子性的问题为什么AtomicInteger可以解决原子性问题?CASCAS的内部原理CAS的缺点ABA问题原子引用解决ABA问题 禁止指令重排多线程环境下单例模式出现的问题双端检索机制解决办法双端检索机制的隐…

voliate类型的原理及用法

voliate类型,机器才读取执行代码读取内存后,将读取的内容存到高速缓冲区里,在硬件里是寄存器,这样在一下次读取的时候就可以直接从高速缓存区里面读取(cache),这也是读取速度加快的原因,但是如果…

voliate(轻量级的同步机制)

voliate特点: JMM内存模型三大特性:可见性,原子性,有序性。 1.禁止指令重排序: voliate实现禁止指令重排,避免多线程环境下程序出现乱序执行的现象。 多线程环境中线程交替执行,由于编译器优化重排的…

voliate工作实际应用场景

哈喽大家好,我是IT老哥,今天我们来讲讲面试必问的voliate 单线程的情况下呢,我们肯定用不到这个voliate 只有在多线程的情景下才能用到,文章结尾我会举一个经典的案例 voliate三特性 保证可见性;不保证复合操作的原子性…

voliate原理

voliate原理 voliate 当使用voliate关键字修饰共享变量(实例变量、静态变量)时,它将具备两个特性:可见性和禁止指令重排序优化 1.可见性 变量被修改后,会立即保存在主存中,并清除工作内存中的值。新值对于线程来说都是可见的…

C语言关键字之voliate

C语言关键字之voliate voliate的作用是作为指令关键字,确保本条指令不会因为编译器的优化而省略,而且要求每次从内存中直接读取值 当使用voliate 声明变量值时,系统总是重新从它所在的内存读取数据,直接访问变量地址&#xff0c…

java中voliate的讲解

Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重…

多线程 - voliate 关键字

介绍 volatile 是 Java 中的关键字,用于修饰变量。它的作用是强制对被修饰的变量的写操作立即刷新到主存中,并强制对该变量的读操作从主存中读取最新的值,而不是使用缓存中的值。 作用 保证变量的可见性: 可见性指的是多个线程…