Linux内核中memcpy的实现

2024-02-09

I see memcpylinux内核实模式下的实现:

GLOBAL(memcpy)
    pushw   %si
    pushw   %di
    movw    %ax, %di
    movw    %dx, %si
    pushw   %cx
    shrw    $2, %cx
    rep; movsl
    popw    %cx
    andw    $3, %cx
    rep; movsb
    popw    %di
    popw    %si
    retl
ENDPROC(memcpy)

我之前理解第一部分rep; movsl,但是为什么第二部分是在之后rep; movsl,它已经复制自si -> di32 字节。为什么是第二部分,我认为只有一个原因需要再次处理地址所在的结构si未按 4 字节对齐。

谢谢。


以下是相关代码行,并带有注释来解释它们的作用:

shrw    $2, %cx   ; length /= sizeof(DWORD)
rep; movsl        ; Copy the first length/sizeof(DWORD) DWORDs
popw    %cx       ; Restore the original length
andw    $3, %cx   ; length &= 3, i.e. length %= sizeof(DWORD)
rep; movsb        ; Copy the remaining length % sizeof(DWORD) bytes (if any)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux内核中memcpy的实现 的相关文章

  • nasm/ld“重定位被截断以适合:R_386_16”

    集会 BITS 16 global start start mov ax 0x07C0 mov ds ax mov si hw call print string jmp print string mov ah 0x0E char lods
  • C/C++ with GCC:静态地将资源文件添加到可执行文件/库

    有人知道如何使用 GCC 将任何资源文件静态编译为可执行文件或共享库文件吗 例如 我想添加永远不会改变的图像文件 如果它们改变了 我无论如何都必须替换该文件 并且不希望它们位于文件系统中 如果这是可能的 我认为这是因为 Visual C f
  • 有没有办法改变vim的默认模式

    有谁知道如何更改vim的默认模式 它的默认模式是命令模式 但是我可以将其更改为插入模式吗 只需将以下行添加到您的 vimrc 中 start Vim s default mode will be changed to Insert mode
  • bash.sh 运行 cron 的权限被拒绝

    如何在这里使用 bash 脚本运行 cron 我做了如下操作 这里有错误 我想知道如何在 ubuntu 中做到这一点 我现在对它感到震惊 bash sh 文件 bin bash cd var www Controller usr bin p
  • 在 AT&T x86 程序集中查找转义字符

    问题一 我有以下汇编代码 其目的是循环输入字符串 并计算它遇到的转义字符 的数量 globl sprinter data escape string string num escape long 0 num characters long
  • 如何获取文件夹的大小,包括稀疏文件的表观大小? (du太慢了)

    我有一个包含很多KVM qcow2文件的文件夹 它们都是稀疏文件 现在我需要获取文件夹的总大小 qcow2 文件大小应计为表观大小 而不是实际大小 例如 图片 c9f38caf104b4d338cc1bbdd640dca89 qcow2 文
  • C 标准库函数与系统调用。哪个是“open()”?

    I know fopen 在C标准库中 所以我绝对可以调用fopen C 程序中的函数 我感到困惑的是为什么我可以打电话给open 功能也一样 open 应该是系统调用 所以它不是标准库中的C函数 因为我能够成功地调用open 函数 我调用
  • 将 2 个数字与汇编进行比较[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有以下代码 我想完成汇编代码 如下
  • Git - 致命:无法获取当前工作目录?

    When I git clone从回购协议中 我得到 fatal Could not get current working directory No such file or directory 我该怎么办 我检查了服务器并发现 git文
  • Tomcat 中的 403 访问被拒绝

    我有以下内容tomcat users xml
  • pip 找不到满足要求的版本 django==2.2.1

    我刚刚将操作系统更改为 linux 并且想安装 django 但我无法安装最新版本的 django 我努力了 pip install django 但是它安装了 django 1 11 11 这不是我需要的 我还将我的 pip 升级到了 1
  • 在 Windows 下使用 linux 实用程序的最佳方法是什么? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Linux 实用程序 如 sed awk 和其他 shell 脚本功能 非常棒 但当我在 Windows 上进行开发并且无法使用其中任何一
  • 容器上的“container_memory_working_set_bytes”指标和 OOM-killer 之间有什么关系?

    我试图找出并理解 OOM killer 如何在容器上工作 为了弄清楚这一点 我读了很多文章 发现 OOM killer 会根据oom score And oom score是由oom score adj以及该进程的内存使用情况 有两个指标c
  • 使用多个 NIC 广播 UDP 数据包

    我正在 Linux 中为相机控制器构建嵌入式系统 非实时 我在让网络做我想做的事情时遇到问题 该系统有 3 个 NIC 1 个 100base T 和 2 个千兆端口 我将较慢的连接到相机 这就是它支持的全部 而较快的连接是与其他机器的点对
  • 编写一个新的 jit

    我有兴趣用 C 启动我自己的 JIT 项目 我对汇编或编译器设计等并不熟悉 但是 我对生成的机器代码格式非常不熟悉 比如 当一切都说了和完成后 mov 指令实际上是什么样子 是时候调用它了函数指针 那么 创建这样的东西的最佳资源是什么 编辑
  • C:运行系统命令并获取输出? [复制]

    这个问题在这里已经有答案了 我想在 Linux 中运行一个命令并获取其输出内容的返回文本 但我do not想要将此文本打印到屏幕上 有没有比制作临时文件更优雅的方法 你想要 popen http linux die net man 3 po
  • Java 内存错误:无法创建新的本机线程

    运行 java 服务器时 我在 UNIX 服务器上收到此错误 Exception in thread Thread 0 java lang OutOfMemoryError unable to create new native threa
  • 如何使用 sed 交换两行?

    有谁知道如何更换line a with line b and line b with line a使用 sed 编辑器在文本文件中 我可以看到如何用保留空间中的一行替换模式空间中的一行 即 Paco x or Paco g 但是如果我想采取
  • copy_from_user() 错误:目标大小太小

    我正在为内核模块编写 ioctl 处理程序 我想从用户空间复制数据 当我编译禁用优化的代码时 O0 gflags 编译器返回以下错误 include linux thread info h 136 17 error call to bad
  • 在linux中将包含word的行从一个文件复制到另一个文件

    我想复制包含某些单词的行file1 to file2 Suppose file1 ram 100 ct 50 gopal 200 bc 40 ravi 50 ct 40 krishna 200 ct 100 file2应该只有包含 ct 的

随机推荐

  • 使用带有注入承诺的 ngRoute 'resolve' 参数

    我已经配置了resolve返回 Promise 的多个路由的参数 以便延迟控制器的实例化 直到 Promise 得到解决 目前我使用函数符号 而不是指定要注入的字符串 例如 when article id templateUrl app a
  • 从程序集中公开不同的类型名称(别名)

    这个问题与一个相关我之前未回答的问题 https stackoverflow com q 22097706 409279 因为我仍在解决同样的问题 但这是一种不同的方法 我目前正在 C NET 项目中使用第三方 SOAP Web 服务 不幸
  • 使用 OR 运算符的 IIF 查询不起作用

    我正在尝试在 MS Access 查询中运行以下内容作为条件 基本上我想做的是 如果 checkbox True 则显示所有记录 包括那些空白或空字段的记录 我的表单组合框 combo9 中的默认值为 如果 checkbox False 则
  • 使用knockoutjs虚拟元素动态创建html部分

    我试图将 虚拟元素 与 html 绑定一起使用来动态创建 html 部分 但失败并显示消息 绑定 html 不能与虚拟元素一起使用 这是jsfiddle http jsfiddle net d3Dpp http jsfiddle net d
  • 设置为 0.1 的浮点数将 false 与 0.1 进行比较[重复]

    这个问题在这里已经有答案了 int main float f 0 1 if f 0 1 printf True else printf False 我只是c的初学者 我不明白上述程序的行为 输出为假 为什么 0 1 is a double文
  • 整个应用程序中的一个 BillingClient 实例

    我有一个有很多活动的应用程序 其中一项活动是显示购买选项 在计费库的示例应用程序中 https github com googlesamples android play billing https github com googlesam
  • 计算流中的标准差

    使用 Python 假设我正在运行已知数量的项目I 并能够计算处理每一项所需的时间t 以及处理所花费的总时间T以及迄今为止已处理的项目数量c 我目前正在即时计算平均值A T c但这可能会因为单个项目需要非常长的时间来处理 几秒与几毫秒 而产
  • 使用 'document.body.scrollHeight;' 计算 UIWebView 内容动态高度在 iOS 10 中返回更大的值

    我正在使用 Objective C 创建一个应用程序 其中我使用的是UIWebView以 HTML 格式显示内容 我正在使用下面的代码UIWebView委托方法webViewDidFinishLoad NSUInteger contentH
  • 无法编译:节文本中无法识别重定位 0x2a

    编译 make 时我收到一条错误消息 make g fopenmp o lang test main o I include Lheader I include L lib llmi lblas lboost regex lpthread
  • php获取接口方法

    是否可以获取已实现接口的方法 例如 仅返回界面中的函数 bar interface iFoo public function bar class Foo implements iFoo public function bar public
  • 在java中,是否可以将Serialized接口添加到运行时没有它的类中?

    我想要序列化一个类 并且它实现了 Serializable 但它包含的对象之一没有实现 Serializable 有没有办法在运行时修改类以使其实现 Serialized 接口 以便我可以序列化它 我无法在编译时更改它 因为它是第三方库 也
  • IEnumerable 作为 WCF 方法的返回类型

    如果我定义一个具有字符串和日期时间属性的 Test 对象 并使用它返回 WCF 中的 IEnumerable T 集合 OperationContract IEnumerable
  • 如何在spyder中添加所有python库

    如何在 Spyder IDE 中添加我已使用终端下载并存在于目录 home username local lib python3 6 site packages 中的所有 python 库 我找到了答案 只需转到 工具 gt PYTHONP
  • 聚合根引用其他聚合根

    我目前正在大量使用 DDD 并且在从其他聚合根加载 操作聚合根时遇到问题 对于模型中的每个聚合根 我还有一个存储库 存储库负责处理根的持久性操作 假设我有两个聚合根 以及一些成员 实体和值对象 聚合根 1 和聚合根 2 AggregateR
  • 在一个逗号分隔的单元格中显示所有匹配的值

    我的 Excel 2010 电子表格中有两列数据 A 列中是一个类别 B 列中是一个值 对于 A 列中的每个唯一类别 B 列中将有多个值 我想在单独的工作表中实现的目标是在一个逗号 或分号等 分隔的单元格中显示每个唯一类别的所有值 例如 如
  • kafka-python 中的多处理

    我一直在使用 python kaka 模块从 kafka 代理中消费 我想并行使用具有 x 个分区的同一主题 该文档有这样的内容 Use multiple consumers in parallel w 0 9 kafka brokers
  • 从 GitHub 下载速度非常慢

    从 GitHub 克隆存储库时 我有时只能获得 50 100 KiB 秒 保持稳定 的下载速率 而大多数时候我的下载速率约为 10 MiB 秒 当从不同的机器 不同的全局IP 克隆相同的存储库时 我获得了全速 GitHub 对存储库克隆有速
  • 从 JavaScript 对象创建 HTML 表

    我是 JavaScript 的初学者 想要在 HTML 中显示对象数组 数据的格式是这样的 key apple value 1 90 key berry value 1 7 key banana value 1 5 key cherry v
  • 在 Android 中使用 firebase firestore 在不同条件下创建私人聊天和群聊

    我必须使用 firebase firestore 在现有应用程序中实现聊天功能 但有两种情况 创建私人聊天 在这种情况下 我有包含用户列表的回收器视图 同时我选择特定用户 然后开始当前用户和所选用户的通信 群聊 在这种情况下 我有食品列表
  • Linux内核中memcpy的实现

    I see memcpylinux内核实模式下的实现 GLOBAL memcpy pushw si pushw di movw ax di movw dx si pushw cx shrw 2 cx rep movsl popw cx an