首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux内核30-读写自旋锁

1 读/写自旋锁概念 自旋锁解决了多核系统在内核抢占模式下的数据共享问题。但是,这样的自旋锁一次只能一个内核控制路径使用,这严重影响了系统的并发性能。...为此,Linux内核提出了读/写自旋锁的概念。也就是说,没有内核控制路径修改共享数据的时候,多个内核控制路径可以同时读取它。...下面我们先以ARM体系解析一遍: arch_rwlock_t的定义: typedef struct { u32 lock; } arch_rwlock_t; 3 读写自旋锁API实现 请求写自旋锁...(2)调用sev指令,唤醒正在执行WFE指令的内核控制路径。...通过上面的分析可以看出,读写自旋锁使用bit31表示写自旋锁,bit30-0表示读自旋锁,对于读自旋锁而言,绰绰有余了。

1.3K20

Linux内核34-读写信号量

那也就是说,读/写信号量同读/写自旋锁一样,对于读操作,多个内核控制路径可以并发请求一个读写信号量;而对于写操作,每个内核控制路径必须独占访问受保护的资源。...读/写信号量提高了内核中的并发数量,也同时提高了系统的整体性能。 内核严格按照先进先出(FIFO)的原则处理等待读/写信号量的进程。读进程或者写进程一旦请求信号量失败,就被写到信号量等待队列的队尾。...高16位的计数器以2的补码形式表示非等待写进程和等待内核控制路径的数量,低16位表示非等待读进程和非等待写进程的总数。 wait_list 等待进程的列表。...3 读/写信号量的有关API 初始化函数为 init_rwsem(),用其可以初始化一个rw_semaphore数据结构,将count设为0,wait_lock自旋锁设为未使用,wait_list设为空列表

1.3K10
您找到你想要的搜索结果了吗?
是的
没有找到

驱动开发:内核CR3切换读写内存

首先CR3是什么,CR3是一个寄存器,该寄存器内保存有页目录表物理地址(PDBR地址),其实CR3内部存放的就是页目录表的内存基地址,运用CR3切换可实现对特定进程内存地址的强制读写操作,此类读写属于有痕读写...,多数驱动保护都会将这个地址改为无效,此时CR3读写就失效了,当然如果能找到CR3的正确地址,此方式也是靠谱的一种读写机制。...在读写进程之前需要先找到进程的PEPROCESS结构,查找结构的方法也很简单,依次遍历进程并对比进程名称即可得到。...);if (pDTB == 0){return FALSE;}_disable();OldCr3 = __readcr3();__writecr3(pDTB);_enable();if (MmIsAddressValid...);if (pDTB == 0){return FALSE;}_disable();// 读取CR3OldCr3 = __readcr3();// 写CR3__writecr3(pDTB);_enable

70730

Linux 内核Linux 内核源码结构 ( 下载 Linux 内核源码 | 使用 VSCode 阅读 Linux 内核源码 )

文章目录 一、下载 Linux 内核源码 二、使用 VSCode 阅读 Linux 内核源码 一、下载 Linux 内核源码 ---- 参考 【Linux 内核】编译 Linux 内核 ① ( 下载指定版本的...Linux 内核源码 | Linux 内核版本号含义 | 主版本号 | 次版本号 | 小版本号 | 稳定版本 ) 博客 , 下载 Linux 5.6.18 版本的内核源码 ; 5.x 内核源码下载地址...: https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/ Linux 内核 5.6.18 版本 : https://mirrors.edge.kernel.org...参考 【错误记录】解压 Linux 内核报错 ( Can not create symbolic link : 客户端没有所需的特权 | Windows 中配置 7z 命令行执行解压操作 ) 博客 ;...不同版本的 Linux 内核 区别 : 系统调用 : 其系统调用是相同的 , 新的版本可能会增加新的系统调用 ; 设备文件 : 各内核版本的设备文件都是相同的 , 但是 内部接口 可能不同 ; 二、使用

23.2K32

3.2 Windows驱动开发:内核CR3切换读写内存

利用CR3寄存器可以实现强制读写特定进程的内存地址,这种操作需要一定的权限和技术知识。在实际应用中,这种操作主要用于调试和漏洞挖掘等方面。...同时,由于CR3寄存器的读写属于有痕读写,因此许多驱动保护都会禁止或者修改CR3寄存器的值,以提高系统的安全性,此时CR3读写就失效了,当然如果能找到CR3的正确地址,此方式也是靠谱的一种读写机制。...在读写进程的时候,我们需要先找到目标进程的PEPROCESS结构。...对于想要读写目标进程的内存,我们需要获得目标进程的PEPROCESS结构,才能进一步访问和操作进程的内存。...接下来,函数使用了汇编指令_disable()来禁用中断,然后调用__readcr3()函数获取当前系统的CR3寄存器的值,保存在变量OldCr3中。

55310

Linux 内核Linux 内核源码结构 ( 下载 Linux 内核源码 | 使用 VSCode 阅读 Linux 内核源码 )

文章目录 一、下载 Linux 内核源码 二、使用 VSCode 阅读 Linux 内核源码 一、下载 Linux 内核源码 ---- 参考 【Linux 内核】编译 Linux 内核 ① ( 下载指定版本的...Linux 内核源码 | Linux 内核版本号含义 | 主版本号 | 次版本号 | 小版本号 | 稳定版本 ) 博客 , 下载 Linux 5.6.18 版本的内核源码 ; 5.x 内核源码下载地址...: https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/ Linux 内核 5.6.18 版本 : https://mirrors.edge.kernel.org...不同版本的 Linux 内核 区别 : 系统调用 : 其系统调用是相同的 , 新的版本可能会增加新的系统调用 ; 设备文件 : 各内核版本的设备文件都是相同的 , 但是 内部接口 可能不同 ; 二、使用...按钮 , 此时就可以在 VSCode 中阅读 Linux 内核源码 ;

21.2K30

编译 Linux 内核启用 TCP BBR3

随着时间的推移 TCP BBR 已经来到了 v3 版本,但因为尚处于测试阶段所以目前相关代码并没有汇入主线内核中。现阶段如果需要提前体验 BBR v3 的话手动编译内核是免不了的。...从 Google 拉取完整的包含 TCP BBR v3内核源码,视网络情况这一步可能需要较长时间。...3.拷贝配置 我们的最终目的是编译开启 TCP BBR v3,并不是内核参数调优,所以直接拷贝 Debian 的内核参数即可。下载 Debian 6.5 内核到本机并使用 7z 打开。...make -j4 deb-pkg #可按照编译机 CPU 线程数设置编译线程 编译完成后在上层文件夹中会生成我们所需要的包含 BBRv3 模块的内核文件:linux-image-6.4.0-xxxx.deb...在任意机器上安装此内核即可启用 BBRv3 : dpkg -i linux-image-6.4.0-xxxx.deb # 文件名以实际为准 如何确认当前已启用的 BBR 版本: modinfo tcp_bbr

1.4K20

Linux内核设计与实现》第3

Linux内核设计与实现》第3版,英文版已经出版,中文版即将出版。...本书基于linux 2.6介绍了linux内核的设计与实现,涵盖了从核心内核系统的应用到内核设计与实现等各方面内容,主要内容包括:进程管理、调度、时间管理和定时器、系统调用接口、内存寻址、内存管理、页缓存...本书详细描述了linux内核的主要子系统和特点,包括其设计、实现和接口,既介绍理论也讨论具体应用,填补了linux内核理论和实践细节之间的鸿沟。...能够带领读者快速走进linux内核世界,真正开发内核代码。     如果你是一名linux内核爱好者,本书的内容可以帮助你大显身手。如果你是一名普通程序员,本书的内容将会拓宽你的编程思路。...本版新增内容: ·增加一章专门描述内核数据结构 ·详细描述中断处理程序 ·扩充虚拟内存和内存分配的内容 ·调试linux内核的技巧 ·内核同步和锁机制的深度描述 ·提交内核补丁以及参与linux

1.8K20

linux内核编程_linux内核是什么

内核——操作系统的内在核心 设备驱动程序 启动引导程序 命令行shell 其他种类的用户界面—-操作系统的外在表象 基本的文件管理工具和系统工具 Linux内核的组成 Linux内核源代码目录结构是什么...Linux 的每个进程享有4GB的内存空间,0~3GB属于用户空间,3~4GB属于内核空间 虚拟文件系统有什么作用?...记录哪些部分被编译入内核、哪些部分被编译为内核模块。 在Linux 内核中增加程序需要完成哪些工作? 将编写的源代码复制到Linux 内核源代码的相应目录。...为S3C2410 的LED 编写了驱动,源代码为s3c2410-led.c,为使内核能支持对该模块的编译配置,需要完成哪些工作?...次引导加载程序加载Linux内核和可选的初始RAM 磁盘,将控制权交给Linux内核源代码。 运行被加载的内核,并启动用户空间应用程序。

18.8K30

LINUX内核

一、Linux内核2.6特点: 1.新的调度器 2.内核抢占 3.改进线程模型 4.虚拟内存 5.文件系统 6.音频:音频体系结构ALSA.支持USB音频和MIDI设备,并支持全双工重放功能。...二、LINUX内核的组成 1.LINUX内核源代码目录结构 1)arch:包含和硬件体系结构相关的代码,每种平台占一个相应的目录。如i386,arm,powerpc,mips等。...3)crypto:常用加密和散列算法,还有一些散列和CRC校验。 4)Documentation:内核各部分通用解释和注释。...2)内存管理:控制多个内存安全的使用主内存的区域,当CPU提供内存管理单元时,Linux内存完成每个虚拟内存到物理内存的转换的过程 ? 3)虚拟文件系统 4)网络接口 ?...3.Linux内核空间与用户空间 Linux只能通过系统调用和硬件中断来完成用户空间到内核空间的控制转移

13.9K30

Linux 内核】编译 Linux 内核 ② ( 解压内核源码 | 查询当前 Linux 内核版本号 | 进入并查看 linux 内核源码目录 )

文章目录 一、解压内核源码 二、查询当前 Linux 内核版本号 三、进入并查看 linux 内核源码目录 一、解压内核源码 ---- 将 下载的 Linux 内核源码 linux-5.6.14.tar.gz...拷贝到 Ubuntu 虚拟机中 , 执行 tar xvf linux-5.6.14.tar.gz 命令 , 解压 Linux 内核源码 ; 解压完毕后 , linux-5.6.14 目录中就是解压后的...Linux 内核源码 ; 二、查询当前 Linux 内核版本号 ---- 执行 uname -a 命令 , 查询当前 Ubuntu 系统的 Linux 内核版本号 , 执行过程如下 : root@ubuntu...x86_64 x86_64 x86_64 GNU/Linux root@ubuntu:~/kernel# root@ubuntu:~/kernel# 当前的内核版本号是 4.13.0 ; 三...、进入并查看 linux 内核源码目录 ---- 进入之前解压的 linux-5.6.14 内核源码目录 ; root@ubuntu:~/kernel# ls linux-5.6.14 linux-5.6.14

86.8K60

Linux 内核 vs Windows 内核

对于服务器使用的操作系统基本上都是 Linux,而且内核源码也是开源的,任何人都可以下载,并增加自己的改动或功能,Linux 最大的魅力在于,全世界有非常多的技术大佬为它贡献代码。...操作系统核心的东西就是内核,这次我们就来看看,Linux 内核和 Windows 内核有什么区别? ---- 内核 什么是内核呢?...完成第一版 Linux 后,Linux Torvalds 就在网络上发布了 Linux 内核的源代码,每个人都可以免费下载和使用。...Monolithic Kernel Monolithic Kernel 的意思是宏内核Linux 内核架构就是宏内核,意味着 Linux内核是一个完整的可执行程序,且拥有最高的权限。...,内核中抽象出了微内核的概念,也就是内核中会有一个小型的内核,其他模块就在这个基础上搭建,整个内核是个完整的程序; Linux内核设计是采用了宏内核,Windows 的内核设计则是采用了混合内核

16.3K30

Linux内核开发_1_编译LInux内核

准备工作 1.1 学习环境 1.2 下载Linux内核源码 1.3 解压Linux内核 1.4 目录结构介绍 2....Linux内核配置 2.1 配置选项 1. make config 2. make menuconfig 3. make gconfig 3 开始配置 1....[*]BSD Process Accounting version 3 file format 选用的话统计信息将会以新的格式(V3)写入,注意这个格式和以前的 v0/v1/v2 格式不兼容,选不选无所谓...,而gnu的软件体系在不断的升级进化,每次的升级,都会被用在正在开发中最新的Linux内核,而除了原始版的Linux内核不是在Linux上编译出来的以外,其余的Linux内核版本都是在Linux内核上开发而来的...如正在编译Linux2.6,他使用的glib是3,那么我们当前的发行版使用的是6 一旦编译起来,gcc会从系统环境里把6的一些依赖lib链接到2.6里去了,从而导致某些函数可能在未来的运行结果或者参数要求发生了一点变化

19.3K20

linux 切换内核版本,切换 Linux 内核版本

Linux 内核是开源类 Unix 系统宏内核。仅仅一个内核并不是一套完整的操作系统。有一套基于 Linux 内核的完整操作系统叫作 Linux 操作系统。...Kernel 是 Linux 系统的核心,主要负责硬件的支持。 Linux 内核提供了安全补丁, bugfix 和新特性。 Linux 内核在 GNU 通用公共许可证第 2 版之下发布。...Linux 内核版本变更可能导致网络访问异常,声音异常,甚至是桌面环境无法启动。...Linux 内核版本号的意义 Linux 内核版本号由 3 组数字组成:第一个组数字。第二组数字。第三组数字 第一个组数字:目前发布的内核主版本。...查看内核版本 在 Linux 机器上执行如下命令查看当前正在使用的内核版本 uname -r 使用如下命令查看当前系统安装的内核版本 dpkg -l | grep linux-image 如果使用的是

23.5K20

驱动开发:内核文件读写系列函数

在应用层下的文件操作只需要调用微软应用层下的API函数及C库标准函数即可,而如果在内核读写文件则应用层的API显然是无法被使用的,内核层需要使用内核专有API,某些应用层下的API只需要增加Zw开头即可在内核中使用...首先无论在内核态还是在用户态,我们调用的文件操作函数其最终都会转换为一个IRP请求,并发送到文件系统驱动上的IRP_MJ_READ派遣函数里面,这个读写流程大体上可分为如下四步;对于FAT32分区会默认分发到...Driver->DriverUnload = UnDriver;return STATUS_SUCCESS;}编译并运行如上程序,即可读取到C盘下的lyshark.exe程序的大小字节数,如下图所示;图片内核文件读写...: 内核读取文件可以使用ZwReadFile(),内核写入文件则可使用ZwWriteFile(),这两个函数的参数传递基本上一致,如下是读写两个函数的对比参数。...\\ReadWriteSymbolName"typedef struct{ULONG64 size; // 读写长度BYTE* data; // 读写数据集}FileData;/

67080

Linux内核编程_linux内核开发工具

【转载】Linux内核编程与应用编程对比 转载链接1:http://www.arrowapex.cn/archives/66.html 在此之前也不清楚linux内核编程跟用户应用程序编程之间有什么不同...1.linux内核编程和用户应用程序编程最大的不同是,前者是在内核态下运行的,而后者主要在用户态下运行,有时通过一些系统调用切换到内核态下运行,但这时间不会太长。...2.内核编程引进的头文件都在内核源码的include文件夹下,比如我的debian linux 2.6环境下是:/usr/src/linux/include下,而用户应用程序编程引进的头文件都是从开发环境头文件的...3.要查询一个函数能否在内核编程中用,可以通过http://lxr-itec.uni-klu.ac.at/linux-2.6.4/ident查 (这是针对linux2.6内核,也有针对2.4内核的),如果能查到...对于在linux内核实现网关的某些功能时,我发现,虽然linux已经提供了很多现成的东西,可以保证快速开发。但是内核本身架构是一个通用计算机,不是专门针对网络处理的。

12.9K20

驱动开发:内核读写内存多级偏移

让我们继续在《内核读写内存浮点数》的基础之上做一个简单的延申,如何实现多级偏移读写,其实很简单,读写函数无需改变,只是在读写之前提前做好计算工作,以此来得到一个内存偏移值,并通过调用内存写入原函数实现写出数据的目的...以读取偏移内存为例,如下代码同样来源于本人的LyMemory读写驱动项目,其中核心函数为WIN10_ReadDeviationIntMemory()该函数的主要作用是通过用户传入的基地址与偏移值,动态计算出当前的动态地址...: %x \n", Offset[2]); DbgPrint("[+] 4级偏移: %x \n", Offset[3]); DbgPrint("[ReadMemory] 读取偏移数据: %d \n...的动态地址中的数据,如下图所示; 至于如何将数据写出四级偏移的基址上面,则只需要取出pbase里面的基址,并通过原函数WIN10_WriteProcessMemory直接写出数据即可,此出的原函数在《内核...ref = WIN10_WriteProcessMemory(Pid, (void *)pbase, 4, &SetValue); if (ref == TRUE) { DbgPrint("[内核写成功

15120
领券