首页
学习
活动
专区
工具
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虚拟地址来分别表示相应错误码。

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

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.6K20

Linux内核container_of深度剖析

1、前面说 我在好几年前读linux 驱动代码时候看到这个,百度了好久,知道怎么用了,但是对实现过程和原理还是一知半解。...container_oflinux内核代码里面使用次数非常非常多,对于喜欢linux编程同学来说,了解其实现方法,对以后看内核代码,写内核驱动帮助都非常大,当然,我不是说了解这个就可以为所欲为了...4.5、const int* p作用 上面的定义里面还有一个小知识点 const typeof( ((type *)0)->member ) *__mptr 上面的代码可以简写成 const int...5、 container_of 剖析 看完上面的几个知识点,再来看container_of这个就显得非常清晰了。...6、实例代码 经过上面的解释,至少对这个有感觉了吧,写个代码来测试一下,让自己与代码融合为一体,这样才能做到人码合一境界。

69821

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.2K10

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

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

4.1K40

Linux常见错误配置

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

1.7K60

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,可以看到已经打印出来了。

2K00

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

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

4K30

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

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

1.9K20

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

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

9810

Linux 新手容易犯 7 个错误

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

76710

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版本中,是直接优化掉; 但是在LinuxRelease版本下,assert

5810

C++ 入门基础

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

15210

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

(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

98340

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

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

2.5K10

C++常见问题(二)——虚函数、类与结构、引用与值传递

异常处理方法包括两个方面: (1)throw表达式,错误检测部分使用这种表达式来说明遇到了不可处理错误,可以说,throw引发了异常条件。 (2)try块,错误处理部分使用它来处理异常。...定义语法格式: #define ,其中标识符就是所谓符号常量,也称为”名”。...预处理工作也叫展开。定义不占用内存和编译时间。...virtual ()=0; } 六 引用与值传递区别 值传递将要传递值作为一个副本传递,在函数调用时,实参把它值传递给对应形参,方法执行中实参值不会发生改变...形参实参区别:形参是函数定义或者声明时函数形式参数,形参表制定了函数参数个数和数据类型,实参是函数调用时传递给函数参数,传递时要与形参一一对应。

84560
领券