
linux 內核
文章平均质量分 91
linux 內核
废言Pro
时间加努力
展开
-
FUSE文件系统
Fuse(filesystem in userspace),是一个用户空间的文件系统。通过fuse内核模块的支持,开发者只需要根据fuse提供的接口实现具体的文件操作就可以实现一个文件系统。由于其主要实现代码位于用户空间中,而不需要重新编译内核,这给开发者带来了众多便利。Google在Android 11上,为了实现scoped storage,也引入了fuse。下面我们从Fuse的架构设计以及具体的实现细节来谈一谈fuse文件系统。一、Fuse架构设计...转载 2021-06-17 10:56:12 · 560 阅读 · 0 评论 -
Linux内核快速处理路径尽量多用slab而慎用kmalloc
题目是一个典型 《Effective C++》 的风格。事情是这样的,我大致说一下。我在开发一个Netfilter模块,在PREROUTING匹配一些数据包,显而易见,都能想到使用哈希表hlist作为数据结构的容器,其中装有下面的结构体:struct item { struct hlist_node hnode; char padding[16];};生成ite...转载 2020-04-16 15:57:19 · 320 阅读 · 0 评论 -
Linux链表list_head/hlist_head/hlist_nulls_head的并发性
我们被灌输过各种高效复杂的数据结构,比如rb tree,skip list等等,但现实中,我们经常用各种List管理我们的数据,因为它的操作非常简单。如果数据量小或者不太在乎时间,选择list_head。 如果数据量大且对查找性能要求很高,读多写少的情况下,选择hlist。 如果数据量大且对查找性能要求很高,写操作相对多的情况下,选择hlist_nulls。在涉及并发操作的环境中,对li...转载 2020-04-15 11:07:18 · 324 阅读 · 0 评论 -
xdp-ebpf 简介
根据众多博客资料,言简意赅的介绍xdp-ebpf. 小白一个,个人理解。勿喷!1、bfp:Berkeley Packet Filter, 用于过滤filter 网络报文packet的架构。是tcpdump(linux)和wireshark(windows)乃至网络监控(network monitoring)领域的基石。其...转载 2020-03-25 09:56:13 · 8254 阅读 · 0 评论 -
同样学习Linux, 为何差别这么大? - 论打通Linux进程和内存管理任督二脉
穆赫兰道和内陆帝国我在多年的工程生涯中发现很多工程师碰到一个共性的问题:Linux工程师很多,甚至有很多有多年工作经验,但是对一些关键概念的理解非常模糊,比如不理解CPU、内存资源等的真正分布,具体的工作机制,这使得他们对很多问题的分析都摸不到方向。比如进程的调度延时是多少?Linux能否硬实时?多核下多线程如何执行?系统的内存究竟耗到哪里去了?我写的应用程序究竟耗了多少内存?什么是内存泄漏,...转载 2020-03-23 10:05:36 · 430 阅读 · 0 评论 -
Linux内核为什么会发生soft lockup?
提到soft lockup,大家都不会陌生:BUG: soft lockup - CPU#3 stuck for 23s! [kworker/3:0:32]这个几乎和panic,oops并列,也是非常难以排查甚至比panic更麻烦。至少panic之后你可以去分析一个静态的尸体,然而soft lockup,那是一个动态的过程,甚至转瞬即逝,自带自愈功能。那么soft lockup是由于...转载 2020-03-22 14:22:41 · 4187 阅读 · 1 评论 -
Linux 内核第一宏
list_entry()有着内核第一宏的美称,它被设计用来通过结构体成员的指针来返回结构体的指针。现在就让我们通过一步步的分析,来揭开它的神秘面纱,感受内核第一宏设计的精妙之处。整理分析的思路list_entry()在内核源代码/include/linux目录下的list.h中被定义,如下:在list_entry的定义中,我们看到出现了另外一个宏container_of。而lis...转载 2019-11-07 09:25:46 · 488 阅读 · 0 评论 -
学习Linux必备的硬件基础一网打尽
内容简介:出来混,迟早要还的.....本文详细论述大学时候的基本功,MMU,CACHE, TLB, Page Fault, 进程切换........1.案情回溯某一个夜黑风高的晚上,宋宝华老师组织的微信群一片祥和宁静。我刷着手机,心血来潮往微信群中提出一个疑惑:"宋老师,cache是一个程序维护一份还是所有程序维护一份?你昨天说进程调度损耗还包括cache命中的...转载 2019-11-06 23:51:19 · 489 阅读 · 1 评论 -
深入解读Docker底层技术cgroup系列(总览)
https://blog.youkuaiyun.com/Vince_/article/details/89070001转载 2019-10-09 20:48:02 · 175 阅读 · 0 评论 -
cgroup 原理分析
一. cgroup 相关概念解释Cgroups提供了以下功能:转载 2019-10-09 20:38:18 · 1144 阅读 · 0 评论 -
300来行代码带你实现一个能跑的最小Linux文件系统
Linux作为一个类UNIX系统,其文件系统保留了原始UNIX文件系统的表象形式,它看起来是这个样子:root@name-VirtualBox:/# lsbin boot cdrom dev etc home lib lib64 lost+found media mnt opt proc root run sbin snap srv sys tmp usr varroot@name-...转载 2019-09-03 19:39:06 · 1476 阅读 · 0 评论 -
被神话的Linux, 一文带你看清Linux在多核可扩展性设计上的不足
本文接着《有关微内核OS史上最透彻一篇 - 写于华为鸿蒙发布一周之际》继续写下去。我其实并不想讨论微内核的概念,也并不擅长去阐述概念,这是百科全书的事,但无奈最近由于鸿蒙的发布导致这个话题过火,也就经不住诱惑,加上我又一直比较喜欢操作系统这个话题,就来个老生常谈吧。说起微内核,其性能往往因为IPC饱受诟病。然而除了这个显而易见的 “缺陷” ,其它方面貌似被关注的很少。因此我写点稍微不同的...转载 2019-08-28 09:22:38 · 338 阅读 · 0 评论 -
netlink 011 -- generic netlink 编程入门
一、generic netlink 消息结构消息以流的形式在程序之间进行传递,一个流中可能包含多个消息。对于每个消息消息来说,为了便于维护和方便使用,还需要一些有关记录消息的信息。一个 netlink message 结构如下:其中 nlmsghdr 结构里记录了该条 netlink message 的如下信息:struct nlmsghdr { __u32 ...转载 2019-08-13 15:56:29 · 735 阅读 · 0 评论 -
netlink 0010 -- Generic Netlink 实现通信
前一篇博文中分析了Generic Netlink的消息结构及内核初始化流程,本文中通过一个示例程序来了解Generic Netlink在内核和应用层之间的单播通信流程。示例程序:demo_genetlink_kern.c(内核模块)、demo_genetlink_user.c(应用层Demo程序)、demo_genetlink.h程序主要功能:应用层程序接收用户的输入“字符串”和“数据”向...转载 2019-08-13 15:16:06 · 282 阅读 · 0 评论 -
netlink 009 -- Generic Netlink初始化
Generic Netlink 是内核专门为了扩展netlink协议簇而设计的“通用netlink协议簇”。由于netlink协议最多支持32个协议簇,目前Linux4.1的内核中已经使用其中21个,对于用户需要定制特殊的协议类型略显不够,而且用户还需自行在include/linux/netlink.h中添加簇定义(略显不妥),为此Linux设计了这种通用Netlink协议簇,用户可在此之上定义更...转载 2019-08-13 15:13:05 · 364 阅读 · 0 评论 -
Netlink 0008 --- 通信
在前一篇博文《Netlink 内核实现分析(一):创建》中已经较为详细的分析了Linux内核netlink子系统的初始化流程、内核netlink套接字的创建、应用层netlink套接字的创建和绑定流程,本文来详细的分析一下内核是如何实现netlink消息在内核和应用进程之间全双工异步通信的。一、netlink通信数据结构1、netlink消息报头:structnlmsghdrstru...转载 2019-08-13 14:48:09 · 198 阅读 · 0 评论 -
Netlink 0007 --- 创建实现分析
Netlink 是一种IPC(Inter Process Commumicate)机制,它是一种用于内核与用户空间通信的机制,同时它也以用于进程间通信(Netlink更多用于内核通信,进程之间通信更多使用Unix域套接字)。在一般情况下,用户态和内核态通信会使用传统的Ioctl、sysfs属性文件或者procfs属性文件,这3种通信方式都是同步通信方式,由用户态主动发起向内核态的通信,内核无法主...转载 2019-08-13 14:40:38 · 306 阅读 · 0 评论 -
netlink 0006 --- genetlink代码例子
/* getdelays.c * * Utility to get per-pid and per-tgid delay accounting statistics * Also illustrates usage of the taskstats interface * * Copyright (C) Shailabh Nagar, IBM Corp. 2005 * Copyrig...原创 2019-08-13 14:01:25 · 622 阅读 · 0 评论 -
netlink 0005 -- Generic Netlink详解
netlink socket是一种用于用户态进程和内核态进程之间的通信机制。它通过为内核模块提供一组特殊的API,并为用户程序提供了一组标准的socket接口的方式,实现了全双工的通讯连接。Netlink的特点:双向传输,异步通信 用户空间中使用标准socket API 内核空间中使用专门的API 支持多播 可由内核端发起通信 支持32种协议类型netlink仅支持32种协议...原创 2019-08-13 13:59:39 · 789 阅读 · 0 评论 -
Netlink0004 --- 多播机制的用法
在上一篇博文中我们所遇到的情况都是用户空间作为消息进程的发起者,Netlink还支持内核作为消息的发送方的情况。这一般用于内核主动向用户空间报告一些内核状态,例如我们在用户空间看到的USB的热插拔事件的通告就是这样的应用。先说一下我们的目标,内核线程每个一秒钟往一个多播组里发送一条消息,然后用户空间所以加入了该组的进程都会收到这样的消息,并将消息内容打印出来。Netlink地址结构体中的n...转载 2019-08-13 11:23:33 · 697 阅读 · 0 评论 -
Netlink 0003 -- Netlink动手实践
今天我们来动手演练一下Netlink的用法,看看它到底是如何实现用户-内核空间的数据通信的。我们依旧是在2.6.21的内核环境下进行开发。在文件里包含了Netlink协议簇已经定义好的一些预定义协议:#define NETLINK_ROUTE0/*Routing/device hook*/#define NETLINK_UNUS...转载 2019-08-13 11:13:39 · 301 阅读 · 0 评论 -
linux内核分析及应用 -- 输入输出(下)
5.5 Redis 对 epoll 的封装Redis 的作者和 Nginx 的作者一样,不喜欢引入第三方的库,比如 libevent、libev 来做事件处理,而是自己封装了 epoll,不像 Memcachd 的 I/O 模型还得依赖 libevent。Redis 的 I/O 模型针对不同系统做了不同的实现,比如 Linux 中的实现是对 epoll 的封装,BSD 中的实现是对 kqueu...原创 2019-07-10 13:54:40 · 435 阅读 · 0 评论 -
linux内核分析及应用 -- 输入输出(上)
计算机从诞生之日起就和输入输出(I/O)密不可分,图灵机和冯 · 诺伊曼体系中输入与输出就是基本概念之一。图灵机是一个计算机的理论模型,本质上是状态机;冯 · 诺伊曼体系是图灵机的实现,包括运算、控制、存储、输入、输出五个部分。冯 · 诺伊曼体系相对之前的计算机最大的创新在于程序和数据的存储,以此实现机器内部编程,如图5-1所示。图5-1 冯 · 诺伊曼计算机体系结构我们平时编写的应用...原创 2019-07-10 11:11:37 · 1507 阅读 · 0 评论 -
linux内核分析及应用 -- 中断机制
我们编写的程序在运行的时候,并不会一直占据着 CPU 资源,比如你需要和外部设备做交互(读写磁盘数据、读写网络接口等),那么你就要主动放弃 CPU,当外部设备数据就绪后,就会通过中断机制来通知 CPU 切换回你刚才运行程序的上下文继续往下执行。另外,即使是 CPU 密集型运算的程序,系统也并不仅仅给一个进程来运行。为了对系统中所有的进程公平起见,一般会通过时钟中断的机制,定期打断当前在 CPU...原创 2019-07-03 13:30:16 · 1159 阅读 · 0 评论 -
Linux 的虚拟文件系统(真正理解“一切皆文件”)
Linux 中允许众多不同的文件系统共存,如 ext2, ext3, vfat 等。通过使用同一套文件 I/O 系统 调用即可对 Linux 中的任意文件进行操作而无需考虑其所在的具体文件系统格式;更进一步,对文件的 操作可以跨文件系统而执行。1,引言Linux 中允许众多不同的文件系统共存,如 ext2, ext3, vfat 等。通过使用同一套文件 I/O 系统 调用即可对 L...转载 2019-06-18 23:08:47 · 1089 阅读 · 0 评论 -
linux 内核与分析 -- 内存管理(下)
3.5 Linux 的内存分配和管理下面我们来讨论内存管理的相关问题,通过前面的分析,我认为内存管理需要考虑以下几个问题: 内存经过频繁申请归还之后,会出现碎片,称为外部碎片,导致没有足够大的连续内存空间,如何解决该问题? 被申请占用的内存块没有有效利用,存在浪费称为内部碎片,如何解决? 每次申请完内存之后是否需要刷新进程页表,是否有性能问题? 内存申请是...原创 2019-04-19 08:45:17 · 690 阅读 · 0 评论 -
linux内核分析与应用 -- 内存管理(上)
我们知道,在大部分程序运行的时候,几乎都离不开堆(heap)和栈(stack),所有数据结构的分配也都是在堆和栈上进行的,堆和栈都是建立在内存之上的。很多时候,内存几乎对程序员来讲是透明的,你只管使用,而不需要对其背后的管理机制做更加深入的了解,比如以 Java 为代表的运行在虚拟机上的语言,都有内存管理器来进行垃圾回收的机制。但是不幸的是,很多时候我们还是会遇到一些内存溢出的问题(out-o...原创 2019-04-19 08:40:58 · 1386 阅读 · 0 评论 -
linux内核分析与应用 -- 并发(下)
2.4 常见开源软件中的并发问题分析前一节介绍了 Linux 中相关并发工具,实际场景中有很多应用,下面我们来对几个开源软件的并发设计进行分析。2.4.1 Nginx 原子性下面我们通过分析 Nginx 中的原子变量实现,来介绍程序如何能做到保证原子性的。Nginx 为了保证原子性设计了 atomic 函数,atomic 的代码如下:static ngx_inline ngx...原创 2019-04-18 20:09:23 · 713 阅读 · 0 评论 -
linux内核分析与应用 -- 并发(上)
很多程序员在面试的时候经常会被问到线程安全相关的问题,比如什么是线程安全,什么又是线程不安全,假如线程不安全,如何解决才能做到线程安全。这时候,往往会出现五花八门的答案,而且大多数都是本末倒置。很多时候,人们经常会用一些现象来回答问题,比如房价高这个问题,很多时候大家就会归结于某些现象:温州炒房团、丈母娘经济、对比国际大城市房价等。但是,我们需要的是“原理性的解释”,比如影响房价的经济学原理如供需...原创 2019-04-18 20:06:25 · 452 阅读 · 0 评论 -
linux内核分析与应用 -- 进程与线程(下)
1.3 进程的调度在一个 CPU 中,同一时刻最多只能支持有限的进程或者线程同时运行(这取决于 CPU 核数量),但是在一个运行的操作系统上往往可以运行很多进程,假如运行的进程占据 CPU 进程时间很长,就有可能让其他进程饿死。为了解决这种问题,操作系统引入了进程调度器来进行进程的切换,目的是轮流让其他进程获取 CPU 资源。1.3.1 进程调度机制的架构在每个进程运行完毕时,系统可以...原创 2019-03-08 09:49:52 · 574 阅读 · 0 评论 -
linux内核分析和应用 -- 进程与线程(上)
只要是计算机科班出身的技术人员,肯定都学过现代操作系统课程。一般在操作系统的书中都会有这样的定义:简单来说,进程就是在操作系统中运行的程序,是操作系统资源管理的最小单位。一个进程可以管理多个线程,线程相对轻量,可以共享进程地址空间。我在很多次面试的时候,向求职者提问过进程和线程在 Linux 中到底有什么区别,不只是科班出身的应届生,连工作多年的老手,也有很多回答不准确。传统的教育缺乏...原创 2019-02-25 16:52:53 · 911 阅读 · 0 评论 -
Linux per-CPU实现分析
217 static DEFINE_PER_CPU(struct runqueue, runqueues);11 #define DEFINE_PER_CPU(type, name) 12 __attribute__((__section__(".data.percpu"))) __typeof__(type) per_cpu__##name13 首先,在arch/i386/...转载 2019-01-21 11:02:49 · 315 阅读 · 0 评论 -
从著名的list_head看linux内核中OO && 从Unix分层内核栈以及中断处理看Linux内核的另类
如果有人问我最欣赏linux的什么,我会毫不犹豫地回答:list_head。这个小小的结构向世人说明了用c语言写成的linux内核也在实现着OO,下面我就具体来说一下下。先看list_headstruct list_head { struct list_head *next, *prev;};就 这吗?就这!你别看它小,它却可以充当任何在内核中存在的东西,几乎所...转载 2019-01-15 17:04:30 · 250 阅读 · 0 评论 -
线程?进程?-----该停下来思考一下了
多线程,当今在IT圈子内部最普遍的概念。有多少人理解它的实质,它的精髓?(我不甚懂,这篇文章只是在使劲往前冲的时候让我停下了,吃点有营养的东西,然后继续冲)甚至在多线程还没有完全吃透的情况下,现在又冒出了什么并行计算,网格,云等等......做技术应该迷恋技术,但不应该迷信技术!要吃透它,上升到理论的高度!在计算机时代早期,只有任务,后来有了批处理,但是本质上还是一个任务,后来为了更加密集...转载 2019-01-15 14:10:54 · 223 阅读 · 0 评论 -
Linux内核入门(五)——必要的硬件知识
作原理,就必须懂点基本的硬件知识。这里我们主要介绍Intel 80x86系列CPU保护模式下最核心的部件中几个寄存器的作用,这些寄存器在Linux内核运行时起着至关重要的作用。至于其他那些各式各样的硬件设备,我们在讲解设备驱动时会针对具体的驱动程序来介绍的。首先,大家先看看CPU的主要架构:EU(通用寄存器、运算器和控制器)执行部件:完成指令所要求的功能。SU(段寄存器、段转换器)分段部...转载 2018-12-21 17:23:04 · 735 阅读 · 0 评论 -
Linux内核入门(一)——体系架构
Linux是一套免费使用和自由传播的类Unix操作系统,它最先用于基于x86系列CPU的计算机上。这个系统是由世界各地的成千上万的程序员设计和实现的。其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。我们不去介绍操作系统的历史了,也不管操作系统这门学科上对操作系统的分类了,闲话少说,Linux操作系统只是一个非常新的操作系统。它不拘泥于某种特定的操作系统类型,从...转载 2018-12-21 17:17:43 · 300 阅读 · 0 评论 -
再探Linux内核write系统调用操作的原子性
很多人都在问Linux系统的write调用到底是不是原子的。网上能搜出一大堆文章,基本上要么是翻译一些文献,要么就是胡扯,本文中我来结合实例来试着做一个稍微好一点的回答。先摆出结论吧。结论包含两点,即write调用不能保证什么以及write调用能保证什么。首先,write调用不能保证你要求的调用是原子的,以下面的调用为例:ret = write(fd, buff, 512);Lin...转载 2018-11-23 20:18:09 · 712 阅读 · 0 评论 -
linux内核与用户之间的通信方式——虚拟文件系统、ioctl以及netlink .
本文尝试去阐述内核与用户空间之间的通信接口:虚拟文件系统、ioctl以及netlink.文中所有的结构及代码全来自于Linux kernel 2.6.34. 一、虚拟文件系统 proc文件系统,通常是挂载在/proc,允许内核以文件类型形式向用户提供内部信息,但是值得注意的是里面的文件目录不能被写入,即用户不能添加或者删除目录中的任何目录。同时,内核也提供了一个可供用户...转载 2017-01-10 10:03:35 · 2887 阅读 · 0 评论 -
Linux内核入门(七)—— 必要的编译知识
所有的内核代码,基本都包含了include/linux/compile.h这个文件,所以它是基础,涵盖了分析内核所需要的一些列编译知识,本博就分析分析这个文件里的代码:#ifndef __LINUX_COMPILER_H#define __LINUX_COMPILER_H#ifndef __ASSEMBLY__首先印入眼帘的是对__ASSEMBLY__这个宏的判断,这个变量实际是在编...转载 2013-10-27 10:44:24 · 1382 阅读 · 0 评论 -
Linux内核入门(六)—— __attribute_ 机制
GNU C的一大特色(却不被初学者所知)就是__attribute__机制。__attribute__是用来设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。__attribute__书写特征是:__attribute__前后都有两个下划线,并切后面会紧跟一对原括弧,括弧里面是相应的__attr...转载 2013-10-27 10:43:42 · 759 阅读 · 0 评论