Linux内核
文章平均质量分 86
数据存储张
这个作者很懒,什么都没留下…
展开
-
DPDK 入门最佳指南
01 写在前面我的读者当中应该有一部分人是做 DPDK 相关的,我自己虽然现在已经不做 DPDK 了,但对这块仍然有兴趣,今天这篇文章就来总结下 DPDK 的技术栈。注意:这篇文章是小白文,不适合大神哦。文章从 DPDK 的产生背景,到核心技术,再到应用场景,都进行了阐述,有可能是你见过的讲得最全面的文章了,当然,讲得全面自然会少了深度,你如果不屑忽略就好了。02 高性能网络技术随...转载 2019-09-20 10:27:30 · 12870 阅读 · 9 评论 -
Ext2文件系统深度剖析|扩展属性分析
文件的扩展属性扩展属性(xattrs)提供了一个机制用来将键值对(Key/Value)永久地关联到文件,让现有的文件系统得以支持在原始设计中未提供的功能。扩展属性是文件系统不可知论者,应用程序可以通过一个标准的接口来操纵他们,此接口不因文件系统而异。每个扩展属性可以通过唯一的键来区分,键的内容必须是有效的UTF-8,格式为namespace.attribute,每个键采用完全限定的形式,也就是...原创 2019-04-19 10:14:16 · 793 阅读 · 0 评论 -
Ext2文件系统彻底分析 | 磁盘空间分配
历史文章回顾阅读本文最好已经阅读过本号之前的相关文章,如果没有阅读,建议先阅读历史相关文章,具体包括:Ext2文件系统剖析|数据的磁盘布局 Ext4文件系统深度剖析|文件数据的组织 Ext2文件系统深度剖析|读数据流程分析 Ext2文件系统深度剖析|写数据流程在实际写数据到磁盘之前需要分配磁盘上的空间。这里的写数据包括写文件数据、在目录中创建文件和添加扩展属性等等。但凡需要存储新数...原创 2019-04-19 10:07:27 · 798 阅读 · 0 评论 -
Ext2文件系统剖析|数据的磁盘布局
概述Ext2文件系统将磁盘划分为大小相等的逻辑块进行管理,其默认大小是4KB(不做特殊说明,本文后续内容都采用该默认值)。文件系统逻辑块的大小在格式化的时候可以指定的。文件系统将磁盘划分为逻辑块就好像一个大厦划分为若干个房间,或者超市规划为若干货架一样。同时为了便于管理和避免访问冲突,其将若干个逻辑块组成一个大的逻辑块,称为块组(Block Group)。块组是Ext2文件系统的管理单元,块组...原创 2019-04-19 10:04:48 · 712 阅读 · 0 评论 -
Linux 虚拟文件系统(VFS)分析
概述本文将介绍一下Linux的VFS虚拟机文件系统,主要介绍该文件系统在Linux中的作用及概要实现。我们知道在Linux系统中一切皆文件,如果说文件系统是Linux系统的基石一点也不过分。在Linux系统中基本上把其中的所有内容都看作文件,除了我们普通意义理解的文件之外,目录、字符设备、块设备、 套接字、进程、线程、管道等都被视为是一个“文件”。例如对于块设备,我们通过fdisk -l显示块...原创 2019-04-23 08:50:25 · 2272 阅读 · 0 评论 -
带您进入内核开发的大门 | 信号量
配套的代码可以从本号的github下载,https://github.com/shuningzhang/linux_kernel前面我们介绍了Linux内核中的自旋锁的使用和具体的实现。接下来我们介绍一下在Linux内核中使用比较广泛的另外一种锁机制—信号量。信号量又称为信号灯(semaphore),其与自旋锁不同的地方是它可以引起调用者休眠,也就是信号量本质上是一种睡眠锁。如果有一个任务试...原创 2019-04-23 08:30:51 · 286 阅读 · 0 评论 -
带您进入内核开发的大门 | 自旋锁的使用
配套的代码可以从本号的github下载,https://github.com/shuningzhang/linux_kernel自旋锁应该是Linux内核中使用最多的锁了,其它锁很多都依赖自旋锁实现。我们今天先介绍自旋锁,后续在介绍Linux内核的其它互斥机制。从字面意义上我们可以看出,自旋锁处于自旋的状态,什么是自旋状态呢?就是原地打转,不停的循环。下面几点是自旋锁的特点:自旋锁(sp...原创 2019-04-15 09:24:09 · 436 阅读 · 0 评论 -
OCFS2文件系统磁盘布局与基本管理
概述前文已经大概介绍过OCFS2的部署和应用场景,本文及后续文章重点介绍OCFS2文件系统的具体实现。为了便于后续代码的理解,本文首先介绍一下该文件系统关键数据的磁盘布局情况。理解磁盘布局是理解OCFS2文件系统的基础,只有理解了布局,才能更好的理解代码中的各种处理流程。本文介绍基于Linux4.1.12内核,其它版本内核可能稍有不同,但不影响理解。 本文示例文件系统格式化采用默认参数,也...原创 2019-04-10 21:03:16 · 601 阅读 · 0 评论 -
Linux中的SCSI模型及iSCSI示例
在Linux内核中SCSI驱动应该是最为复杂的驱动,没有之一。因为对于整个SCSI系统来说,不只包含一种类型的设备,而是一类设备。前面文章我们简单介绍了Linux操作系统内核中SCSI子系统的整体架构,我们这里简单回忆一下。在Linux内核中抽象了一个称谓SCSI总线的虚拟总线。而在SCSI总线上又包含SCSI的驱动和设备。图1 SCSI体系结构Linux操作系统中的SCSI整个架...原创 2019-04-10 20:31:52 · 4918 阅读 · 0 评论 -
带您进入内核开发的大门 | 内核中的等待队列
配套的代码可以从本号的github下载: https://github.com/shuningzhang/linux_kernel内核相关电子书可以在这里下载: https://u19702000.ctfile.com/dir/19702000-33344559-0b7371/等待队列是一种基于资源状态的线程管理的机制,它可以使线程在资源不满足的情况下处于休眠状态,让出CPU资源,而资源状...原创 2019-03-23 16:18:35 · 412 阅读 · 0 评论 -
OCFS2文件系统的集群管理及分布式锁
任何错误敬请指正!作者: Sunny整体架构OCFS2文件系统整体比较复杂,涉及的内核模块多达七八个。各个内核模块的名称及调用关系如图1所示。为了便于理解,我们对这个软件模块关系进行简化。简化后如图2所示。关于各个模块的详细分析我们放在后面,这样更利于理解。简化后的软件栈变得比较简单,大概分为3层。从下网上分别是集群层,分布式锁和OCFS2文件系统。集群层用于建立一个集群的联系,也就...原创 2018-12-08 21:02:59 · 1774 阅读 · 0 评论 -
Ext4文件系统深度剖析|块组(Block Group)
前文已述,Ext4文件系统将磁盘空间划分为若干组,以这一组为单位管理磁盘空间,这个组叫做块组(Block Group)。那么为什么要划分为块组呢?其主要原因是方便对磁盘的管理,由于磁盘被划分为若干组,因此上层访问数据时碰撞的概率就会大大减小,从而提升文件系统的整体性能。简单来说,块组就是一块磁盘区域,而同时其内部有元数据来管理这部分区域的磁盘。概括来说,我们知道超级块是管理整个文件系统(或者理...原创 2019-04-19 10:16:50 · 7606 阅读 · 2 评论 -
Linux Ext4文件系统的老祖宗长什么样
现代文件系统(例如Ext4和XFS等)具有多种附加特性,不仅扩展了文件系统的应用场景,而且使得文件系统的容错性(例如日志特性)和性能得到很大的提高。而下一代文件系统(例如Btrfs和ZFS)则提供了更加高级的功能特性,比如存储池、RAID支持和快照等特性,使得文件系统超出了严格文件系统的界限,甚至具备的卷管理的能力。文件系统已经发展的如此完善,我们是否有必要在去了解那些老古董。本号以为是有这个...原创 2019-04-20 09:46:08 · 498 阅读 · 0 评论 -
从原理到实现,RAID5原理详解及代码实现浅析
前文我们介绍了Linux下面的RAID技术基本原理,并通过RAID1介绍了其大致的实现流程。今天我们介绍一下RAID5,因为RAID5还是比较复杂的,因此觉得有必要介绍一下。RAID5的算法关于RAID5的算法,我们在网上看到最多的一张图恐怕就是下面这张图了。这张图基本上说明了RAID5的算法,但还不够。在这张图中讲清了RAID5的关键是有一个校验数据块,校验数据块按照规则分布在不同的磁盘...原创 2019-08-29 10:28:41 · 7785 阅读 · 1 评论 -
NVMe的Linux内核驱动分析
关于本文的几点说明:1. 本文基于Linux 4.1.12 版本的内核进行介绍,其它版本的内核代码可能略有不同,但不影响理解。2. 在阅读本文之前,如果能够阅读一下本号之前关于块设备和SCSI的文章,对理解本文将很有帮助。3. 建议阅读本号之前的两篇文章(一篇文章讲清什么是NVMe和理解NVMe的内部实现原理,这一篇就够了)后阅读本文,这样理解的更透彻。前面两篇文章我们对NVM...原创 2019-07-08 08:46:48 · 2721 阅读 · 0 评论 -
一篇文章讲清什么是NVMe
因为NVMe的出现,硬盘的性能得到了极大的提升。这个极大是多少呢?读带宽从500MB/s提高到了3200MB/s,写带宽从400MB/s提高到了1200MB/s左右。而读IOPS则达到了50万,甚至更高。也就是说,现在一块基于NVMe的SSD硬盘的性能比一个企业级磁盘阵列还要好。牛皮吹了这么多,那到底什么是NVMe呢?NVMe的全称是Non-Volatile Memory Express,如果...原创 2019-07-02 08:59:04 · 2838 阅读 · 3 评论 -
进一步理解Linux操作系统的块设备
在前文《理解Linux操作系统的块设备》中我们从比较高层面(Hight Level)介绍了块设备的原理和块设备的特性。但是关于Linux操作系统块设备的实现原理可能还一知半解。本文将进一步深入的分析Linux的块设备,期望能让大家更加深入的理解块设备的实现细节。其实在Linux操作系统中可以非常方便的实现一个块设备,或者说是块设备驱动。在Linux中我们熟知的RAID、多路径和Ceph的RBD...原创 2019-06-21 11:06:08 · 2285 阅读 · 0 评论 -
性能问题的银弹---缓存技术大观
仔细观察一下我们现有的系统,小到一颗CPU,大到一个在线交易系统。任何性能问题都可以通过一种方式有效的解决,这种方式就是缓存。不错,缓存几乎可以成为解决性能问题的银弹,百发百中。缓存的主要目的是降低数据访问延时,实现手段多种多样,下面对不同种类的缓存进行介绍。CPU的缓存能想到的最小粒度的缓存恐怕就是CPU的缓存了。CPU不但有缓存,而且将缓存分成了多种级别,如图1所示,分别是L1、L2和...原创 2019-06-19 20:02:06 · 595 阅读 · 0 评论 -
一篇文章理解Ext4文件系统的目录
使用过Linux的同学应该对Ext4文件系统都有了解。在Linux文件系统中一切皆文件,同样目录也是文件的一种类型。熟悉Linux服务器的同学经常会看到如下内容,这个是某个目录的列表内容。每一行的前面形如drwxr-xr-x的内容为文件的属性,而第一个字符d则表示这个文件是一个特殊的文件,也就是目录(directory)。第一个字符是用于标示文件类型的,对于块设备则是b,字符设备是c等等,每种特殊...原创 2019-06-14 10:25:13 · 6922 阅读 · 1 评论 -
一篇文章理解Linux操作系统中的块设备
块设备也就是存储以“块”为单位存储数据的设备,比较典型的如磁盘设备、光盘或者优盘。本文首先集中在磁盘设备的相关内容的分析,其他设备类型很类似,暂时不做介绍。在Windows操作系统下磁盘设备似乎是一个实实在在的设备,我们可以通过图形界面对磁盘设备进行管理。如图1是Windows下的磁盘管理界面,可以通过这个界面清晰的看到磁盘设备,并且可以对其进行格式化等操作。图1 Windows磁盘设...原创 2019-06-14 10:22:44 · 4515 阅读 · 2 评论 -
TCP"粘包"问题引起的血案
前言关于TCP流TCP是流的概念,解释如下TCP窗口的大小取决于当前的网络状况、对端的缓冲大小等等因素,TCP将这些都从底层屏蔽。开发者无法从应用层获取这些信息。这就意味着,当你在接收TCP数据流的时候无法知道当前接收了有多少数据流,数据可能在任意一个比特位(seq)上。详情见笔者另一篇博客https://my.oschina.net/alchemystar/blog/8339...转载 2019-05-17 20:43:53 · 374 阅读 · 0 评论 -
ZooKeeper面试题整理
1. ZooKeeper是什么? 2. ZooKeeper提供了什么? 3. Zookeeper文件系统 4. ZAB协议? 5. 四种类型的数据节点 Znode 6. Zookeeper Watcher 机制 -- 数据变更通知 7. 客户端注册Watcher实现 8. 服务端处理Watcher实现 9. 客户端回调Watcher 10. ACL权限控制机制UGO(User/...转载 2019-05-10 13:36:49 · 5324 阅读 · 0 评论 -
Linux操作系统中的namespace是个什么鬼
在初步的了解 docker 后,笔者期望通过理解 docker 背后的技术原理来深入的学习和使用 docker,接下来的几篇文章简单的介绍下 linux namespace 的概念以及基本用法。namespace 的概念namespace 是 Linux 内核用来隔离内核资源的方式。通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相...转载 2019-05-07 09:23:47 · 4333 阅读 · 0 评论 -
Linux命令行使用技巧
想起听得最多的就是 *nux 的初学者说最烦就是Linux/Unix 的命令行,所以就有了本文。其实,命令行适应了,可能比图形界面更有效率。至少对我来说是这样,我现在一看见那些所谓的 IDE 就有眼花缭乱感觉,真正用来写代码的面积都被挤到只有一包烟那么大了,呵呵。有时为找个选项花很长时间找对话框,也很痛苦吧。 为什么那么多人害怕命令行呢? 我想最大的问题就是很多人觉得命令行的输入和编辑转载 2016-09-15 18:09:44 · 694 阅读 · 0 评论 -
access_ok | 检查用户空间内存块是否可用
access_ok() 函数是用来代替老版本的 verify_area() 函数的。它的作用也是检查用户空间指针是否可用。函数原型:access_ok (type, addr, size);变量说明:type : 访问类型,其值可为 VERIFY_READ 或者 VERIFY_WRITE 。注意,VERIFY_WRITE 是 VERIFY_READ 的超集转载 2014-11-01 12:07:51 · 1811 阅读 · 0 评论 -
get_ds, set_fs, get_fs函数的使用
在linux内核编程时,进行系统调用(如文件操作)时如果要访问用户空间的参数,可以用set_fs,get_ds等函数实现访问。get_ds获得kernel的内存访问地址范围(IA32是4GB),set_fs是设置当前的地址访问限制值,get_fs是取得当前的地址访问限制值。进程由用户态进入核态,linux进程的task_struct结构中的成员addr_limit也应该由0xBFFFFFFF变为0原创 2014-11-01 13:24:09 · 1667 阅读 · 0 评论 -
Linux 内核引导参数简介
版权声明本文作者是一位开源理念的坚定支持者,所以本文虽然不是软件,但是遵照开源的精神发布。无担保:本文作者不保证作品内容准确无误,亦不承担任何由于使用此文档所导致的损失。自由使用:任何人都可以自由的阅读/链接/打印此文档,无需任何附加条件。名誉权:任何人都可以自由的转载/引用/再创作此文档,但必须保留作者署名并注明出处。其他作品本文作者十分愿意与他人分享劳动成果,如果你转载 2014-07-23 19:49:57 · 2558 阅读 · 0 评论 -
linux内核启动参数
Linux内核启动参数 Console Options 参数说明选项内核配置/文件 console=Options用于说明输出设备ttyn 终端 ttySn[,options],转载 2014-07-23 19:47:04 · 973 阅读 · 0 评论 -
从开机加电到main函数执行前的过程
第一步:启动BIOS CPU加电后首先工作在16位实模式下, 1.启动BIOS是通过硬件的特殊设计完成的。加电瞬间强行置CS:0xFFFF,IP:0x0000,如此CS:IP就指向0xFFFF0。BIOS的入口地址即为0xFFFF0 2.定位BIOS后便开始执行BIOS代码(比如自检)。最重要的任转载 2014-07-22 19:17:11 · 694 阅读 · 0 评论 -
Linux用户空间与内核空间
Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中。Linux内核地址映射模型x86 CPU采用了段页式地址映射模型。进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存转载 2014-07-20 20:01:56 · 559 阅读 · 0 评论 -
linux内核内存管理(zone_dma zone_normal zone_highmem)
Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中。 Linux内核地址空间划分通常32位Linux内核地址空间划分0~3G为用户空间,3~4G为内核空间。注意这里是32位内核地址空间划分,64位内核地转载 2014-07-20 16:39:37 · 2366 阅读 · 0 评论 -
Linux操作系统启动过程详解
如果你对Linux操作系统有一定的了解,想对其更深层次的东西做进一步探究。这当中就包括系统的启动流程、文件系统的组成结构、基于动态库和静态库的程序在执行时的异同、协议栈的架构和原理、驱动程序的机制等等。其中Linux操作系统启动过程肯定是大家最有兴趣了解的,这里在综合了现有网上大家智慧的基础上,基于2.6.32的内核的CentOS 6.0系统,对Linux的启动流程做了些分析,希望对大家有转载 2014-07-20 10:46:28 · 1177 阅读 · 0 评论 -
linux 启动过程分析
Linux系统启动过程分析 主要内容: 1. 启动过程几个主要文件简介 2. 开机过程详细说明 3. 开机过程详图 启动过程中的几个主要文件及其作用:文件名称(按照加载次序列出) 作用/etc/inittab定义在进入或切换各个级别时系统需要执行的动作init在初始化转载 2014-07-20 20:05:50 · 616 阅读 · 0 评论 -
深入理解Linux中内存管理
前一段时间看了《深入理解Linux内核》对其中的内存管理部分花了不少时间,但是还是有很多问题不是很清楚,最近又花了一些时间复习了一下,在这里记录下自己的理解和对Linux中内存管理的一些看法和认识。 我比较喜欢搞清楚一个技术本身的发展历程,简而言之就是这个技术是怎么发展而来的,在这个技术之前存在哪些技术,这些技术有哪些特点,为什么会被目前的技术所取代,而目前的技术又解决了之前的技术所存在转载 2014-07-19 11:48:48 · 715 阅读 · 0 评论 -
Linux slab 分配器剖析
动态内存管理内存管理的目标是提供一种方法,为实现各种目的而在各个用户之间实现内存共享。内存管理方法应该实现以下两个功能:最小化管理内存所需的时间最大化用于一般应用的可用内存(最小化管理开销)内存管理实际上是一种关于权衡的零和游戏。您可以开发一种使用少量内存进行管理的算法,但是要花费更多时间来管理可用内存。也可以开发一个算法来有效地管理内存,但却要使用更多的内存。最终转载 2014-07-19 10:05:22 · 661 阅读 · 0 评论 -
物理内存的描述
为了对内存的初始化内容进行进一步的讨论,我们首先要了解Linux对物理内存的描述机制。1.一致存储结构(UMA)和非一致存储结构(NUMA) 在传统的计算机结构中,整个物理内存都是均匀一致的,CPU访问这个空间中的任何一个地址所需要的时间都相同,所以把这种内存称为“一致存储结构(Uniform Memory Architecture)”,简称UMA。可是,在一些新的系统结构中,特别转载 2014-07-19 10:58:03 · 881 阅读 · 0 评论 -
Linux内核的early_param原理追踪
本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。=============================================================================================================转载 2014-07-24 15:55:50 · 1001 阅读 · 0 评论 -
虚拟地址转换为物理地址
应用程序只能提供一个虚拟地址,也可以通过如下方法获取物理地址,当然得调用驱动。Linux采用页表的概念来管理虚拟空间,内核在处理虚拟地址时都必须将其转换为物理地址,然后处理器才能够访问。虚拟地址可以通过Linux的页表操作宏逐层查找到物理地址,简单来说需要将虚拟地址分段,每段地址都作为索引指向页表,最后一级页表指向物理地址。 Linux在2.6.11以后版本为了兼容各种处理器,采用四级转载 2014-07-24 19:10:47 · 6553 阅读 · 0 评论 -
linux内核模块参数
模块参数一。 param.c#include linux/module.h>#include linux/init.h> MODULE_LICENSE("GPL");static char *name ="feifei";static int age=30;module_param(age,int,S_IRUGO);m转载 2014-11-01 15:08:56 · 863 阅读 · 0 评论 -
barrier 和 preempt_disable() 学习
#define preempt_disable() \do { \ inc_preempt_count(); \ barrier(); \} while (0)一、这个barrier 在干什么... 内存屏障出现因为编译器或现在的处理器常会自作聪明地对指令序列进行一些处理,比如数据缓存,读写指令乱序执行等等。如果优化对象是普通内存,那么一般会提升性能而且不会产生逻辑错转载 2014-09-28 18:59:57 · 680 阅读 · 0 评论