_RET_IP_ 和_THIS_IP_ 作用
在Linux内核中,有两个罕见的宏定义_RET_IP_ 和_THIS_IP_。但是这两个宏在内核代码中又时不时的出现,那么它们到底是什么含义呢?
1、宏定义
我们先看它们的宏定义
include./linux/kernel.h#define _RET_IP_ (unsigned long)__builtin_return_address(0)#define _THIS_IP_ ({ __label__ __here; __here: (unsigned long)&&__here; })
我们先看_RET_IP_的含义:
#define _RET_IP_ (unsigned long)__builtin_return_address(0)
其中__builtin_return_address(0) 是gcc内建函数,返回函数的返回地址。所以_RET_IP_ 宏定义用于返回当前函数的返回地址(当前函数被调用处的地址)。
在看看_THIS_IP_的含义:
#define _THIS_IP_ ({ __label__ __here; __here: (unsigned long)&&__here; })
__lable__ 是gcc对c语言的扩展,用于局部标签,__label__ __here; 声明了一个局部标签__here。
什么是局部标签?
GCC allows you to declare local labels(局部标签) in any nested block scope.A local label is just like an ordinary label, but you can only reference it (with a goto statement, or by taking its address) within the block in which it is declared.
一个局部标签只是一个标识符:可以使用通常的goto语句进行跳转或者获取其地址,但是只能在其所属的域内内。
A local label declaration looks like this:(局部标签定义如下:)
__label__ label;
or
__label__ label1, label2, /* … */;
You can get the address of a label defined in the current function (or a containing function) with the unary operator ‘&&’.The value has type void *.
我们可以通过'&&'符号来获取局部标签的地址(获取变量的地址是'&'),地址类型为void *.
#define _THIS_IP_ ({ __label__ __here; __here: (unsigned long)&&__here; })
先定义了一个局部标签 __here,后面是__here标签的内容,和我们使用goto语句时的标签的用法是一样的, __here: (unsigned long)&&__here; 返回局部标签__here所在位置的地址。所以_THIS_IP_返回当前位置的地址(PC指针的值)。
内核中有个专门返回当前代码段的地址的宏定义:
#define current_text_addr() ({ __label__ _l; _l: &&_l;})
和_THIS_IP_的宏定义是一样的。
2、测试
下面我们写个简单的程序测试下
#include <stdio.h>
#include <stdlib.h>#define _RET_IP_ (unsigned long)__builtin_return_address(0)#define _THIS_IP_ ({ __label__ __here; __here: (unsigned long)&&__here; })void bar(void)
{/*This is bar (400551,40052a) */printf("This is bar (%x,%x) \012",_RET_IP_,_THIS_IP_);return ;
}int main()
{bar();return 0;
}
上面程序输出结果是:This is bar (400551,40052a)
我们将上面程序反汇编结果如下:
0000000000400526 <bar>:
400526: 55 push %rbp
400527: 48 89 e5 mov %rsp,%rbp
40052a: ba 2a 05 40 00 mov $0x40052a,%edx
40052f: 48 8b 45 08 mov 0x8(%rbp),%rax
400533: 48 89 c6 mov %rax,%rsi
400536: bf e4 05 40 00 mov $0x4005e4,%edi
40053b: b8 00 00 00 00 mov $0x0,%eax
400540: e8 bb fe ff ff callq 400400 <printf@plt>
400545: 90 nop
400546: 5d pop %rbp
400547: c3 retq
0000000000400548 <main>:
400548: 55 push %rbp
400549: 48 89 e5 mov %rsp,%rbp
40054c: e8 d5 ff ff ff callq 400526 <bar>
400551: b8 00 00 00 00 mov $0x0,%eax
400556: 5d pop %rbp
400557: c3 retq
400558: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
40055f: 00
_RET_IP_的打印结果是400551,但是调用bar函数的地址是40054c。由于流水线的原因,取指完成后PC=PC+4,所以_RET_IP_的值为400551.
_THIS_IP_的打印结果是40052a,该地址是printf打印中_THIS_IP_入栈时的地址值。
上面的打印结果和我们理解的结果是一致的。
相关文章:
_RET_IP_ 和_THIS_IP_ 作用
在Linux内核中,有两个罕见的宏定义_RET_IP_ 和_THIS_IP_。但是这两个宏在内核代码中又时不时的出现,那么它们到底是什么含义呢? 1、宏定义 我们先看它们的宏定义 include./linux/kernel.h#define _RET_IP_ (unsigned long)__builtin_return_address(0)#define …...
Spring Boot 点餐系统:高效餐饮服务
第二章关键技术的研究 2.1相关技术 网上点餐系统是在Java MySQL开发环境的基础上开发的。Java是一种服务器端脚本语言,易于学习,实用且面向用户。全球超过35%的Java驱动的互联网站点使用Java。MySQL是一个数据库管理系统,因为它的…...
RtspServer:轻量级RTSP服务器和推流器
文章目录 项目概述技术分析支持的编码格式传输方式心跳检测机制RTSP 推流安全性 架构分析RtspServer 整体架构流程分析1. 客户端连接和会话建立2. 媒体数据传输3. 心跳检测和连接维护 xop 基础库项目介绍功能特性xop 整体架构 应用场景社区问题收集与解答问题一:刚开…...
为什么结构化 Prompt 如此有效?
你好,我是三桥君 在今年,我研究了结构化编写Prompt的方法,并观察到这种结构化、模板化的Prompt能够有效地突破ChatGPT 3.5的限制,实现所谓的“越狱”。然而,为什么ChatGPT会对这种结构化Prompt如此有效呢?…...
无人机飞手培训校企合作特训技术详解
随着无人机技术的飞速发展,其在航拍、农业、测绘、救援等多个领域的应用日益广泛,市场对高素质无人机飞手的需求急剧增加。为满足这一需求,促进教育与产业深度融合,无人机飞手培训校企合作模式应运而生。本文将从确定合作目标、共…...
从零开始的软件开发详解:数字药店系统源码与医保购药APP
很多小伙伴们疑问,医保购药APP是如何开发的,今天我将从零数字药店系统源码开始为大家提供一条清晰的实现方案。 一、技术架构设计 在开发医保购药APP之前,首先需要明确技术架构。一般来说,APP的技术架构可以分为前端和后端。 1…...
【记录】在返回值类型为BigDecimal情况下末尾小数位为0的会省略不显示
【问题】:在返回值类型为BigDecimal情况下末尾小数位为0的会省略不显示 问题复现: 实体类 package com.zlp.aspect.entity;import java.math.BigDecimal;/*** program: my_utils* description:* author: zlp* create: 2024-09-24 10:01**/public clas…...
通信工程高级职称评审条件详细解读
通信工程只有正高和副高级别的职称,中级通信工程的职称是需要自己参加考试的,并不是评审获得,这个大家需要注意一下,先要考取中级通信工程师之后才能评审副高和正高级通信工程的职称。 下面跟甘建二一起来看看通信专业职称评审条件…...
yolov8环境安装
yolov8 git地址 https://github.com/ultralytics/ultralytics/tree/main 我的电脑显卡配置 nvidia-smi cuda11.8下载 https://developer.nvidia.com/cuda-11-8-0-download-archive?target_osWindows&target_archx86_64&target_version10&target_typeexe_local …...
C语言中易混淆概念的关键字
最快的关键字---- register register: 这个关键字请求编译器尽可能的将变量存在 CPU 内部寄存器中而不是通过内 存寻址访问以提高效率。注意是尽可能,不是绝对。你想想,一个 CPU 的寄存器也就那么 几个或几十个,你要是定义了很多很…...
网络资源模板--Android Studio 零食工坊(商城)
目录 一、项目演示 二、项目测试环境 三、项目详情 四、完整的项目源码 一、项目演示 网络资源模板--零食工坊 二、项目测试环境 三、项目详情 1. **加载 Fragment 布局**: - 使用 inflater.inflate 加载 fragment_snack 的布局。 2. **视图组件初始化**&am…...
百度高德坐标系相互转换
一、百度与高德坐标系互换 百度坐标系:bd09 高德坐标系: gcj02 import math# 坐标系转换:百度转高德,高德转百度 class CoordinateSystem:staticmethoddef bd09_to_gcj02(bd_lon, bd_lat):百度坐标系:bd09 转成高德坐标系 gcj0…...
免费下载6组简历模板,让HR一眼相中你!
简历是求职者向招聘单位展示自我的重要工具,选择一份高质量的简历模板免费下载,能够提升面试机会并留下深刻印象。优秀的简历模板需具备清晰的信息结构、出色的视觉效果及合理的排版布局。简历的配色可以凸显求职者的个性,而有逻辑性的排版则…...
设计模式之模版方法模式
定义 定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。模版方法使得子类可以不改变(复用)一个算法的结构即可重定义(override 重写)该算法的某些特定…...
解析!文档扫描 SDK 中的高级图像处理技术
随着世界数字化,文档扫描已成为现代商业运营的关键,它使文档的存储、访问和管理更加便捷。然而,扫描图像的质量对于这些数字档案的有效性至关重要。高质量的扫描可确保文本清晰、数据准确捕获并且信息易于检索。 另一方面,质量差…...
线性判别分析(LDA)中求协方差矩阵示例
让我们通过一个简单的例子计算协方差矩阵。假设我们有两类数据集 X 0 X_0 X0 和 X 1 X_1 X1,每类有两个样本,每个样本有两个特征。 数据集: 类 0 的样本: X 0 [ 1 2 2 3 ] X_0 \begin{bmatrix} 1 & 2 \\ 2 & 3…...
Maven的详细解读和配置
目录 一、Maven 1.1 引言 1.2 介绍 1.3 下载安装 1.3.1 解压 1.3.2 配置环境变量 1.3.3 测试 1.4 仓库[了解] 1.5 Maven配置 1.5.1 修改仓库位置 1.5.2 设置镜像 二、IDEA - MAVEN 2.1 idea关联maven 2.2 为新项目设置 2.2 创建java项目[重点] 2.3 java项目结构…...
在vue2项目中使用dart-sass
问题描述 在vue2项目中使用dart-sass。或者将node-sass换成dart-sass,原因是node-sass安装比较困难,很多时候sass-loader无法安装成功。另外在win和Linux环境下运行行项目需要针对Linux搞一个node-sass的Linux版本。 问题分析 在 Vue 2 项目中使用 da…...
【机器学习】过拟合与欠拟合——如何优化模型性能
【机器学习】过拟合与欠拟合——如何优化模型性能 1. 引言 在机器学习中,模型的表现不仅依赖于算法的选择,还依赖于模型对数据的拟合情况。过拟合(Overfitting)和欠拟合(Underfitting)是模型训练过程中常…...
二进制日志gtid模式
# --skip-gtids,使用mysqlbinlog截取时添加该参数,会执行已经执行的事务 mysqlbinlog --skip-gtids --include-gtidsa56fdfdc-7699-11ef-8f40-000c297f81d5:40 /data/binlog/mysql-bin.000003 > gtid.sql # --skip-gtids,使用mysqlbinlog截…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
