文件系统
文章平均质量分 70
土豆西瓜大芝麻
这个作者很懒,什么都没留下…
展开
-
关于inotify监控mmap内存映射或共享内存相关变动的做法
inotify监控mmap内存映射或共享内存相关变动的做法原创 2022-11-22 11:03:43 · 575 阅读 · 0 评论 -
inotify监控时为什么出现了IN_IGNORED事件
inotify只是监视句柄,并非文件路径(实际上监听的是inode),当文件标示符对应的文件被删除时,这个文件标识符也被自动从inotify中移除,在以上的代码中,也就意味着inotify中没有任何watch标识符了,自然也就不会通知IN_MODIFY事件。这里要注意的是:文件被删除,不一定会产生IN_IGNORED事件,也就是说文件被删除时,不一定会把文件对应的标识符自动从inotify中删除。看来,我的程序是有问题的。三、删除a文件,并重启程序,发现inotify_init注册失败,而errno为2。转载 2022-11-22 10:45:47 · 577 阅读 · 0 评论 -
通俗易懂的进程间通信:管道pipe
前言管道是UNIX环境中历史最悠久的进程间通信方式。本文主要说明在Linux环境上如何使用管道。阅读本文可以帮你解决以下问题:什么是管道和为什么要有管道? 管道怎么分类? 管道的实现是什么样的? 管道有多大? 管道的大小是不是可以调整?如何调整?什么是管道?管道,英文为pipe。这是一个我们在学习Linux命令行的时候就会引入的一个很重要的概念。它的发明人是道格拉斯.麦克罗伊,这位也是UNIX上早期shell的发明人。他在发明了shell之后,发现系统操作执行命令的时候,经常有需求要将转载 2021-09-17 18:55:08 · 2107 阅读 · 0 评论 -
linux下共享内存sharedMemory(shm)和内存映射memorymap的关系
这一段因为持续使用共享内存和内存映射,最早的例子也是从网上找的,然后改了一下满足我们的需求,但底层的区别和联系没有细想。今天因为要测试给认知框架开发的数据共享库涉及到了共享内存,同事问这些事情,而前面看过system V、Posix、XSI的共享内存的关系,但是忘记了。于是又大概看了一下,并进行了仔细思考。 sharedMemory 首先,我们要明确共享内存(shm)的应用场景是什么?也就是在什么场合使用共享内存。一般来说,多进程共享同一内存区域或者跨进程...原创 2021-09-13 23:56:27 · 4732 阅读 · 2 评论 -
mmap内存映射/dev/mem到用户空间
mmap内存映射/dev/mem到用户空间http://blog.sina.com.cn/s/blog_6f5b220601012xbc.html转载 2021-09-13 23:31:08 · 402 阅读 · 0 评论 -
文件锁flock()
场景概述在多线程开发中,互斥锁可以用于对临界资源的保护,防止数据的不一致,这是最为普遍的使用方法。那在多进程中如何处理文件之间的同步呢?我们看看下面的图: 图中所示的是两个进程在无同步的情况下同时更新同一个文件的过程,其主要的操作是:从文件中读取序号。 使用这个序号完成应用程序定义的任务。 递增这个序号并将其写回文件中。从图中可得知两个进程读取分别增加了所读取到的序号,并写回到了文件中,但是如果有相互互斥的话,最后的值应该是1002,而不是所示的10...转载 2021-09-13 19:47:13 · 309 阅读 · 0 评论 -
关于内核中用到的4层寻址方案的解释
前面,我大概讲过iblock[15]用于管理某种数据的地址空间的概念,也画过图,但是总有人会绕晕。在这里用更直白的话解释一下。 背景信息:对于一个传感器,其数据要附加时间信息、空间信息、属性信息等。这些附件的信息可用于检索,目的是实现快速定位满足用户设定条件的数据所在位置。这些数据连同传感器原始数据都存放在一个文件中,那么这些数据要如何组织和存放呢。 (1)分区存放,先预设一个文件大小,然后进行分区,每个分区放不同的数据。例如,前面放原始数据,后面放时间数...原创 2021-09-08 01:57:39 · 297 阅读 · 0 评论 -
R树与空间索引
B树或者B+树可以非常好的处理一维空间存储的问题。B树是一棵平衡树,它是把一维直线分为若干段线段,当我们查找满足某个要求的点的时候,只要去查找它所属的线段即可。依我看来,这种思想其实就是先找一个大的空间,再逐步缩小所要查找的空间,最终在一个自己设定的最小不可分空间内找出满足要求的解。一个典型的B树查找如下:要查找某一满足条件的点,先去找到满足条件的线段,然后遍历所在线段上的点,即可找到答案。B树是一种相对来说比较复杂的数据结构,尤其是在它的删除与插入操作过程中,因为它涉及到了叶子结点的分解.原创 2021-04-13 15:20:49 · 2078 阅读 · 0 评论 -
管理minix中增加的数据索引的三级存储结构代码
这里2020年写的针对minix数据增加索引后,使用三级结构进行管理的相关代码。#ifndef _H_ITREE_INDEX_H#define _H_ITREE_INDEX_H #include <linux/buffer_head.h>#include "minix.h"static unsigned long max_size = 0x7fffffffffffffff;/* added by linbin */enum {IDXDIRECT = 7, IDXDEPTH原创 2021-04-07 14:15:23 · 155 阅读 · 0 评论 -
minix文件系统read函数的调用过程流程图
转载 2021-04-07 11:34:41 · 259 阅读 · 1 评论 -
图解B树的原理及操作
本文主要参考:https://blog.csdn.net/shenchaohao12321/article/details/832433141. B树1.1 B树的定义B树也称B-树,它是一颗多路平衡查找树。我们描述一颗B树时需要指定它的阶数,阶数表示了一个结点最多有多少个孩子结点,一般用字母m表示阶数。当m取2时,就是我们常见的二叉搜索树。一颗m阶的B树定义如下:1)每个结点最多有m-1个关键字。2)根结点最少可以只有1个关键字。3)非根结点至少有Math.ceil(m/2)-原创 2021-03-23 21:56:32 · 21450 阅读 · 7 评论 -
linux 4.4版本中的页高速缓存以及buffer cache
最近要接触相关领域,学习一下共勉!!本文档使用linux为linux-4.4.4版本磁盘高速缓存:是一种软件机制,它允许系统把通常存放在磁盘上的一些数据保留在RAM中,以便对那些数据的进一步访问不用再访问磁盘而能尽快得到满足。 一种对完整的数据页进行操作的磁盘高速缓存。 几乎所有的文件读和写操作都依赖于页高速缓存。只有在O_DIRECT标志被置位而进程打开文件的情况下才会出现例外:此时,IO数据绕过了页高速缓存,而使用了进程用户态地址空间的缓冲区;少数数据库应用软件为了能采用自己的磁盘高速缓存算法而转载 2020-09-23 23:24:01 · 288 阅读 · 0 评论 -
F2FS--针对SSD的文件系统
F2FS: A New File System for Flash Storage0x00 引言SSD有种它自己的特点。Linux的Ext FS,XFS FS等主要还是为HHD设计,优化的出发点也是HHD的工作方式。而SSD的工作方式和HHD有着本质的不同. F2FS是Linux上的一个为SSD设计的FS,另外F2FS是一个Log Structured的FS(所以先看一下[2,3]),现在在很多的智能手机上已经使用了(苹果也号称它的新的APFS是为SSD优化设计的,不过找不到具体技术细节的东西)。转载 2020-09-05 16:35:42 · 2598 阅读 · 0 评论 -
文件系统的缓冲区
什么是文件系统的缓冲区呢?我们说缓冲区,它是内存空间的一个部分也就是说在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。在整个文件系统中有四种类型的缓冲区:dcache inodecache page cache buffer cache那么它们有什么样的作用呢有什么样的区别呢?首先我们来介绍一下 buffer和cache有什么样的不同。buffer是内存的缓冲区,是各进程产生的文件临时存储区。在一定的时间内会统一写入到磁盘,减少磁盘原创 2020-08-24 17:46:44 · 2780 阅读 · 0 评论 -
Linux内核块设备IO和buffer_head
上一篇讲了文件系统计算机底层知识拾遗(四)理解文件系统,说了文件按照inode-block的结构存储在磁盘上。这篇说说操作系统是如何来读取磁盘上的块的Linux把设备分为三种1. 块设备,用来永久存储文件信息的,支持顺序访问和随机访问(按块号访问),比如磁盘,光盘等2. 字符设备,只能顺序访问,比如键盘3. 网络设备,只能顺序访问,比如网卡,蓝牙设备我们常说的一句话是Linux把所有IO设备都当做文件,这句话部完全对,因为网络设备是个例外,块设备和字符设备都可以在文件系统的目..转载 2020-08-22 00:56:19 · 794 阅读 · 0 评论 -
linux文件系统中文件阶段操作truncate
因为要给给文件系统增加数据索引功能,所以对文件系统进行了不少的修改(主要是仿照i_zone[]的方式进行索引数据的管理和存储),但是考虑到文件还有删除或者截断操作,我们就必须面对这个问题,看看文件系统是如何处理的。今天我们来看看ext2和minix是如何截断文件的:即,如何删除那些我们不需要的数据块了。 所谓的截断文件指的是:一个特定长度的文件,我们从某个位置开始丢弃后面的数据,之前的数据依然保留。对具体文件系统来说,截断数据主要意味着两件事情:1. 文件大小发生变化;2. 文件被截断...原创 2020-07-23 10:03:52 · 2280 阅读 · 0 评论 -
Linux内核Page Cache和Buffer Cache关系及演化历史
在我们进行数据持久化,对文件内容进行落盘处理时,我们时常会使用fsync操作(file sync,即文件同步),该操作会将文件关联的脏页(dirty page)数据(实际文件内容及元数据信息)一同写回磁盘。这里提到的脏页(dirty page)即为页缓存(page cache,也叫页高速缓存)。块缓存(buffer cache),则是内核为了加速对底层存储介质的访问速度,而构建的一层缓存。它缓存部分磁盘数据,当有磁盘读取请求时,会首先查看块缓存中是否有对应的数据,如果有的话,则直接将对应数据返回,从而减转载 2020-07-21 14:12:37 · 2258 阅读 · 0 评论 -
Page cache和buffer cache
这一段要在文件系统中对文件的记录增加索引。实现思路是借鉴了i_zone的三级间接寻址方案。i_zone实际上代表了3层意思,第一层是i_zone这个数组本身,它是放在episode_inode中的,只要拿到了episode_inode的指针或者对象,就可以直接访问;第二层,i_zone[0]--i_zone[9]的内容(就是一个blockid)所代表的那9个block、i_zone[7]-i_zone[9]指向的block里面存储的blocksize/4个blockid所代表的那blocksize/4个bl原创 2020-07-13 18:11:57 · 467 阅读 · 0 评论 -
使用PageCache读取文件元数据块
使用PageCache读取文件元数据块Linux 2.4的最大贡献是统一的PageCache与BufferCache,准确来说,它是讲所有数据都保存在了PageCache中,但是仍然保留了BufferCache的接口,以供如superblocks,bitmap,inode table,block table等文件元数据读写的使用。也即,与块设备交互时,我们依然使用bh抽象,但是,bh不会有自己的空间,其使用的是PageCache中对应页的空间。具体文件系统内部使用时,会在页上提供Buffer head抽转载 2020-07-10 13:33:42 · 417 阅读 · 0 评论 -
Linux系统中的高速缓存有哪几种
Linux系统使用了几种涉及到高速缓存的内存管理方法。1 缓冲区高速缓存缓冲区高速缓存中保存着块设备驱动程序所用到的数据缓冲区。这些缓冲区的大小固定,一般包括从块设备中读入的和将要写入到块设备中的信息块。块设备一次只能处理大小固定的数据块。硬盘就是块设备中的一种(这里指的是直接写硬盘这种块设备文件,我们平时用的是直接写普通文件,普通文件是一种文件类型,块设备文件也是一种文件类型,所以这里一定要区分清楚块设备和普通文件的区别)。缓冲区高速缓存使用设备标识符和块号作为索引来快速地查找数据块。块设备只通.转载 2020-07-10 11:30:11 · 934 阅读 · 0 评论 -
Linux内核空间中的高端内存HighMem
Linux内核地址映射模型x86 CPU采用了段页式地址映射模型。进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存。段页式机制如下图。Linux内核地址空间的划分通常32位Linux内核地址空间划分0~3G为用户空间,3~4G为内核空间。注意这里是32位内核地址空间划分,64位内核地址空间划分是不同的。Linux内核高端内存的由来当内核模块代码或线程访问内存时,代码中的内存地址都为逻辑地址,而对应到真正的物理内存地址,需要地址一对一的映射,如逻辑地址0..转载 2020-07-10 11:10:31 · 1403 阅读 · 0 评论 -
buffer_head的理解
在上一篇博客介绍address_space中,我们有提到,内存中一个page所包含的磁盘块在物理上不一定是相邻的。那么page中不同的磁盘块怎么管理呢?这里就涉及到了buffer_head结构。(实际上,我们的epsiode中设定了block大小和page 大小是一样的,都是4k,但buffer_head仍然大量存在,例如sb中的imap zmap,sbh,以及管理blockid的i_zone[10],我们下一步要做的i_index[]可能也得采用它)把块存放在页高速缓存page cache中就会涉及到转载 2020-07-10 10:07:08 · 2953 阅读 · 0 评论 -
dentry与inode
dentry与inode首先看dentry数据结构。位于include/linux/dcache.h中 struct dentryps:dentry虽然是目录的意思,但是在vfs中,目录和文件都有自己的dentry。(dentry中存了文件名,同一文件存在别名就是这个结构实现的) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17转载 2020-07-09 16:19:52 · 1678 阅读 · 1 评论 -
linux文件系统的页高速缓存page cache中的核心数据结构address_space
address_space对象是文件系统中关于内存中页高速缓存的核心数据结构。这篇博客以address_space对象为切入点,分析文件系统的页高速缓存。1背景在文件系统中,内存中存在着dentry和inode结构,其中其分别的作用可以见我另一篇博客《dentry与inode》。由于这些结构要反复使用,所以内存里开辟了目录项高速缓存以及索引结点高速缓存,提高其访问速度。但这里要提到的是另一种高速缓存:页高速缓存,它是一种对完整的数据页进行操作的磁盘高速缓存,即把磁盘的数据块缓存在页高速缓存中。而ad转载 2020-07-09 10:51:21 · 2395 阅读 · 1 评论 -
段式、页式内存管理以及linux采用的方案图解
这两年的工作主要是写一个适用于高速传感器的文件系统,近期要实现在内核中增加对数据记录的索引,已经实现了数据和索引混合存储的方案,但效率低下,所以要实现一个数据和索引分离的机制。索引的方案类似早期minix文件系统中存储文件的blockid的i_data[10]数组类似的ji本篇跟大家说说内存管理,内存管理还是比较重要的一个环节,理解了它,至少对整个操作系统的工作会有一个初步的轮廓,这也难怪面试的时候常问内存管理。干就完事,本文的提纲:正文虚拟内存如果你是电子相关专业的,肯定在大学里.转载 2020-07-03 09:47:32 · 4089 阅读 · 6 评论 -
Linux内核内存管理算法Buddy和Slab
CPU所有的操作都是建立在虚拟地址上处理(这里的虚拟地址分为内核态虚拟地址和用户态虚拟地址),CPU看到的内存管理都是对page的管理,接下来我们看一下用来管理page的经典算法--Buddy。Buddy分配算法假设这是一段连续的页框,阴影部分表示已经被使用的页框,现在需要申请一个连续的5个页框。这个时候,在这段内存上不能找到连续的5个空闲的页框,就会去另一段内存上去寻找5个连续的页框,这样子,久而久之就形成了页框的浪费。为了避免出现这种情况,Linux内核中引入了伙伴系统算法(Buddy sy转载 2020-07-02 16:06:45 · 901 阅读 · 0 评论 -
基于内核模块实现linux内核中文件的读写
在为linux内核编写的模块中,用户空间的open,read,write,llseek等函数都是不可以使用的。而必须使用其在内核中对应的函数。可以使用filp->open配合struct file里的read/write来进行对文件的读写操作。直接上干货(内容自己悟!):例1 :filp->f_op->readfilp_openfilp->f_op->write#include <linux/kernel.h>#include <lin.转载 2020-07-02 14:46:55 · 1406 阅读 · 0 评论 -
Linux为什么一定要copy_from_user ?
网上很多人提问为什么一定要copy_from_user,也有人解答。比如百度一下:但是这里面很多的解答没有回答到点子上,不能真正回答这个问题。我决定写篇文章正式回答一下这个问题,消除读者的各种疑虑。这个问题,我认为需要从2个层面回答 第一个层次是为什么要拷贝,可不可以不拷贝? 第二个层次是为什么要用copy_from_user而不是直接memcpy 为什么要拷贝拷贝这个事情是必须的,这个事情甚至都跟Linux都没有什么关系。比如Linux有个kobject结构体,kobj转载 2020-06-25 00:25:43 · 1067 阅读 · 0 评论 -
linux page cache的同步机制
Page Cache 的同步广义上Cache的同步方式有两种,即Write Through(写穿)和Write back(写回). 从名字上就能看出这两种方式都是从写操作的不同处理方式引出的概念(纯读的话就不存在Cache一致性了,不是么)。对应到Linux的Page Cache上所谓Write Through就是指write(2)操作将数据拷贝到Page Cache后立即和下层进行同步的写操作,完成下层的更新后才返回,可以理解为写穿透page cache直抵磁盘。而Write back正好相反,指的是转载 2020-06-24 15:40:36 · 1361 阅读 · 1 评论 -
linux IO 几种穿透模式解析
在Linux开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络IO,磁盘IO。本篇文件打算详细全面,深入浅出。剖析文件IO的细节。从多个角度探索如何提高IO性能。本文尽量用通俗易懂的视角去阐述。不copy内核代码。 阐述之前,要先有个大视角,让我们站在万米高空,鸟瞰我们的文件IO,它们设计是分层的,分层有2个好处,一是架构清晰,二是解耦。让我们看一下下面这张图。1.穿越各层写文件方式程序的最终目的是要把数据写到磁盘上,但是系统从通用性和性能角...转载 2020-06-24 12:33:32 · 1371 阅读 · 0 评论 -
mmap为什么比read/write快(兼论buffercache和pagecache)
首先说一下文件系统,Linux文件系统的三层结构想必大家多少都了解一些,每个进程中都有一个用户文件描述符表,表项指向一个全局的文件表中的某个表项,文件表表项有一个指向内存inode的指针,每个inode唯一标识一个文件。如果同时有多个进程打开同一文件,他们的用户文件描述符表项指向不同的文件表项,但是这些文件表项会指向同一个inode。 此时又会引出另外一个东东:page cache。内核会为每个文件单独维护一个page cache,用户进程对于文件的大多数读写操作会直接作用到page cach...转载 2020-06-24 11:47:13 · 1477 阅读 · 0 评论 -
linux进程中的内存分布
进程空间分布概述对于一个进程,其空间分布如下图所示:程序段(Text):程序代码在内存中的映射,存放函数体的二进制代码。初始化过的数据(Data):在程序运行初已经对变量进行初始化的数据。未初始化过的数据(BSS):在程序运行初未对变量进行初始化的数据。栈 (Stack):存储局部、临时变量,函数调用时,存储函数的返回指针,用于控制函数的调用和返回。在程序块开始时自动分配内存,结束时自动释放内存,其操作方式类似于数据结构中的栈。堆 (Heap):存储动态内存分配,需要程序员手工.原创 2020-06-18 11:10:48 · 7149 阅读 · 0 评论 -
mmap是什么,为什么?
这一段搞文件系统的索引的事情,因为使用的copy from user 和copy to user等方式,进行核内核外数据交换,效率较低。例如,对于使用O_DIRECT方式的写操作,因为要加索引,所以刚开始原始数据在iovec中,但是内核态并不能对它修改。需要先复制到内核空间,然后改完之后,复制回用户空间,来回复制太麻烦了。考虑到效率问题,开始研究mmap这种方式,最起码它不需要再核内核外进行交换了,最少是少了一次复制。mmap基础概念mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进原创 2020-06-14 16:57:49 · 1533 阅读 · 0 评论 -
linux文件读取中的Readahead预读机制
Readahead预读机制由于内存的速度比磁盘速度快很多,如果每一次访问文件数据都要从磁盘读取一次数据,就会导致非常严重的时延。因此Linux为了提高性能,通过page cache机制,将多个用户数据缓存在内存当中,从而避免多次再磁盘读取。Readahead预读机制正是将用户数据缓存到内存的方法之一。Readahead机制的介绍Readahead预读机制是Linux针对顺序读的性能优化机制。它的核心思想是当用户访问连续多个page的时候,一次性将多个连续的页从磁盘读取到内存中,从而避免多次与磁盘转载 2020-06-04 15:36:17 · 5302 阅读 · 0 评论 -
宋宝华: 文件读写(BIO)波澜壮阔的一生
前言网上关于BIO和块设备读写流程的文章何止千万,但是能够让你彻底读懂读明白的文章实在难找,可以说是越读越糊涂!我曾经跨过山和大海 也穿过人山人海我曾经问遍整个世界 从来没得到答案本文用一个最简单的read(fd, buf, 4096)的代码,分析它从开始读到读结束,在整个Linux系统里面波澜壮阔的一生。本文涉及到的代码如下:#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#inc转载 2020-06-04 14:26:14 · 424 阅读 · 0 评论 -
linux内存管理之PAE(物理地址扩展)解决内存大于4G的问题
Intel处理器从80386到Pentium使用32位物理地址,理论上,这样可以访问4GB的RAM。然而,大型服务器需要大于4GB的RAM来同时运行数以千计的进程,所以必须扩展32位80x86所支持的RAM容量。(这里是不是了解了为啥叫x86啊,这个x代表1个数字,最小为3,表示早期的386系列CPU以及之后的系列,只不过最新的系列不再按照x86命名了) Intel通过在它...原创 2020-04-29 11:03:52 · 3286 阅读 · 0 评论 -
linux分段内存管理中的GDT,LDT,GDTR,LDTR
本文是对上一篇文章《逻辑地址、线性地址、物理地址的关系以及段寄存器在不同位数CPU中的用途演变以及GDT LDT PGD PT的关系》的补充。一. 寻址方式:实地址模式和保护地址模式我们知道,内存寻址模式在早期是采用的实地址模式(intel 80286之前),后面发展到了保护模式(80286开始)。在8086的时候,也就是16位cpu的时候,CPU配备了4个16位段寄存器(CS代码段寄存器...原创 2020-04-29 10:04:25 · 3082 阅读 · 0 评论 -
逻辑地址、线性地址、物理地址的关系以及段寄存器在不同位数CPU中的用途演变以及GDT LDT PGD PT的关系
历史 许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小,但还是可以容纳当时的程序。但随着图形界面的兴起还有用户需求的不断增大,应用程序的规模也随之膨胀起来,终于一个难题出现在程序员的面前,那就是应用程序太大以至于内存容纳不下该程序,通常解决的办法是把程序分割成许多称为覆...原创 2020-04-28 15:47:09 · 5612 阅读 · 2 评论 -
使用dd命令读取linux文件系统指定block的数据
1.通过debugfs查看指定文件的块号①df -h 查看文件系统列表,找到对应的设备;或者在要查看的文件目录执行df ./②debugfs 文件系统通过 blocks 文件路径 看文件的块号。一个文件占据的块号并不一定连续。2. dd命令读指定块号的内容dd if=文件系统路径 of=输出路径 bs=4096 count=1 skip=块号例如:dd if...原创 2020-04-27 11:26:31 · 3130 阅读 · 0 评论 -
如何查看linux上一个文件系统的超级块superblock的信息
#命令行的方式:先用df命令查看一下各个分区的挂载找到是linux的ext*文件系统后,找到设备名(如/dev/*)注意如果不是linux文件系统,使用dumpe2fs命令会报错使用sudo dumpe2fs /dev/*即可查看到superblock内容展示(可能会非常长哦)dumpe2fs 1.42.13 (17-May-2015)Filesystem volume nam...原创 2020-04-27 11:16:36 · 5485 阅读 · 1 评论