首页
学习
活动
专区
圈层
工具
发布

内核中的guard宏

背景最近看内核代码的时候,注意到之前不少加锁的地方都替换成了guard()比如,我们看一下曾经某个commit的改动,很明显,这里就是把成对的preempt_{en,dis}able替换成了一个guard...注意:本属性只能作用域function auto scope的变量,也就是说函数中定义的栈上分配的在函数作用域中的变量,参数或者static变量是不行的。...内核中的guard内核作为一个极其复杂的超超超大型c项目,一直都是需要手动在每个return或者goto去处理资源释放之类的操作,如果能用上cleanup岂不是美滋滋。...哎,https://lwn.net/Articles/934679/ ,guard就是用上了这个属性。...(){ __attribute__((cleanup(free_A))) char *A = malloc(8);}//使用这些封装之后,在内核里可以这样写(举个例子,其实不能直接写到内核中)DEFINE_FREE

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

    Windows内核中的内存管理

    内存管理的要点 内核内存是在虚拟地址空间的高2GB位置,且由所有进程所共享,进程进行切换时改变的只是进程的用户分区的内存 驱动程序就像一个特殊的DLL,这个DLL被加载到内核的地址空间中,DriverEntry...和AddDevice例程在系统的system进程中运行,派遣函数会运行在应用程序的进程上下文中所能访问的地址空间是这个进程的虚拟地址空间利用_EPROCESS结构可以查看该进程的相关信息 当程序的中断级别在...,只在debug版本中生效,用于判断当前的中断请求级别,当级别高于DISPATCH_LEVEL(包含这个级别)时会产生一个断言 内核中的堆申请函数 PVOID ExAllocatePool(..., IN TYPE Type, IN PCHAR Field ); 这个宏返回自定义结构体的首地址,传入的是第一个参数是结构体中某个成员的地址,第二个参数是结构体名,第三个参数是我们传入第一个指针的类型在结构体中对应的成员变量值...在内核中,对于内存的读写要相当的谨慎,稍不注意就可能产生一个新漏洞或者造成系统的蓝屏崩溃,有时在读写内存前需要判断该内存是否合法可供读写,DDK提供了两个函数来判断内存是否可读可写 VOID ProbeForRead

    1.7K20

    Linux内核中的BogoMIPS详解

    Linux内核中的BogoMIPS详解 一、什么是BogoMIPS?...1.1 基本定义 BogoMIPS = Bogus(虚假的) + MIPS(每秒百万条指令) 不是真实的CPU性能指标 是Linux内核启动时计算的一个校准值 用于内核内部延迟循环的时间控制 1.2 核心比喻...(每个人的语速不同) Linux内核: 运行一个校准过的循环(BogoMIPS就是"语速测量器") 二、BogoMIPS的工作原理 2.1 内核启动时的计算过程 启动流程: [BIOS/UEFI...实际计算演示:" echo "假设需要1ms延迟" echo "根据BogoMIPS,内核会计算需要循环多少次空操作" 6.2 BogoMIPS计算流程图 七、技术细节深入 7.1 内核源码中的关键位置...,保证时间一致性 ✅ 不可用于比较不同CPU的性能 ✅ 每个CPU核心可能有不同的值 ✅ 现代系统中仍有重要作用 8.2 什么时候关注BogoMIPS?

    10110

    .NET 中的 ForwardedHeaders

    .NET 中的 ForwardedHeaders Intro ForwardedHeaders 主要是用于反向代理的场景,网站应用经常依赖多层服务器和代理来处理传入请求,这可能导致请求头在传输过程中被修改或丢失...我们可以通过 ForwardedHeaders 来处理多层代理,在 ASP.NET Core 中我们可以使用 ForwaredHeaders 中间件来处理 ForwaredHeaders 从而在程序里获取到用户的实际请求信息...例如,当客户端通过多个代理服务器发送请求时,传统的HTTP头部中的信息可能会被覆盖或丢失,导致无法正确追踪请求的源头。...验证:在使用Forwarded headers时,需要进行验证以确保这些头部信息的可信度。可以通过检查头部中的IP地址是否与实际连接的IP地址相符来进行验证。...ASP.NET Core 的 Forwarded Headers 中间件允许您配置框架如何处理转发的头部信息。它使您能够从代理添加的头部信息中提取原始值,并相应地更新 HttpContext。

    62200

    内核net_device设备框架的一个缺陷

    前几天在看Linux内核源码时,发现一个net_device设备框架的一个问题,以至于upstream的内核源码中,至少有12个设备驱动和虚拟设备存在内存泄漏的风险。...(net_device应该是内核里面最大的struct了,被诟病很久了,期待refactor)。 下面仅列出net_device_ops的一部分: ?...内核代码已经是很geek的代码了,但大家可以看看,内核中的“命名”起的非常好,从成员变量的名称上,就可以看出该函数的用途。所以,变量命名不是越短越好,而是尽量让读者看得明白,易于维护。...如果一切都是这样工作的,那世界该有多美好啊~~~可惜,在前文中提到的net_device结构中,还有这样一个成员变量void (*destructor)(struct net_device *dev)。...这时,就出现一个内存泄漏的隐患:只要是在ndo_init函数中申请了资源,且这个资源不是在ndo_uninit中释放,而是在destructor中释放。

    1.9K20

    Linux内核中的递归漏洞利用

    6月1号,我提交了一个linux内核中的任意递归漏洞。如果安装Ubuntu系统时选择了home目录加密的话,该漏洞即可由本地用户触发。...接下来导致ecryptfs读取 /proc/$A/environ ,最后导致进程A中的进程错误。如此循环往复,最终溢出内核栈,使内核崩溃。内核栈如下: [...]...这些空洞足够用来存放从SRACK_END_MAIC到flags的所有数据。这一点可以通过一个安全递归和一个内核调试模块来实现,这个内核调试模块将栈中的所有空洞标绿便于观察: ?...这个函数可以使用管道向任意内核地址写数据,因为 copy_to_user()中的地址检查已经失效。...在我写的漏洞报告中,我有提到给内核增加内存保护页,移除栈底部的 thread_info结构体,这样缓解这类漏洞的利用,有其他操作系统就是这么干的。

    2.5K60

    【Binder 机制】分析 Android 内核源码中的 Binder 驱动源码 binder.c ( googlesource 中的 Android 内核源码 | 内核源码下载 )

    一、查看 Android 内核源码中的 Binder 驱动源码 binder.c Android 内核源码地址 选择 common 版本的内核 ; common 版本内核 : 选择 android-mainline...就是 Binder 驱动源码 ; binder.c 源码地址 二、分析 Binder 驱动源码 binder.c 1、binder_ioctl 在 Android Native 层中的 service_manager.c...中的 main 函数中 , 调用了 binder_become_context_manager(bs) , 将自己注册成 Binder 进程的上下文 , 其中调用的 ioctl 方法是内核中的方法 ,...->fd, BINDER_SET_CONTEXT_MGR, 0); } 上面调用的 ioctl 方法 , 就是下面的内核中的 Binder 驱动源码 binder.c 中的 static long binder_ioctl...CSDN 下载中 , 0 积分可下载 ; 下载地址 : https://download.csdn.net/download/han1202012/23353149

    1.6K20

    浅析linux内核中的idr机制

    这个机制最早是在2003年2月加入内核的,当时是作为POSIX定时器的一个补丁。现在,在内核的很多地方都可以找到idr的身影。 idr机制适用在那些需要把某个整数和特定指针关联在一起的地方。...举个例子,在I2C总线中,每个设备都有自己的地址,要想在总线上找到特定的设备,就必须要先发送该设备的地址。...如果我们的PC是一个I2C总线上的主节点,那么要访问总线上的其他设备,首先要知道他们的ID号,同时要在pc的驱动程序中建立一个用于描述该设备的结构体。...最简单的方法当然是通过数组进行索引,但如果ID号的范围很大(比如32位的ID号),则用数组索引显然不可能;第二种方法是用链表,但如果网络中实际存在的设备较多,则链表的查询效率会很低。...指针 id: 由内核自动分配的ID号 ptr: 和ID号相关联的指针 start_id: 起始ID号。

    2.3K20

    .NET 10 中的 dnx

    .NET 10 中的 dnx Intro 在 node 里有一个 npx 命令可以直接执行 npm package,dotnet 也在 .NET 10 中引入了一个 dnx 的命令,我们可以通过 dnx...来执行一个 dotnet tool 而无需将其安装为 global tool 或者 local tool,这样可以执行 dotnet tool 同时不在 global tool 或者 local tool 中引入额外的工具...可以执行 dnx dotnet-execute "Guid.NewGuid()" `dnx dotnet-execute "Guid.NewGuid()"` 第一次执行会看 nuget package 缓存中是否已经下载...,后面版本会修复 How it works 在 .NET 10 最新版本的 SDK 的根目录下,可以看到有一个可执行的 dnx 文件,在 Windows 下是 dnx.cmd `dotnet-sdk windows...dotnet tool execute 的一个别名,两者的实现是一致的 More dnx 的出现一方面是为了简化 dotnet tool execuete 的使用,同时方便基于标准输入输出的 MCP tool

    34410

    .NET中的Husky工具

    对于会前端开发程序员来说前端工程化工作流中有个常用的工具 Husky ,它方便我们在项目中添加 git hooks 在代码提交前自动检查编码规范,或对填写的 message 进行检查。...但是在.NET中却没有这样的工具,这是因为VS的智能提示解决了大部分问题,但也有一些问题VS无法解决的,并且VS只是给出建议并非强制规范,而且功能也有限,很难自定义。...基于这些原因Husky.Net横空出世,他的下载地址是: https://github.com/alirezanet/Husky.Net 安装了Husky.Net后,当我们提交.NET项目代码时,就可以用它来做提交前检查...下面我们首先来看看Husky.Net的特点: Git的core.hooksPath功能提供支持; 信息展示友好; 支持多种操作系统; 支持Git GUI; 支持自定义目录; 支持Staged-hooks...; dotnet-format集成 Husky.Net它支持两种安装方式,分别是全局安装和本地安装。

    57710

    NET中的线程锁

    在.NET中,线程锁(Thread Locking)是一种重要的同步机制,用于确保多个线程在访问共享资源时不会发生冲突,保证线程安全。...线程锁的核心目标是避免数据竞争和不一致的状态,确保在同一时刻只有一个线程能够访问特定的资源或代码块。本文将详细讲解.NET中的线程锁,帮助你理解其工作原理、常见实现方式及注意事项。...在多线程编程中,多个线程可能同时访问共享资源(如变量、文件、数据库等)。...2. .NET 中线程锁的实现方式 在.NET中,线程锁的实现方式主要有以下几种: (1) lock 关键字 lock 是.NET中最常用的线程锁机制。...(2) Monitor 类 Monitor 类是 .NET 提供的低级别同步工具,lock 背后就是基于 Monitor 的实现。Monitor 提供了更精细的控制,可以手动获取和释放锁。

    53510

    .NET 9 中的 JsonSchemaExporter

    .NET 9 中的 JsonSchemaExporter Intro .NET 9 Preview 6 中引入了一个 JsonSchemaExporter,我们可以借助它根据类型来生成 json schema...jsonSchema node 的基础之上,如果属性名称是 id 或者 Id 的话就将它添加到 required 中或者创建一个 required 并将 id 属性名添加进去,输出结果如下: {"type...JsonSchema 支持还比较早期,对于复杂的需求可能还需要自己扩展,比如说设置 schema 需要类似前面示例一样自己扩展下,在 .NET 10 里应该还会继续优化和增强 References https...://github.com/WeihanLi/SamplesInPractice/blob/main/net9sample/Net9Samples/JsonSample.cs https://github.com...runtime/pull/103322 https://github.com/dotnet/runtime/issues/105769 https://www.jsonschemavalidator.net

    38800

    .Net中的加密解密

    .Net中的加密解密 2008-10-2 作者: 张子阳 分类: .Net 框架 引言 在一些比较重要的应用场景中,通过网络传递数据需要进行加密以保证安全。...本文将简单地介绍了加密解密的一些概念,以及相关的数字签名、证书,最后介绍了如何在.NET中对数据进行对称加密和解密。....NET中加密解密的支持 对称加密和解密 相信通过前面几页的叙述,大家已经明白了加密解密、数字签名的基本原理,下面我们看一下在.NET中是如何来支持加密解密的。...正如上面我们所进行的分类,.NET中也提供了两组类用于加密解密,一组为对称加密,一组为非对称加密,如下图所示: ?...NET中执行这个操作的中介者也是一个流类型,叫做CryptoStream。

    1.4K40

    .NET中的密钥加密

    对称密码学(密钥加密) 介绍 本教程将演示如何通过System.Security.Cryptography在.NET Framework 1.1中实现对称加密/密钥加密。...从某种意义上说,它也掩盖了大量恶行,因为那些有恶意的人无法阅读或者修改针对其他接收方的消息。 加密术语中的重要术语 将实际消息转换为编码形式(编码)被称为加密,并且反向转换(解码)被称为解密。...对称加密是最早开始使用的非常古老的加密方案之一,也称为密钥加密。在这种方案中,发送方和接收方共享相同的加密和解密密钥。...这意味着任何相同且处于相同消息中的明文或者使用相同密钥加密的不同消息块将被转换为相同的密文块。 填充 大多数明文消息不包含大量填充完整块的字节。通常没有足够的字节来填充最后一个块。...零填充字符串由设置为零的字节组成。 我们将只使用TripleDES和Rinjndael算法。 我们将在.NET Framework 1.1中实现这个概念。

    3.8K80

    .NET中的各种池

    在.NET中,常用到的池有四个:字符串拘留池、线程池 、应用程序池、数据库连接池。 字符串拘留池 在.NET中字符串是不可变对象,修改字符串变量的值会产生新的对象。...但这样做会破坏应用程序中的状态甚至导致程序挂起,这些不利于调试。 在.NET中,许多场景可以使用线程池。...如,异步I/O,回调,注册wait操作,使用委托的异步方法调用及System.Net 中的socket连接。...数据库连接池 和数据库服务器建立连接的过程是比较耗时的,对此,ADO.NET中使用了连接池来进行优化。在.NET中不同的Data Provider对于连接池的处理方式不尽相同。...IIS与ASP.NET中的线程池 iis最大连接数和队列长度 System.Threading.Tasks.Task引起的IIS应用程序池崩溃 HTTP.SYS 详解 IIS执行原理 IIS ASP.NET

    1.4K40
    领券