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

Linux kernel中常见的宏整理

宏的一些奇技淫巧:https://gaomf.cn/2017/10/06/C_Macro/ 以下是整理的一些linux kernel中的常见宏,由于不同体系架构,或者不同模块的宏定义不同,只挑选了其中容易看懂的宏作为记录...Linux内核中do{...}while(0)意义: 辅助定义复杂的宏,避免引用的时候出错,如果不用{},if后面的语句只有第一条进行了判断。同时避免宏展开后“;”造成编译不通过....(1); } -=> struct { int : –1; } 如果e非0,结构体的int型数据域的位域将变为一个负数,产生语法的错误。...1 us 的延时*/ 系统调用宏 linux 内核中最常见的宏使用之一,系统调用 #define SYSCALL_DEFINE1(name, ...)...linux 内核的一些错误码,以它们的负数来作为函数返回值,简单地使用大于等于-4095的虚拟地址来分别表示相应的错误码。

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

    Linux kernel中常见的宏整理

    宏的一些奇技淫巧: https://gaomf.cn/2017/10/06/C_Macro/ 以下是整理的一些linux kernel中的常见宏,由于不同体系架构,或者不同模块的宏定义不同,只挑选了其中容易看懂的宏作为记录...Linux内核中do{...}while(0)意义: 辅助定义复杂的宏,避免引用的时候出错,如果不用{},if后面的语句只有第一条进行了判断。同时避免宏展开后“;”造成编译不通过....1 us 的延时*/ 系统调用宏 linux 内核中最常见的宏使用之一,系统调用: #define SYSCALL_DEFINE1(name, ...)...(x) __virt_to_phys((unsigned long)(x)) #define __va(x) ((void *)__phys_to_virt((unsigned long)(x))) 错误码相关的宏...linux 内核的一些错误码,以它们的负数来作为函数返回值,简单地使用大于等于-4095的虚拟地址来分别表示相应的错误码。

    1.7K20

    内存不足:解决大模型训练时的CUDA Out of Memory错误

    内存不足:解决大模型训练时的CUDA Out of Memory错误 摘要 大家好,我是默语,擅长全栈开发、运维和人工智能技术。...希望这篇文章能帮助大家更好地解决这一问题,提高模型训练的效率和稳定性。 引言 在深度学习模型的训练过程中,内存不足问题(即CUDA Out of Memory错误)常常会困扰开发者。...CUDA Out of Memory错误是指在使用NVIDIA GPU进行深度学习训练时,显存不足以容纳整个模型和数据,导致训练过程无法继续进行。...模型过大导致的显存不足 解决方案:模型裁剪和压缩 通过剪枝(Pruning)和量化(Quantization)技术,可以在保持模型性能的前提下,减少模型的参数数量,从而降低显存占用。...希望大家在解决CUDA Out of Memory错误的过程中,不断学习和探索新的方法,以提升模型训练的效率和性能。

    62610

    Linux内核中container_of宏的详细解释

    如何移植并使用Linux内核的通用链表(附完整代码实现)中提到的为什么在结构体中要把 struct list_head放在首位。...container_of宏 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE*)0)->MEMBER) #define container_of(ptr,...container_of宏的作用是通过结构体内某个成员变量的地址和该变量名,以及结构体类型。找到该结构体变量的地址。...这里使用的是一个利用编译器技术的小技巧,即先求得结构成员在结构中的偏移量,然后根据成员变量的地址反过来得出主结构变量的地址。..."sptr=%p\n",sptr); return 0; }   运行结果如下: sptr=0xffffcb90 sptr=0xffffcb90 sptr=0xffffcbb4   宏展开可能会看的更清楚一些

    1.3K10

    Linux TraceEvent - 我见过的史上最长宏定义

    可以看到 目录名称sample-trace由TRACE_SYSTEM这个宏定义,所以通过查找这个宏,就能知道有多少events的大类 每一个TRACE_EVENT都有一个自己的目录 源文件中trace_XXX...那么这些函数是怎么定义的呢? TRACE_EVENT定义 看完了例子,我们就该看代码实现了。讲真,这是我见过的最长的宏展开了。...怎么能很好的解释这个宏展开的过程呢?还是用一张图吧。倒吸一口气,准备一次无尽的代码阅读。 ? 终于完了,也不知道有没有漏掉什么。。。...不过相信我,你可能不太会愿意去看这个(捂脸) 回过头来再看这展开,让我们来总结一下这个过程: 一共包含了两个头文件:linux/tracepoint.h 和 trace/define_trace.h 在...哪怕有了上面这个图,我想大部分人也是不会去看的。或者说,看了可能也不知道这些宏展开究竟定义了些什么?

    4.5K40

    Linux下的常见错误配置

    经过对大量客户的配置审计与渗透测试,我们总结出了一些Linux系统下的常见配置错误。...我们相信总结、回顾这些常见错误可以在以后为我们节省更多时间与资源,更重要的是可以帮助系统管理员,使其服务器更加安全可靠。...五个常见配置错误如下: 1、用户/home目录的权限 2、系统中的getgid与setuid程序 3、全局可读/可写的文件/目录 4、使用包含漏洞的服务 5、默认的NFS挂载选项或不安全的导出选项 1、...用户的/home目录权限 在大部分Linux发行版中,/home目录的默认权限是755,即任何登录系统的用户都可以访问其他用户的/home目录。...这些设置在配置Linux服务器时经常会被忽视,而恰恰是这些不当配置,使攻击者或恶意用户可以非法获得大量信息,或者提升自己在服务器中的权限。

    1.8K60

    【Linux技巧1】nsenter命令解决容器内部命令不足的问题

    ,没有这些工具就非常的头疼。...其实容器内部和主机之间的网络环境是互相隔离的,处于独立的命名空间下,那如果能在主机上切换命名空间,就可以在主机上以容器的网络环境进行操作,就可以利用主机上的工具,利用这个思想,我们就能够实现不用进入容器内部也可以实现容器内部一样的环境...这种需求的工具就是我们今天要介绍的nsenter。 nsenter命令是一个可以在指定进程的命令空间下运行指定程序的命令。它位于util-linux包中。...如果指定了file,则进入file的命令空间 -G, --setgid gid:设置运行程序的gid -S, --setuid uid:设置运行程序的uid -r, --root[=directory]...,这里的pid=23069的容器的ip是10.0.0.2,可以看到已经打印出来了。

    2.7K00

    【Linux 内核】宏内核与微内核架构 ( 操作系统需要满足的要素 | 宏内核 | 微内核 | Linux 内核动态加载机制 )

    文章目录 一、操作系统需要满足的要素 二、宏内核 三、微内核 四、Linux 内核动态加载机制 一、操作系统需要满足的要素 ---- 电脑上运行的 操作系统 , 是一个 软件 ; 设备管理 : 操作系统需要..., 线程是独立运行 , 独立调度的最基本单位 ; 二、宏内核 ---- 宏内核 : 内核代码 编译成 二进制文件 , 内核 运行在 一个 大内核 地址空间 中 , 可以 直接 访问 , 调用 内核代码..., 这种内核优点是 效率高 , 性能强 ; 下图中 , 最上层是 " 系统调用 " , 中间是 " 宏内核 " , 最下方是 硬件层 ; 宏内核优点 : 设计简单 , 性能高 ; 三、微内核 ---...内核动态加载机制 ---- Linux 内核模块动态加载 : Linux 内核 使用了 模块设计 , 可以进行 动态加载 内核模块 ; Linux 内核的 核心实现 , 设备驱动实现 , 可以 编译成一个独立模块..., 这些独立模块可以被编译成 独立的目标文件 , 可以在运行时 , 动态 加载 / 卸载 内核模块 ; 开发简单 : Linux 内核模块引入 , 带来了很多便利 , 很多内核驱动 , 都可以 编译成动态

    4.5K30

    Linux网卡IP地址配置错误的影响🐧🔧

    在Linux系统中,网络配置是保持系统顺畅运行的关键一环。正确配置网卡的IP地址对于确保网络通信的准确性和效率至关重要。然而,如果在这个过程中发生错误,可能会带来一系列问题。...让我们一起探讨一下,如果Linux网卡的IP地址配置错误,会有什么影响。1. 无法连接到网络最直接的后果就是无法连接到网络。...就像你试图使用错误的钥匙开门一样,错误的IP地址意味着你的设备无法正确地与其他设备通信。这可能导致无法访问互联网,或者无法在局域网中与其他设备互动。2....网络性能下降错误的IP配置可能导致网络流量被错误地路由,从而降低网络性能。例如,如果子网掩码配置错误,可能会导致数据包走更长的路由,增加延迟,或者错误地被发送到不存在的地址。4....经过一番调查,问题被定位到了错误的IP配置上,但这一疏忽已经导致了数小时的生产力损失。7. 结论正确配置Linux网卡的IP地址对于维护网络的稳定性和安全性至关重要。

    21410

    被神话的Linux, 一文带你看清Linux在多核可扩展性设计上的不足

    在我看来,Linux内核只是在恰当的时间出现的一个恰好能跑的内核,并且恰好它是开源的,让人们可以第一次内窥一个操作系统内核的全貌罢了,这并不意味着它就一定是正确的。相反,它很可能是错误的。...如果我们循着操作系统理应实现的最本质的功能去思考,而不是以Linux作为先入为主的标准去思考,会发现Linux内核处理并发明显是一种错误的方式!...一直到今天,自旋锁在不断被优化,然而无论怎么优化,它始终都是一个不合时宜的自旋锁。 可见,Linux内核一开始就不是为SMP设计的,因此其并发模式是错误的,至少不是合适的。...因为在类似宏内核的同步任务中,由于并发上下文的相互隔离,整个任务必须被一个锁保护,比如 Linux内核的tcp_v4_rcv 里面的: bh_lock_sock_nested(sk); // 这部分耗时时间不确定...操作系统以两种态度对待它们: 认为其它资源并非操作系统核心的一部分,于是微内核,用户态驱动等等就形成了概念。 认为其它底层的资源也是操作系统核心的一部分,这就是宏内核比如Linux的态度。

    2K20

    Linux 新手容易犯的 7 个错误

    因为这两个操作系统有不同的假设和优先级,以及不同的做事方式。因此,新的Linux用户很容易混淆,因为他们使用Windows开发的期待结果不再适用。 ?...例如,下面就是很多Windows用户开始使用Linux的时候,会犯的7个错误(不按特定的顺序排序): 7.选择错误的Linux发行版 Linux有几百个不同的版本,或者称为发行版。...其中许多是专门针对不同版本或用户的。一旦选择错误,那么你的第一次亲身体验Linux会很快成为一个噩梦。 如果你在朋友的帮助下切换,那么要确保他们的推荐是适合你的,而不是适合他们的。...更多的情况是,Linux依赖于软件包管理系统,在这个软件包管理系统中,程序只安装绝对必要的软件,依赖已安装的软件来提供所需的任何东西。...但是,如果你在Linux上成功设置了这些实践中的任何一种,那么请注意,你作废了大多数的Linux安全优势(并且也不建议在Windows中使用) 哦,还有自动登录的选项,你可能会看到一个安装程序?

    81610

    C语言——指针(五)

    当我们改变该地址空间的数据后,尽管子程序调用结束,但是数据的改变情况也会被保留下来。 看下面这段代码,利用swap函数能实现实参a和b的交换吗?...,但是形参只是实参的临时拷贝,形参之间值的交换,无法影响到实参,所以也完成不了交换 当我们利用指针变量作为函数参数 #define _CRT_SECURE_NO_WARNINGS 1 #include...int n = 0; //n有const修饰 n = 20; //(错误)n无法修改 return 0; } 编译错误如下 在上述代码中,n的本质还是变量,只不过被const修饰以后...●如果表达式为假(返回值为零),assert() 就会报错,在标准错误流stderr中写入一条错误信息,显示没有通过表达式(包含这个表达式的文件名和行号) 2,assert的禁用 上面谈到了用assert...一般我们在Debug版本中使用assert,在Release中禁用assert 如:在vs这样的集成开发环境,Release版本中,是直接优化掉的; 但是在Linux的Release版本下,assert

    8310

    C++ 入门基础

    缺省参数 在函数声明时,为形参设定初始值,当有实参传入时,使用实参;如果没有实参传入,则启用初始值 缺省参数就像是现实中的舔狗、备胎,做好随时被需要的准备 #include //IO...,比如对于两个Add函数来说,Linux中会分别修饰为 _3Addii 与 _3Adddd,显然两者是不同的;而对于C语言来说两个函数名修饰后都为 Add 我们可以在 Linux 环境下,通过指令 objdump...(x, y) ((x) + (y)) //通过宏函数实现ADD,比较复杂、麻烦 除了使用复杂外,宏还存在以下缺点: 不能进行调试,宏是直接进行替换的 没有类型安全检查 在书籍《Effective C++...》 中,作者建议 使用 const 和 enum 替换宏定义的常量 使用内联函数 inline 替换宏函数 总之,宏很危险,需要少用 所谓内联函数就是在函数实现前加上 inline 修饰,此时函数会被编译器标记为内联函数...在 Realse 模式下,函数会像宏函数一样展开,提高程序运行速度 内联函数弥补了宏函数的不足,同时吸收了宏函数速度快的优点 内联函数可以全面替代宏,当然使用时也需要注意 频繁使用内联函数,编译出来的可执行程序会更大

    19610

    怎样利用 Clojure 的宏来创建自定义的控制结构,并且如何避免常见的错误?

    在 Clojure 中,宏是一种宏展开的机制,它可以用于创建自定义的控制结构。通过使用宏,你可以在编写代码时引入新的语法,从而使代码更具可读性和表达力。...然而,在编写宏时,有一些常见的错误应该避免: 避免无限递归:宏展开的过程是递归的,因此要确保宏不会无限递归调用自身。 使用符号引用:在宏展开过程中,你可能需要引用参数或其他外部变量。...在宏中,你应该使用符号引用来引用这些变量,而不是直接访问它们的值。使用~前缀来引用符号。 关注展开形式的层次结构:在宏中,你常常需要构建一个嵌套的展开形式。...考虑宏调用的上下文:宏将被展开的位置可能会对宏的行为产生影响。确保你了解宏在不同上下文中的运行方式。...通过遵循这些原则,你可以更好地利用 Clojure 的宏来创建自定义的控制结构,并避免常见的错误。

    8510

    提高代码逼格的利器:宏定义-从入门到放弃

    (1000 * 1000); // 调用 Windows 平台下的库函数(第一个字母是大写) #endif 那么,这些 linux, __linux, __linux__, WIN32, _WIN32...示例3:在编写 Windows 平台下的动态库时,声明导出和导入函数 #if defined(linux) || defined(__linux) || defined(__linux__) #...在 C++ 中,这样的操作可以通过参数模板来实现,所谓的模板也是一种代码动态生成机制。当定义了一个函数模板后,根据调用者的实参,来动态产生多个函数。...但是如果这样来使用宏: debug3("hello \n"); 编译的时候,会出现错误: error: expected expression before ‘)’ token。为什么呢?...动态创建错误编码与对应的错误字符串 这也是一个非常巧妙的例子,利用了 #(字符串化) 和 ##(拼接) 这 2 个功能来动态生成错误编码码和相应的错误字符串: #define MY_ERRORS

    1.2K40

    长文详解:C语言预处理命令

    带参宏调用的一般形式为: 宏名(实参表); 在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。 在带参宏定义中,形参不分配内存单元,因此不必作类型定义。...注意,在宏定义中表达式(y*y+3*y)两边的括号不能少,否则可能会发生错误。...以下给出MAX宏的两个安全版本(源自linux/kernel.h): #define MAX_S(x, y) ({ \ const typeof(x) _x = (x); \ const...为了避免宏替换时发生错误,宏定义中的字符串应加括号,字符串中出现的形式参数两边也应加括号。...若带参数宏定义中的参数称为形参,调用宏时的实际参数称为实参,则宏的展开可用以下三步来简单描述(该步骤与gcc摘录稍有不同,但更易操作): 1) 用实参替换形参,将实参代入宏文本中; 2) 若实参也是宏,

    3K10
    领券