1、前言 最近项目中用到一个环形缓冲区(ring buffer),代码是由linux内核的kfifo改过来的。缓冲区在文件系统中经常用到,通过缓冲区缓解cpu读写内存和读写磁盘的速度。...Linux内核的kfifo正好是一个环形队列,可以用来当作环形缓冲区。生产者与消费者使用缓冲区如下图所示: ?...2、linux 内核kfifo kfifo设计的非常巧妙,代码很精简,对于入队和出对处理的出人意料。...首先看一下kfifo的数据结构: struct kfifo { unsigned char *buffer; /* the buffer holding the data */...kfifo->size的值总是在调用者传进来的size参数的基础上向2的幂扩展,这是内核一贯的做法。
从main.c中的printf开始读这个函数。...其中NR_BUFFERS在buffer.c中定义为缓冲区的页面大小,类型为int;BLOCK_SIZE在fs.h中的定义为 #define BLOCK_SIZE 1024 因此两个可变参数NR_BUFFERS...在printf("%d buffers = %d bytes buffer space\n\r",NR_BUFFERS, NR_BUFFERS*BLOCK_SIZE)中,根据以上的分析fmt指向字符串,...str-buf;//返回值为字符串的长度 142 这样我们就实现了根据fmt中的格式转换符将可变参数转换到相应的格式,利用write函数进行输出的目的。...而后者的可变参数memory_end-main_memory_start,根据main.c中的定义 static long buffer_memory_end = 0; static long main_memory_start
在Linux的内核源代码中已经给我们实现了一棵红黑树,我们可以方便地拿过来进行使用。本文将参考Linux内核的源码和文档资料,介绍Linux内核中红黑树的实现细节及使用方法。...本文参考的Linux内核版本为linux-2.6.39.4,可以从官网 Index of /pub/linux/kernel/v2.6/ 上进行下载。...每一个rb_node节点是嵌入在用RB树进行组织的数据结构中,而不是用rb_node指针进行数据结构的组织。...Linux内核中红黑树节点的定义如下,其中rb_node是节点类型,而rb_root是仅包含一个节点指针的类,用来表示根节点。...container_of宏取得包含ptr的数据结构的指针,具体是把ptr转化为type对象中member类型的指针,然后减去member类型在type对象的偏移量得到type对象的首地址。
6月1号,我提交了一个linux内核中的任意递归漏洞。如果安装Ubuntu系统时选择了home目录加密的话,该漏洞即可由本地用户触发。...背景知识 在Linux系统中,用户态的栈空间通常大约是8MB。如果有程序发生了栈溢出的话(比如无限递归),栈所在的内存保护页一般会捕捉到。...Linux内核栈(可以用来处理系统调用)和用户态的栈很不一样。...接下来导致ecryptfs读取 /proc/$A/environ ,最后导致进程A中的进程错误。如此循环往复,最终溢出内核栈,使内核崩溃。内核栈如下: [...]...这个函数可以使用管道向任意内核地址写数据,因为 copy_to_user()中的地址检查已经失效。
大家好,又见面了,我是全栈君 idr在linux内核中指的就是整数ID管理机制,从本质上来说,这就是一种将整数ID号和特定指针关联在一起的机制。...这个机制最早是在2003年2月加入内核的,当时是作为POSIX定时器的一个补丁。现在,在内核的很多地方都可以找到idr的身影。 idr机制适用在那些需要把某个整数和特定指针关联在一起的地方。...举个例子,在I2C总线中,每个设备都有自己的地址,要想在总线上找到特定的设备,就必须要先发送该设备的地址。...如果我们的PC是一个I2C总线上的主节点,那么要访问总线上的其他设备,首先要知道他们的ID号,同时要在pc的驱动程序中建立一个用于描述该设备的结构体。...这些函数都定义在中 下面,我们通过分析I2C协议的核心代码,来看一看idr机制的实际应用: <linux-2.6.23/drivers/i2c/
内核为所有的I/O创建了3种数据结构表示打开文件,它们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响。 每个进程在进程表中都有一个记录项,记录项中包含一张打开文件描述符表。...同一进程打开不同文件的内核数据结构 这个图本来描述的是UNIX操作系统的,在Linux中没有这个V节点,而是采用了一个与文件系统相关的i节点和一个与文件系统无关的i节点。...文件系统:文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。...操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。常见的文件系统有FAT,NTFS,ext2,ext3,ext4等。Linux的VFS处理了不同文件系统之间的统一管理。 ?...此时的数据结构和上图一样。每个进程都有自己的文件表,但是共享一个V节点。假设A进程现在写入100字节的内容。这时候,内核切换进程到B,B执行写入操作,写入了200字节的内容。
由图可见,从系统调用的接口再往下,Linux下的IO栈致大致有三个层次: 文件系统层,以 write(2) 为例,内核拷贝了write(2)参数指定的用户态数据到文件系统Cache中,并适时向下层同步...设备层,通过DMA与内存直接交互,完成数据和具体设备之间的交互 结合这个图,想想Linux系统编程里用到的Buffered IO、mmap(2)、Direct IO,这些机制怎么和Linux IO栈联系起来呢...假设要去读一个冷文件(Cache中不存在),open(2)打开文件内核后建立了一系列的数据结构,接下来调用read(2),到达文件系统这一层,发现Page Cache中不存在该位置的磁盘映射,然后创建相应的...然后请求继续到达块设备层,在IO队列里排队,接受一系列的调度后到达设备驱动层,此时一般使用DMA方式读取相应的磁盘扇区到Cache中,然后read(2)拷贝数据到用户提供的用户态buffer中去(read...Linux 2.4还要求是文件系统逻辑块的整数倍)。
但是如果真是遇到一个“特别显赫”的鸡蛋,很多人还是想看看能生出这颗神蛋的母鸡的,或者想听听这只母鸡的故事。 其实,在Linux内核的代码里,就隐藏着关于Linus大神的一个美妙故事。...$ sudo gdb --core /proc/kcore 然后在GDB中执行如下命令加载内核的符号信息: (gdb) file /home/ge/work/linux-3.12.2/vmlinux...这样说有点不精确,精确的说法是从Linux内核2.1.17版本开始,第二个参数也可以是0x5121996。查阅kernel.org上的内核发布历史,2.1.17应该发布于1996年12月22日。...在内核代码中,上述规则是在reboot.c中强制的,代码如下: /* For safety, we require "magic" arguments. */ if (magic1 !...内核代码中,而且使它们成为Linux API的一部分。
概要 本文对双向链表进行探讨,介绍的内容是Linux内核中双向链表的经典实现和用法。其中,也会涉及到Linux内核中非常常用的两个经典宏定义offsetof和container_of。...这两个宏最初是极客写出的,后来在Linux内核中被推广使用。...1.offsetof 1.1 offsetof介绍 定义:offsetof在linux内核的include/linux/stddef.h中定义。...在linux内核的include/linux/kernel.h中定义。...在linux中,以""开头的函数意味着是内核的内部接口,外部不应该调用该接口。
其实,在Linux内核的代码里,就隐藏着关于Linus大神的一个美妙故事。...$ sudo gdb --core /proc/kcore 然后在GDB中执行如下命令加载内核的符号信息: (gdb) file /home/ge/work/linux-3.12.2...这样说有点不精确,精确的说法是从Linux内核2.1.17版本开始,第二个参数也可以是0x5121996。查阅kernel.org上的内核发布历史,2.1.17应该发布于1996年12月22日。...在内核代码中,上述规则是在reboot.c中强制的,代码如下: /* For safety, we require "magic" arguments. */ if (magic1 !...内核代码中,而且使它们成为Linux API的一部分。
从Linux诞生开始,Linux内核就从来没有停止过升级,从Linus第一次发布的0.02版本到1999年具有里程碑意义的2.2版本,一直到我们现在看到的2.4版本,都凝聚了Linux内核开发人员大量辛苦的劳动...这种Modem和一般Modem的处理方法不同,它的DSP处理并不是在硬件层次上做的,而是使用软件通过CPU实现的,因此无法在现有的Linux中配置这种Modem上网。...现在的Linux内核里已经开始了这方面的支持。...对HTTP请求首先由内核级的Web服务器进行处理,如果不能处理就将请求提交给Apache用户级Web服务器来处理。像这样的构思和实现在网络操作系统中实属一绝。...3.高性能 · 对虚拟文件系统(VFS)的修改:Linux 2.4版本的文件系统修改了VFS中的错误,尤其是在文件的缓存管理上。
文章目录 一、下载 Linux 内核源码 二、使用 VSCode 阅读 Linux 内核源码 一、下载 Linux 内核源码 ---- 参考 【Linux 内核】编译 Linux 内核 ① ( 下载指定版本的...Linux 内核源码 | Linux 内核版本号含义 | 主版本号 | 次版本号 | 小版本号 | 稳定版本 ) 博客 , 下载 Linux 5.6.18 版本的内核源码 ; 5.x 内核源码下载地址.../pub/linux/kernel/v5.x/linux-5.6.18.tar.gz 下载完 Linux 源码后 , 如果在 Windows 系统中解压 , 需要使用管理员权限在 命令行终端 中解压 ,...参考 【错误记录】解压 Linux 内核报错 ( Can not create symbolic link : 客户端没有所需的特权 | Windows 中配置 7z 命令行执行解压操作 ) 博客 ;...不同版本的 Linux 内核 区别 : 系统调用 : 其系统调用是相同的 , 新的版本可能会增加新的系统调用 ; 设备文件 : 各内核版本的设备文件都是相同的 , 但是 内部接口 可能不同 ; 二、使用
文章目录 一、下载 Linux 内核源码 二、使用 VSCode 阅读 Linux 内核源码 一、下载 Linux 内核源码 ---- 参考 【Linux 内核】编译 Linux 内核 ① ( 下载指定版本的.../pub/linux/kernel/v5.x/linux-5.6.18.tar.gz 下载完 Linux 源码后 , 如果在 Windows 系统中解压 , 需要使用管理员权限在 命令行终端 中解压 ,...参考 【错误记录】解压 Linux 内核报错 ( Can not create symbolic link : 客户端没有所需的特权 | Windows 中配置 7z 命令行执行解压操作 ) 博客 ;...不同版本的 Linux 内核 区别 : 系统调用 : 其系统调用是相同的 , 新的版本可能会增加新的系统调用 ; 设备文件 : 各内核版本的设备文件都是相同的 , 但是 内部接口 可能不同 ; 二、使用...按钮 , 此时就可以在 VSCode 中阅读 Linux 内核源码 ;
Linux中常见的拦截过滤 本文着重介绍Linux平台上常见的拦截: 用户态动态库拦截。 内核态系统调用拦截。 堆栈式文件系统拦截。 inline hook拦截。...Linux内核中所有的系统调用都是放在一个叫做sys_ call _table的内核数组中,数组的值就表示这个系统调用服务程序的入口地址。整个系统调用的流程如下: ?...Linux内核中已经集成了一些堆栈式文件系统,例如Ubuntu在安装时会提醒你是否需要加密home目录,其实就是一个堆栈式的加密文件系统(eCryptfs),原理如下: ?...LSM 在内核中做了以下工作: 在特定的内核数据结构中加入安全域。 在内核源代码中不同的关键点插入对安全钩子函数的调用。 加入一个通用的安全系统调用。 提供了函数允许内核模块注册为安全模块或者注销。...LSM,在早期的内核中,只能允许一个LSM内核模块加载,例如加载了SELinux,就不能加载其他的LSM模块,在最新的内核版本中不存在这个问题。
结构体在内存中是如何存储的 int main() { Student stu; stu.id = 123456; strcpy(stu.name,"feizhufeifei"); stu.math...如何移植并使用Linux内核的通用链表(附完整代码实现)中提到的为什么在结构体中要把 struct list_head放在首位。...我们可以看到,结构体中成员变量在内存中存储的其实是偏移地址。也就是说结构体A的地址+成员变量的偏移地址 = 结构体成员变量的起始地址。...这里使用的是一个利用编译器技术的小技巧,即先求得结构成员在结构中的偏移量,然后根据成员变量的地址反过来得出主结构变量的地址。...,因此内核使用size_t和,而不是int,unsigned。
lsmod是一个命令行程序,用于显示有关已加载的Linux内核模块的信息。 内核模块 内核是操作系统的核心组件。 它管理系统的资源,并且是计算机硬件和软件之间的桥梁。...Linux内核具有模块化设计。 内核模块通常称为驱动程序是一段扩展内核功能的代码。 模块要么编译为可加载模块,要么内置在内核中。...您也可以使用modprobe命令将模块手动加载到内核中,或者在启动时使用/etc/modules或/etc/modules-load.d/*.conf文件自动将模块加载到内核中。...内核模块存储在/lib/modules/目录中。 要找到正在运行的内核的版本,请使用uname -r命令。...在命令行中运行lsmod以了解当前正在加载哪些内核模块: lsmod 该命令在新的一行上输出每个已加载内核模块的信息: Module Size Used by cmac
关于kconfig-hardened-check kconfig-hardened-check是一款功能强大的安全检测工具,可以帮助广大研究人员检测Linux内核中的安全增强选项。...Linux内核中提供了很多安全增强选项,其中有很多选项在主要的Linux发行版系统中都默认不会开启。因此,我们如果想要让自己的系统变得更加安全的话,我们则需要手动开启这些安全增强选项。...但是,谁都不想手动去检查这些配置选项,因此kconfig-hardened-check便应运而生,它可以自动帮我们检查自己Linux系统内核中的相关安全增强选项。...在检查的过程中,kconfig-hardened-check.py 将根据下列参考配置来进行检查: 1、KSPP推荐设置; 2、CLIP操作系统内核配置; 3、最新公开的grsecurity修复方案;...4、SECURITY_LOCKDOWN_LSM修复方案; 5、Linux内核维护团队的直接反馈; 除此之外,我们还创建了一份Linux内核防御图,它是安全强化特性和相应漏洞类或攻击技术之间关系的图形表示
大家好,又见面了,我是你们的朋友全栈君。...内核版本信息在顶层Makefile文件中 lemon@ubuntu:~/Develop/OrangePi_Lite2/lichee/linux-3.10$ vim Makefile VERSION =...如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
使用 参考 Linux 源码中的 samples/kprobes/kprobe_example.c,一个简单的 kprobe 内核模块实现如下: #include #include...有人可能听说过 Jprobe,那是早期 Linux 内核的的一个监控实现,现已被 Kprobe 替代。...值得一提的是,最近几年 Linux 内核出过很多 eBPF 的漏洞,大多是 verifier 的验证逻辑错误,其中不少还上了 Pwn2Own,但是由于权限的限制在 Android 中普通应用无法执行 bpf...,需要自行修改配置,烧写和编译内核; Linux 旧版本对于 eBPF 的支持不完善,许多新功能都是在 5.x 后才引进,而 Android 的 Linux 内核都比较旧,需要进行 cherry-pick...,这在内核直接读取用户空间的数据(比如系统调用的参数)时会出现错误,因此我们需要手动去 cherry-pick 对应的 commit,即在 Linux 5.5 中添加的 6ae08ae3dea2。
领取专属 10元无门槛券
手把手带您无忧上云