12 土豆西瓜大芝麻

尚未进行身份认证

我要认证

暂无相关简介

等级
TA的排名 1w+

使用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

Linux系统中的高速缓存有哪几种

Linux系统使用了几种涉及到高速缓存的内存管理方法。1 缓冲区高速缓存缓冲区高速缓存中保存着块设备驱动程序所用到的数据缓冲区。这些缓冲区的大小固定,一般包括从块设备中读入的和将要写入到块设备中的信息块。块设备一次只能处理大小固定的数据块。硬盘就是块设备中的一种(这里指的是直接写硬盘这种块设备文件,我们平时用的是直接写普通文件,普通文件是一种文件类型,块设备文件也是一种文件类型,所以这里一定要区分清楚块设备和普通文件的区别)。缓冲区高速缓存使用设备标识符和块号作为索引来快速地查找数据块。块设备只通.

2020-07-10 11:30:11

Linux内核空间中的高端内存HighMem

Linux内核地址映射模型x86 CPU采用了段页式地址映射模型。进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存。段页式机制如下图。Linux内核地址空间的划分通常32位Linux内核地址空间划分0~3G为用户空间,3~4G为内核空间。注意这里是32位内核地址空间划分,64位内核地址空间划分是不同的。Linux内核高端内存的由来当内核模块代码或线程访问内存时,代码中的内存地址都为逻辑地址,而对应到真正的物理内存地址,需要地址一对一的映射,如逻辑地址0..

2020-07-10 11:10:31

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

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

linux文件系统的页高速缓存page cache中的核心数据结构address_space

address_space对象是文件系统中关于内存中页高速缓存的核心数据结构。这篇博客以address_space对象为切入点,分析文件系统的页高速缓存。1背景在文件系统中,内存中存在着dentry和inode结构,其中其分别的作用可以见我另一篇博客《dentry与inode》。由于这些结构要反复使用,所以内存里开辟了目录项高速缓存以及索引结点高速缓存,提高其访问速度。但这里要提到的是另一种高速缓存:页高速缓存,它是一种对完整的数据页进行操作的磁盘高速缓存,即把磁盘的数据块缓存在页高速缓存中。而ad

2020-07-09 10:51:21

段式、页式内存管理以及linux采用的方案图解

这两年的工作主要是写一个适用于高速传感器的文件系统,近期要实现在内核中增加对数据记录的索引,已经实现了数据和索引混合存储的方案,但效率低下,所以要实现一个数据和索引分离的机制。索引的方案类似早期minix文件系统中存储文件的blockid的i_data[10]数组类似的ji本篇跟大家说说内存管理,内存管理还是比较重要的一个环节,理解了它,至少对整个操作系统的工作会有一个初步的轮廓,这也难怪面试的时候常问内存管理。干就完事,本文的提纲:正文虚拟内存如果你是电子相关专业的,肯定在大学里.

2020-07-03 09:47:32

Linux内核内存管理算法Buddy和Slab

CPU所有的操作都是建立在虚拟地址上处理(这里的虚拟地址分为内核态虚拟地址和用户态虚拟地址),CPU看到的内存管理都是对page的管理,接下来我们看一下用来管理page的经典算法--Buddy。Buddy分配算法假设这是一段连续的页框,阴影部分表示已经被使用的页框,现在需要申请一个连续的5个页框。这个时候,在这段内存上不能找到连续的5个空闲的页框,就会去另一段内存上去寻找5个连续的页框,这样子,久而久之就形成了页框的浪费。为了避免出现这种情况,Linux内核中引入了伙伴系统算法(Buddy sy

2020-07-02 16:06:45

基于内核模块实现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

Linux为什么一定要copy_from_user ?

网上很多人提问为什么一定要copy_from_user,也有人解答。比如百度一下:但是这里面很多的解答没有回答到点子上,不能真正回答这个问题。我决定写篇文章正式回答一下这个问题,消除读者的各种疑虑。这个问题,我认为需要从2个层面回答 第一个层次是为什么要拷贝,可不可以不拷贝? 第二个层次是为什么要用copy_from_user而不是直接memcpy 为什么要拷贝拷贝这个事情是必须的,这个事情甚至都跟Linux都没有什么关系。比如Linux有个kobject结构体,kobj

2020-06-25 00:25:43

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

linux IO 几种穿透模式解析

在Linux开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络IO,磁盘IO。本篇文件打算详细全面,深入浅出。剖析文件IO的细节。从多个角度探索如何提高IO性能。本文尽量用通俗易懂的视角去阐述。不copy内核代码。 阐述之前,要先有个大视角,让我们站在万米高空,鸟瞰我们的文件IO,它们设计是分层的,分层有2个好处,一是架构清晰,二是解耦。让我们看一下下面这张图。1.穿越各层写文件方式程序的最终目的是要把数据写到磁盘上,但是系统从通用性和性能角...

2020-06-24 12:33:32

mmap为什么比read/write快(兼论buffercache和pagecache)

首先说一下文件系统,Linux文件系统的三层结构想必大家多少都了解一些,每个进程中都有一个用户文件描述符表,表项指向一个全局的文件表中的某个表项,文件表表项有一个指向内存inode的指针,每个inode唯一标识一个文件。如果同时有多个进程打开同一文件,他们的用户文件描述符表项指向不同的文件表项,但是这些文件表项会指向同一个inode。 此时又会引出另外一个东东:page cache。内核会为每个文件单独维护一个page cache,用户进程对于文件的大多数读写操作会直接作用到page cach...

2020-06-24 11:47:13

linux进程中的内存分布

进程空间分布概述对于一个进程,其空间分布如下图所示:程序段(Text):程序代码在内存中的映射,存放函数体的二进制代码。初始化过的数据(Data):在程序运行初已经对变量进行初始化的数据。未初始化过的数据(BSS):在程序运行初未对变量进行初始化的数据。栈 (Stack):存储局部、临时变量,函数调用时,存储函数的返回指针,用于控制函数的调用和返回。在程序块开始时自动分配内存,结束时自动释放内存,其操作方式类似于数据结构中的栈。堆 (Heap):存储动态内存分配,需要程序员手工.

2020-06-18 11:10:48

mmap是什么,为什么?

这一段搞文件系统的索引的事情,因为使用的copy from user 和copy to user等方式,进行核内核外数据交换,效率较低。例如,对于使用O_DIRECT方式的写操作,因为要加索引,所以刚开始原始数据在iovec中,但是内核态并不能对它修改。需要先复制到内核空间,然后改完之后,复制回用户空间,来回复制太麻烦了。考虑到效率问题,开始研究mmap这种方式,最起码它不需要再核内核外进行交换了,最少是少了一次复制。mmap基础概念mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进

2020-06-14 16:57:49

Linux内核中的likely()和unlikely()宏

在Linux内核代码中经常看到likely()和unlikely()这两个宏,它们都是对bool变量进行判定,其定义如下:# define likely(x)__builtin_expect(!!(x), 1)# define unlikely(x)__builtin_expect(!!(x), 0)其中__builtin_expect()函数是gcc提供的用于对分支语句进行优化,其原型如下:long __builtin_expect (long exp, long c)当exp ==..

2020-06-04 17:42:49

linux文件读取中的Readahead预读机制

Readahead预读机制由于内存的速度比磁盘速度快很多,如果每一次访问文件数据都要从磁盘读取一次数据,就会导致非常严重的时延。因此Linux为了提高性能,通过page cache机制,将多个用户数据缓存在内存当中,从而避免多次再磁盘读取。Readahead预读机制正是将用户数据缓存到内存的方法之一。Readahead机制的介绍Readahead预读机制是Linux针对顺序读的性能优化机制。它的核心思想是当用户访问连续多个page的时候,一次性将多个连续的页从磁盘读取到内存中,从而避免多次与磁盘

2020-06-04 15:36:17

宋宝华:关于Ftrace的一个完整案例

本文目录Ftrace简介 Ftrace案例 Ftrace结果怎么读? vim进行Ftrace折叠Ftrace简介Ftrace是Linux进行代码级实践分析最有效的工具之一,比如我们进行一个系统调用,出来的时间过长,我们想知道时间花哪里去了,利用Ftrace就可以追踪到一级级的时间分布。Ftrace案例写一个proc模块,包含一个proc的读和写的入口。test_proc_show()故意调用了一个kill_time()的函数,而kill_time()的函数,又调用了mde..

2020-06-04 14:41:32

宋宝华: 文件读写(BIO)波澜壮阔的一生

前言网上关于BIO和块设备读写流程的文章何止千万,但是能够让你彻底读懂读明白的文章实在难找,可以说是越读越糊涂!我曾经跨过山和大海 也穿过人山人海我曾经问遍整个世界 从来没得到答案本文用一个最简单的read(fd, buf, 4096)的代码,分析它从开始读到读结束,在整个Linux系统里面波澜壮阔的一生。本文涉及到的代码如下:#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#inc

2020-06-04 14:26:14

[IO系统]01 IO子系统

从整个IO调用链层面俯视整个链路,其穿越“千山万水”,最终会到胜利的彼岸——“设备层”接下来,分别说明每个层次的主要功能,后续文章再详细分析和说明。1.1应用顾名思义,应用就是程序,是用户态的。用户在进行IO读写操作编程时,有两种方法:1. 直接通过系统调用(如sys_open,sys_read,sys_write等等)操作文件,但是这种方法不够方便。2. 通过glib库提供的函数进行文件操作,如open/fopen,read/fread, write/fwrite等,gl...

2020-06-04 11:35:43

查看更多

勋章 我的勋章
  • 签到新秀
    签到新秀
    累计签到获取,不积跬步,无以至千里,继续坚持!
  • 新人勋章
    新人勋章
    用户发布第一条blink获赞超过3个即可获得
  • 阅读者勋章Lv1
    阅读者勋章Lv1
    授予在CSDN APP累计阅读博文达到3天的你,是你的坚持与努力,使你超越了昨天的自己。
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 1024勋章
    1024勋章
    #1024程序员节#活动勋章,当日发布原创博客即可获得
  • 勤写标兵Lv4
    勤写标兵Lv4
    授予每个自然周发布9篇以上(包括9篇)原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。