以下用于将Linux内核中的虚拟地址转换为物理地址。但是这是什么意思?

我对装配知识非常有限

163 #define __pv_stub(from,to,instr,type)

164 __asm__("@ __pv_stub

"

165 "1: " instr " %0, %1, %2

"

166 " .pushsection .pv_table,"a"

"

167 " .long 1b

"

168 " .popsection

"

169 : "=r" (to)

170 : "r" (from), "I" (type))

答案

这不是真正的“汇编”,因为这个宏本身没有指令。

它只是一个插入instr(传递给宏的指令)的宏,它有一个输入操作数from,一个立即(常量)输入操作数type和一个输出操作数to。

还有pushsection和popsection之间的部分,它在特定的二进制部分pv_table中记录了该指令的地址。这允许内核在其代码中找到这些位置。

最后一部分是asm约束和操作数。它列出了编译器将用qzxswpoi,%0和%1替换的内容。 %2是第一个列出的(%0),它意味着%0将是任何通用寄存器,即输出操作数将存储在宏参数"=r"(to)中。其他2是相似的,除了它们是输入操作数:to是一个寄存器所以得到from但"r"是立即所以是type

有关详细信息,请参阅"i"

static inline unsigned long __virt_to_phys(unsigned long x)

{ unsigned long t;

__pv_stub(x, t, "add", __PV_BITS_31_24);

return t;

}将相当于__pv_stub(t = x + __PV_BITS_31_24 == instr,add == from,x == to,t == type)

所以你可能想知道为什么有人会做这么复杂的事情而不只是在代码中编写__PV_BITS_31_24。

原因是我上面提到的pv_table。所有这些陈述的地址都记录在特定的精灵部分。在某些情况下,内核会在运行时修补这些指令(因此需要能够轻松找到所有这些指令),因此需要一个表。

ARM端口就是这样做的:t = x + __PV_BITS_31_24

它仅在使用CONFIG_ARM_PATCH_PHYS_VIRT编译内核时使用:

linux 内核 虚拟地址,linux内核中的虚拟到物理地址转换相关推荐

  1. linux内存重映射的概念及对内核虚拟地址的重映射方法分析

    [摘要]本文分析了Linux设备的内存映射的相关概念和理论,使用例子对mmap及nopage的驱动编写方法进行了解释,最后对3种不同的内核虚拟空间分配方法下,mmap驱动编写方法进行了细致的分析和调试 ...

  2. Linux内存管理Linux Memory Management Notes

    Linux 内存基础 地址类型 linux内核中有许多种不同的地址类型 用户虚拟地址 用户空间看到的常规地址,通过页表可以将虚拟地址和物理地址映射起来 物理地址 用在cpu和内存之间的地址叫做物理地址 ...

  3. 【Linux 内核】Linux 操作系统结构 ( Linux 内核在操作系统中的层级 | Linux 内核子系统及关系 | 进程调度 | 内存管理 | 虚拟文件系统 | 网络管理 | 进程间通信 )

    文章目录 一.Linux 内核在操作系统中的层级 二.Linux 内核子系统 三.Linux 内核子系统之间的关系 一.Linux 内核在操作系统中的层级 Linux 内核 所在层级 : 整个计算机系 ...

  4. linux 神秘的0xC0000000内核逻辑地址内核虚拟地址直接映射高端内存

    0xC0000000个人笔记: 0xC0000000:3GB的起始地址.一个进程分为两个部分:私有和全局.私有部分是指进程自己的代码,而全局部分则是指内核代码.局部是进程私有的,而全局则是所有进程公用 ...

  5. 【Linux 内核】Linux 内核特性 ( 组织形式 | 进程调度 | 内核线程 | 多平台虚拟内存管理 | 虚拟文件系统 | 内核模块机制 | 定制系统调用 | 网络模块架构 )

    文章目录 一.Linux 内核特性 1.Linux 内核组织形式 2.Linux 进程调度 3.Linux 内核线程 4.Linux 内核多平台虚拟内存管理 5.Linux 虚拟文件系统 6.Linu ...

  6. mint linux更新内核,如何在Ubuntu/Linux Mint中安装最新Linux 5.2.5内核

    原标题:如何在Ubuntu/Linux Mint中安装最新Linux 5.2.5内核 Linux 5.2的Ubuntu主线内核包最终可以在32位和64位操作系统中下载和安装. 由于构建失败,Linux ...

  7. Linux内核无法放到Ubuntu中,无法通过Linux内核模块(Ubuntu)在内核内存中写入

    我试图通过内核模块在虚拟机(使用VirtualBox)中覆盖内核内存(Linux 2.6.31,Ubuntu 9.10)中的某些部分. 每当我这样做时,我都会收到此错误 [27154.303726] ...

  8. linux mips 时钟中断,Linux内核中地时钟中断.pdf

    Linux内核中地时钟中断 Linux 内核中的时钟中断 第七章 Linux 内核的时钟中断 (By 詹荣开,NUDT) Copyright © 2003 by 詹荣开 E-mail:zhanrk@ ...

  9. Linux 升级到指定内核(Centos7 yum升级内核、centos系统中kernel-devel)

    文章目录 一.Linux 升级内核 Centos7 yum/rpm升级到最新内核 Centos 7 rpm升级到指定内核 关于Linux依赖包资源下载 二.Linux内核源码的编译及安装 三.设置 g ...

最新文章

  1. Webservices
  2. Angularjs $scope 里面的$apply 方法 和 $watch 方法
  3. 产品研究分析--王者荣耀的那些套路
  4. 四边偏移lisp_双向偏移lisp
  5. 教你如何使用Redis:[7]redis常用命令
  6. sklearn自学指南(part21)--核岭回归
  7. 《Python核心编程》第二版第18页第一章练习 -Python核心编程答案-自己做的-
  8. JS全局函数里面的一些区别
  9. pyTorch api
  10. 信用评分卡模型分析(基于Python)--python实现
  11. c语言实验上机报告,c语言上机实验报告_实验报告.doc
  12. 自己做网站需要掌握哪些知识?
  13. C. Good Subarrays
  14. mysql cbrt函数_PostgreSQL学习笔记5之函数和操作符一
  15. 运动学逆解(四足机器狗)
  16. texlive+texstudio数学建模排版
  17. SpringMVC条件查询+分页时下一页丢失查询条件
  18. 电脑开机就黑屏的几种原因以及解决方案
  19. 购物搜索引擎/比较购物网站
  20. 星际公民服务器位置,《星际公民》3.0测试服务器上线 游戏实际内容展示

热门文章

  1. 华为手机v20计算机有没有历史记录,华为v20和20的区别 华为手机的参数详情
  2. mybatis Invalid bound statement (not found) 解决
  3. 用Python做垃圾分类代码
  4. mac技巧:mac上应用卡住的解决方案
  5. 解决:ipad mini4连接无线密码是对的,结果老是提示密码错误
  6. Py修行路 Pandas 模块基本用法
  7. 我国发明的超级计算机名字是,世界上第一台计算机是国发明的.名字叫.
  8. 【科研论文】审稿人的回复技巧
  9. java 程序生成的文件,中文不显示,显示方框等问题,linux 安装中文字体.
  10. 来说说我手里这款各方面都很稳的荣耀V30 5G旗舰手机