当前位置: 首页 > news >正文

_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_。但是这两个宏在内核代码中又时不时的出现&#xff0c;那么它们到底是什么含义呢? 1、宏定义 我们先看它们的宏定义 include./linux/kernel.h#define _RET_IP_ (unsigned long)__builtin_return_address(0)#define …...

Spring Boot 点餐系统:高效餐饮服务

第二章关键技术的研究 2.1相关技术 网上点餐系统是在Java MySQL开发环境的基础上开发的。Java是一种服务器端脚本语言&#xff0c;易于学习&#xff0c;实用且面向用户。全球超过35&#xff05;的Java驱动的互联网站点使用Java。MySQL是一个数据库管理系统&#xff0c;因为它的…...

RtspServer:轻量级RTSP服务器和推流器

文章目录 项目概述技术分析支持的编码格式传输方式心跳检测机制RTSP 推流安全性 架构分析RtspServer 整体架构流程分析1. 客户端连接和会话建立2. 媒体数据传输3. 心跳检测和连接维护 xop 基础库项目介绍功能特性xop 整体架构 应用场景社区问题收集与解答问题一&#xff1a;刚开…...

为什么结构化 Prompt 如此有效?

你好&#xff0c;我是三桥君 在今年&#xff0c;我研究了结构化编写Prompt的方法&#xff0c;并观察到这种结构化、模板化的Prompt能够有效地突破ChatGPT 3.5的限制&#xff0c;实现所谓的“越狱”。然而&#xff0c;为什么ChatGPT会对这种结构化Prompt如此有效呢&#xff1f;…...

无人机飞手培训校企合作特训技术详解

随着无人机技术的飞速发展&#xff0c;其在航拍、农业、测绘、救援等多个领域的应用日益广泛&#xff0c;市场对高素质无人机飞手的需求急剧增加。为满足这一需求&#xff0c;促进教育与产业深度融合&#xff0c;无人机飞手培训校企合作模式应运而生。本文将从确定合作目标、共…...

从零开始的软件开发详解:数字药店系统源码与医保购药APP

很多小伙伴们疑问&#xff0c;医保购药APP是如何开发的&#xff0c;今天我将从零数字药店系统源码开始为大家提供一条清晰的实现方案。 一、技术架构设计 在开发医保购药APP之前&#xff0c;首先需要明确技术架构。一般来说&#xff0c;APP的技术架构可以分为前端和后端。 1…...

【记录】在返回值类型为BigDecimal情况下末尾小数位为0的会省略不显示

【问题】&#xff1a;在返回值类型为BigDecimal情况下末尾小数位为0的会省略不显示 问题复现&#xff1a; 实体类 package com.zlp.aspect.entity;import java.math.BigDecimal;/*** program: my_utils* description:* author: zlp* create: 2024-09-24 10:01**/public clas…...

通信工程高级职称评审条件详细解读

通信工程只有正高和副高级别的职称&#xff0c;中级通信工程的职称是需要自己参加考试的&#xff0c;并不是评审获得&#xff0c;这个大家需要注意一下&#xff0c;先要考取中级通信工程师之后才能评审副高和正高级通信工程的职称。 下面跟甘建二一起来看看通信专业职称评审条件…...

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&#xff1a; 这个关键字请求编译器尽可能的将变量存在 CPU 内部寄存器中而不是通过内 存寻址访问以提高效率。注意是尽可能&#xff0c;不是绝对。你想想&#xff0c;一个 CPU 的寄存器也就那么 几个或几十个&#xff0c;你要是定义了很多很…...

网络资源模板--Android Studio 零食工坊(商城)

目录 一、项目演示 二、项目测试环境 三、项目详情 四、完整的项目源码 一、项目演示 网络资源模板--零食工坊 二、项目测试环境 三、项目详情 1. **加载 Fragment 布局**&#xff1a; - 使用 inflater.inflate 加载 fragment_snack 的布局。 2. **视图组件初始化**&am…...

百度高德坐标系相互转换

一、百度与高德坐标系互换 百度坐标系&#xff1a;bd09 高德坐标系&#xff1a; gcj02 import math# 坐标系转换&#xff1a;百度转高德&#xff0c;高德转百度 class CoordinateSystem:staticmethoddef bd09_to_gcj02(bd_lon, bd_lat):百度坐标系:bd09 转成高德坐标系 gcj0…...

免费下载6组简历模板,让HR一眼相中你!

简历是求职者向招聘单位展示自我的重要工具&#xff0c;选择一份高质量的简历模板免费下载&#xff0c;能够提升面试机会并留下深刻印象。优秀的简历模板需具备清晰的信息结构、出色的视觉效果及合理的排版布局。简历的配色可以凸显求职者的个性&#xff0c;而有逻辑性的排版则…...

设计模式之模版方法模式

定义 定义一个操作中的算法的骨架&#xff08;稳定&#xff09;&#xff0c;而将一些步骤延迟&#xff08;变化&#xff09;到子类中。模版方法使得子类可以不改变&#xff08;复用&#xff09;一个算法的结构即可重定义&#xff08;override 重写&#xff09;该算法的某些特定…...

解析!文档扫描 SDK 中的高级图像处理技术

随着世界数字化&#xff0c;文档扫描已成为现代商业运营的关键&#xff0c;它使文档的存储、访问和管理更加便捷。然而&#xff0c;扫描图像的质量对于这些数字档案的有效性至关重要。高质量的扫描可确保文本清晰、数据准确捕获并且信息易于检索。 另一方面&#xff0c;质量差…...

线性判别分析(LDA)中求协方差矩阵示例

让我们通过一个简单的例子计算协方差矩阵。假设我们有两类数据集 X 0 X_0 X0​ 和 X 1 X_1 X1​&#xff0c;每类有两个样本&#xff0c;每个样本有两个特征。 数据集&#xff1a; 类 0 的样本&#xff1a; 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&#xff0c;原因是node-sass安装比较困难&#xff0c;很多时候sass-loader无法安装成功。另外在win和Linux环境下运行行项目需要针对Linux搞一个node-sass的Linux版本。 问题分析 在 Vue 2 项目中使用 da…...

【机器学习】过拟合与欠拟合——如何优化模型性能

【机器学习】过拟合与欠拟合——如何优化模型性能 1. 引言 在机器学习中&#xff0c;模型的表现不仅依赖于算法的选择&#xff0c;还依赖于模型对数据的拟合情况。过拟合&#xff08;Overfitting&#xff09;和欠拟合&#xff08;Underfitting&#xff09;是模型训练过程中常…...

二进制日志gtid模式

# --skip-gtids&#xff0c;使用mysqlbinlog截取时添加该参数&#xff0c;会执行已经执行的事务 mysqlbinlog --skip-gtids --include-gtidsa56fdfdc-7699-11ef-8f40-000c297f81d5:40 /data/binlog/mysql-bin.000003 > gtid.sql # --skip-gtids&#xff0c;使用mysqlbinlog截…...

第07章 FastMCP 把检索封装成 Agent 工具

第07章 FastMCP 把检索封装成 Agent 工具 工单知识库已经能在 Python 进程内被普通函数调用&#xff0c;但要让外部 Agent、Web 后端或其他语言的客户端使用这份能力&#xff0c;函数级别的接口不够&#xff1a;缺少协议、缺少描述、缺少跨进程通讯。MCP&#xff08;Model Cont…...

保姆级教程:在CentOS 7/8服务器上部署DrissionPage爬虫(含Chrome无头模式配置)

CentOS服务器上DrissionPage爬虫的工业级部署指南 1. 环境准备与Chrome浏览器安装 在CentOS服务器上部署基于DrissionPage的爬虫系统&#xff0c;首要任务是构建稳定可靠的浏览器运行环境。与个人开发环境不同&#xff0c;生产服务器通常需要面对无图形界面、资源受限等特殊场景…...

【ElevenLabs情绪模拟技术白皮书】:基于2,147小时情感语音标注数据集的11类基础情绪迁移模型验证报告

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ElevenLabs情绪模拟技术白皮书概述 ElevenLabs的情绪模拟技术并非简单调节音高或语速&#xff0c;而是基于多模态情感表征学习&#xff08;Multimodal Affective Representation Learning, MARL&#x…...

Arm Iris调试接口:架构设计与工程实践详解

1. Iris调试与追踪接口深度解析调试与追踪技术是嵌入式系统开发的核心支柱&#xff0c;而Arm的Iris接口代表了这一领域的最新进展。作为一名长期从事嵌入式调试工具开发的工程师&#xff0c;我将带您深入剖析这套接口的设计哲学与实战应用。1.1 接口架构设计理念Iris的架构设计…...

Python自动化股票分析工具:从数据采集到可视化报告全流程实战

1. 项目概述&#xff1a;一个面向个人投资者的自动化股票分析工具如果你和我一样&#xff0c;是个对A股市场有点兴趣&#xff0c;但又没时间天天盯盘的上班族&#xff0c;那你肯定也经历过这种纠结&#xff1a;早上开盘前想看看心仪的几只股票有没有什么异动&#xff0c;结果一…...

轻量级服务器监控面板:从原理到部署实战

1. 项目概述&#xff1a;一个开源监控面板的诞生最近在折腾服务器和容器化应用&#xff0c;发现一个挺普遍的需求&#xff1a;当你手头有几台服务器&#xff0c;上面跑着几个Docker容器&#xff0c;或者一些自己写的服务&#xff0c;你总想知道它们现在“活”得怎么样。CPU是不…...

LC正弦波振荡器原理、设计与调试:从巴克豪森判据到电路实战

1. 从直流到交流&#xff1a;正弦波振荡器的核心价值与分类在电子电路的世界里&#xff0c;我们常常需要将稳定的直流电源&#xff0c;转换成特定频率和幅度的交流信号。这个看似“无中生有”的过程&#xff0c;正是正弦波振荡器的核心使命。无论是你手机里的无线通信模块、收音…...

【限时解密】ElevenLabs未文档化的/v1/text-to-speech/{voice_id}/with-timing接口:获取逐词时间戳+音素级对齐数据(仅剩3个Beta白名单通道)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ElevenLabs英文语音生成的核心能力与技术定位 ElevenLabs 是当前业界领先的 AI 语音合成平台&#xff0c;其英文语音生成能力建立在自研的端到端神经声学模型&#xff08;如 ElevenMultilingualV2&…...

AI绘图技能解析:用自然语言驱动Excalidraw自动生成图表

1. 项目概述&#xff1a;一个为Excalidraw注入AI灵魂的绘图技能如果你经常用Excalidraw画流程图、架构图或者白板草图&#xff0c;那你一定体会过那种“想法很丰满&#xff0c;画笔很骨感”的尴尬。脑子里明明有一个清晰的系统架构&#xff0c;但落到画布上&#xff0c;光是调整…...

轻量级协作平台设计:集成Git与敏捷开发的项目管理实践

1. 项目概述与核心价值最近在团队协作和项目管理工具选型上&#xff0c;又和几个技术负责人聊了一圈。大家普遍的感受是&#xff0c;市面上的工具要么太重&#xff0c;像Jira、Confluence&#xff0c;配置复杂&#xff0c;学习成本高&#xff0c;小团队用起来像“杀鸡用牛刀”&…...