22 memcpy 的调试

news2024/11/22 13:20:57

前言

同样是一个 很常用的 glibc 库函数 

不管是 用户业务代码 还是 很多类库的代码, 基本上都会用到 内存数据的拷贝 

不过 我们这里是从 具体的实现 来看一下 

它的实现 主要是使用 汇编 来进行实现的, 因此 理解需要一定的基础 

测试用例

就是简单的使用了一下 memcpy, memset, memcmp 

#include "stdio.h"
 
int main(int argc, char** argv) {
 
int x = 2;
int y = 3;
int z = x + y;
 
void *p1 = malloc(20);
void *p2 = malloc(20);
void *p3 = malloc(20);
printf("p1 : 0x%x\n", p1);
printf("p2 : 0x%x\n", p2);
printf("p3 : 0x%x\n", p3);

memset(p1, 'a', 12);
memcpy(p2, p1, 17);
int p1CmpResult = memcmp(p1, p2); 

printf(" x + y = %d, p1CmpResult = %d\n ", z, p1CmpResult);
 
}

memcpy 的实现

memcpy 的实现是在 memcpy.S 中 

但是通过调试发现, 类库的很多 memcpy 的调用都是走的这个 memcpy.S 

但是 用户代码中的 memcpy 却没有进入这里的断点, 呵呵 这个就是一些 我们常规的理解 和 实际运行时存在差异的一个体现了, 调试是 最准确的能够说明确实执行的这里的代码的证据 

上面 memcpy 的调用, 在 main 中的代码如下

可以看到是调用 "printf(" x + y = %d, p1CmpResult = %d\n ", z, p1CmpResult);" 的时候, 用户代码调用了 printf 函数, 然后 printf 的实现中具体调用了 memcpy 来处理业务 [这里主要是复制第一个 占位符之前的 常量字符串部分 " x + y = "]

如果是需要拷贝的长度 大于等于 32 字节, 则走后面 1after 的逻辑, 待会儿来看, 这里先看 小于 32 字节的拷贝处理 

道理大致如下, 32 以下的数字, 换为二进制的表示, 最大为 0b11111, 数字 0-31 的表示为 0/1个16 + 0/1个8 + 0/1个4 + 0/1个2 + 0/1个1 

因此 这里就是如果有 1 个 1, 则拷贝 1 字节, 如果有 1 个 2, 则拷贝 2 字节, 如果有 1 个 4, 则拷贝 4字节, 如果有 1 个 8, 则拷贝 8 字节, 如果有 1 个 16, 则拷贝 16 字节 

走到最后, 需求的 数量的数据均拷贝完成, 效率也是 最极限的效率 

如果是待拷贝的字节数大于等于 32 字节 

先拷贝源字节对其 对齐 8 字节的数据, 这里的 alignloop 就是循环处理 这多余的字节, 单字节循环处理 

后面的 32try, 以 32 字节为单位来开始循环拷贝数据, 循环拷贝, 最终剩余的数据小于 32 字节, 跳转到上面 小于32字节的处理流程 

后面的 大于1kb 的场景, 我们这里就不深究了 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/519263.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】10. 进程地址空间

1. 虚拟地址的引出 2. 感性理解 3. 区域划分 在理解虚拟地址空间之前首先了解区域划分是什么 在小学期间的三八线,让桌子分割成两个区域,类比到地址空间也是这样划分的。 操作系统需要对进程管理,进程存在不同的区域映射不同的虚拟地址 这…

【GAMES101】作业0学习总结

本系列博客为记录笔者在学习GAMES101课程时遇到的问题与思考。 GAMES101:课程官网GAMES101:B站视频GAMES101:相关文件下载(百度网盘) 一、环境搭建 以下说明两种环境搭建方法,一种为用原视频所提及的VirtualBox一键搭建环境&…

随笔-涨薪了

突然想起来上个月工资,绩效部分是按照1.01发的,多了10块钱,这也是一年半来第一次涨薪了,就去小龙、小虎我仨的小群里面嘚瑟一下: 我:两年来第一次涨薪,涨了12。 小龙:羡慕。 小虎…

11-CSS-概述、与HTML的结合方式

一、概述 CSS(层叠样式表)是一种用于控制网页外观和布局的样式语言。它可以独立于 HTML 或 XHTML 文档,以及任何标记语言使用,因此可以用于设计不同类型的文档,如 XML、SVG、XUL 等。CSS 提供了广泛的样式选择器&…

6.Java流在Android中的应用

字节流有哪些? 以输出流为例,输入流除PrintStream外,和输出流是一一对应的 OutputStream ByteArrayOutputStreamPipedOutputStreamFilterOutputStream BufferedOutputStreamDataOutputStreamPrintStream FileOutputStreamObjectOutputStream 使用案例 DataOutputStream dos…

生信刷题之ROSALIND——Part 5 (PERM, PRTM, REVP)

公众号搜索《生信er》,内容更多,更精彩~ 目录 公众号搜索《生信er》,内容更多,更精彩~1、Enumerating Gene OrdersProblemSample DatasetSample OutputexampleCodeOutput 2、Calculating Protein MassProblemSample DatasetSample…

产品经理如何分析业务需求

目录 背景方案一:汇总所有推课的功能二:设置推课机器人的方法三:方法之间的关系四:方法合并五:方法汇总 总结 背景 现在我们开始设计第三版AR***,我负责的部分是推课部分,在领导的一步步引导之…

51单片机(十二)AT24C02(I2C)

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要…

车企招聘高薪车载开发岗位,如何抓住机会进入该领域?

随着智能化、电动化和网联化的趋势不断加强,车载应用正在成为汽车和信息技术产业的一个重要领域。未来的车载应用将会实现智能驾驶、舒适性、智能信息娱乐等领域的创新,为车辆和车主带来更好的用户体验。 从行业来看,车载应用的相关企业不断…

Azkaban学习——单机版安装与部署

目录 1.解压改名 2.修改装有mysql的虚拟机的my.cnf文件 3.重启装有mysql的虚拟机 4.Datagrip创建azkaban数据库,执行脚本文件 5.修改/opt/soft/azkaban-exec/conf/azkaban.properties文件 6.修改commonprivate.properties 7.传入mysql-connector-java-8.0.29…

最简单的helm教程

最简单的Helm教程 学习前置条件 你得了解Kubernetes,拥有实际的使用经验那是最好不过了 Helm是什么? 我们打开Helm的官网:Helm的官网 可以看到官网的第一页就告诉了我们Helm是什么。 **Helm是Kubernetes(k8s)的包…

第十二届蓝桥杯青少组省赛Python真题,包含答案

目录 一、选择题 二、编程题 第十二届蓝桥杯青少组省赛Python真题 一、选择题 第 1 题 单选题 设s="Hello Lan Qiao,执行print(s[4:11])输出的结果为 () 答案:D 第 2 题 单选题 循环语句for iin range (8,4,2) : 执行了几次循环 ()

进腾讯了,38k....

大家好,最近有一位老同学成功去了腾讯,特意找他要了一些面试相关的资料,内容涵盖测试理论、Linux基础、MySQL基础、Web测试、接口测试、App测试、管理工具、Python基础、Selenium相关、性能测试、LordRunner相关等质量非常高!&…

SM2椭圆曲线公钥密码算法--密钥对与数字签名

1. SM2国密算法介绍 SM2算法全称是SM2椭圆曲线公钥密码算法(SM是商用密码的拼音缩写),是一种基于“椭圆曲线”的密码ECC(Elliptic Curve Cryptography)。2016年,SM2成为中国国家密码标准。 在商用密码体系中,SM2主要用…

超详细,多图 PVE 安装 OpenWRT 教程(个人记录)

前言 - 写这个的目的是因为本人健忘所以做个记录以便日后再折腾时查阅。 - 本人笔拙如有选词,错字,语法,标点错误请忽视,大概率不会修改,我自己能看懂就好。 - 内容仅适用于本人的使用环境,不同环境请忽…

Java --- redis7之布隆过滤器BloomFilter

目录 一、布隆过滤器BloomFilter 1.1、面试题 1.2、 布隆过滤器简介 1.2.1、设计思想 1.3、特点 1.4、布隆过滤器原理 1.4.1、实现原理与数据结构 1.4.2、添加key、查询key 1.4.3、hash冲突导致数据不精准 1.4.4、三步骤 1.4.5、布隆过滤器误判,为什么不…

使用ncnn在树莓派4B上部署nanoDet-m网络(12fps)

1. 背景 在机器人的应用中,目标检测是一个重要的课题。深度学习的快速发展,在检测的效果方面对比大多数传统检测算法,都有明显的优势。但是将深度学习模型部署到端侧设备上,实现高效的推理,同样是一个问题很多的领域。…

1099 Build A Binary Search Tree(超详细注解+38行代码)

分数 30 全屏浏览题目 作者 CHEN, Yue 单位 浙江大学 A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains only nodes with keys less than the nodes key.The right subtree…

Word+ChatGPT,一分钟完成周报总结作文

大家好,我是可夫小子,关注AIGC、读书和自媒体。解锁更多ChatGPT、AI绘画玩法。加:keeepdance,备注:chatgpt,拉你进群。 Office 的办公软件Word,是我们日常的文字工作的阵地。与ChatGPT的文字生成…

自学黑客【网络安全】,一般人我劝你还是算了吧

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员(以编程为基础的学习)再开始学习 我一直强调不要以编程为基础再开始学习网络安全,一般来说,学习编程不但学习周期长,而且实际向安全过渡后可用到的关键…