假设VA_BITS = 48 (虚拟地址有效位), 那么kernel space的虚拟地址是:0xffff_0000_0000_0000 - 0xffff_ffff_ffff_ffff, userspace的虚拟地址是 0x0000_0000_0000_0000 - 0x0000_ffff_ffff_ffff

然后我们再看一张kernel space memory layout图 ,这张图说明了:
0xffff_8000_0000_0000 - 0xffff_8008_0000_0000 是个memory使用的,就是有映射SDRM的,也是线性一射
而0xffff_8000_0000_0000向下的kernel space virtual addr是给 kernel image使用的

在kernel中PAGE_OFFSET = 0x8000_0000_0000

#define PAGE_OFFSET      (UL(0xffffffffffffffff) - \(UL(1) << (VA_BITS - 1)) + 1)

当virt_to_phys调用时候,先判断bit47(最高有效位),如果为1,则表示是(memory)DRAM的地址。那么直接使用X[46:0]和PHYS_OFFSET相加即可

#define __virt_to_phys(x) ({                     \phys_addr_t __x = (phys_addr_t)(x);               \__x & BIT(VA_BITS - 1) ? (__x & ~PAGE_OFFSET) + PHYS_OFFSET : \(__x - kimage_voffset); })

PHYS_OFFSET是DRAM的真实物理地址

memstart_addr = round_down(memblock_start_of_DRAM(),ARM64_MEMSTART_ALIGN);

当virt_to_phys调用时候,先判断bit47(最高有效位),如果为0,则表示是kernel image的地址, 那么直接使用X[46:0]和kimage_voffset相减即可

kimage_voffset来自汇编中的__mmap_switched函数

str_l    x21, __fdt_pointer, x5      // Save FDT pointerldr_l    x4, kimage_vaddr        // Save the offset between
sub x4, x4, x24         // the kernel virtual and
str_l   x4, kimage_voffset, x5      // physical mappings

linux kernel中的virt_to_phys代码解读相关推荐

  1. Linux kernel 中模块化的平台驱动代码介绍

    介绍 在linux kernel中通过module_platform_driver来实现模块化平台驱动.大量的设备驱动程序都基于该种方式来实现,使用频次非常的高,在linux kernel 5.4.1 ...

  2. linux kernel中的栈的介绍

    目录 1.linux kernel中的中断irq的栈stack (1).arm32体系的irq的栈 (2).arm64体系的irq的栈 2.linux kernel中的栈stack (1).概念介绍: ...

  3. linux kernel中的进程栈

    1.linux中的user mode的进程栈 在thread_info.h中,设置进程栈的大小为16k #define THREAD_SIZE 16384 #define THREAD_START_S ...

  4. Linux kernel中常见的宏整理

    0x00 宏的基本知识 // object-like #define 宏名 替换列表 换行符 //function-like #define 宏名 ([标识符列表]) 替换列表 换行符 替换列表和标识 ...

  5. 内存访问顺序 - part2: 屏障及Linux kernel中屏障的使用

    文章目录 屏障是什么 Linux Kernel 中的屏障 Linux 屏障 API 一般的屏障 强制性屏障 SMP 条件屏障 隐式屏障 其他屏障 屏障的开销 未来的文章 本文翻译自 Memory ac ...

  6. Linux Kernel中AEP的现状和发展

    阿里 石洋内核月谈Yesterday AEP简介 AEP是Intel推出的一种新型的非易失Optane Memory设备,又被称作Apache Pass,所以一般习惯称作AEP.在这之前也有类似的设备 ...

  7. linux kernel中local_irq_disable()、local_irq_enable()代码解读

    在armv8-arch64架构下,控制cpu是否响应IRQ,FIQ,SERROR,DEBUG中断,是由PSTATUS(daif寄存器)控制的. 在armv8-arch32或armv7架构下,控制cpu ...

  8. linux kernel中cache代码解读

    1. 在kernel中调用__dma_flush_range,底层是如何操作的呢? /* remove any dirty cache lines on the kernel alias */__dm ...

  9. linux内核 漏洞扫描,Linux kernel中存在15年的漏洞

    SCSI 定义了并行I/O 总线和数据协议来连接硬盘驱动.打印机.扫描仪.光驱.测试设备.医疗设备等外部设备到本地计算机.近日,GRIMM在Linux kernel SCSI (Small Compu ...

最新文章

  1. 【camera】全景驾驶感知网络YOLOP部署与实现(交通目标检测、可驾驶区域分割、车道线检测)
  2. zabbix3.2.4监控MySQL5.7.16状态
  3. 回到顶部JavaScript实现
  4. LeetCode --- Valid Parentheses
  5. Spring事务—方法调用事务回滚
  6. MySQL中的执行计划(explain)
  7. 法语学习笔记--第四课(家庭)
  8. dom文档对象模型图
  9. CStatic类简介
  10. Atitit  记录方法调用参数上下文arguments
  11. 计算机网络管理员中级试题及解析,计算机网络管理员中级考试题及答案(一)(1)...
  12. 感知机(Perceptron)-《统计学习方法》例题对偶形式手算全过程
  13. mysql,sqlserver查询表所有字段名
  14. 以清净心看世界,以欢喜心过生活,以平常心生情味,以柔软心除挂碍。
  15. 移植fastboot到2440
  16. nginx日志统计pv、uv命令
  17. python执行其它py_如何在一个py程序里执行另一个py程序?
  18. win7计算机广告更改,Win7电脑如何找到带来弹窗广告的软件【图文教程】
  19. 论文代码Chrome神器:去谷歌学术搜到文章,代码链接就能自动展示-1
  20. linux 深入理解I2C内核驱动

热门文章

  1. 浅谈DCIM平台的6化
  2. TF版本升级问题:成功解决AttributeError: module tensorflow has no attribute mul
  3. CV:Visual Studio 2015版本+CUDA8.0+Cudnn8.0+OpenCV 3.1.0版本完美解决的详细攻略
  4. Interview:算法岗位面试—10.15上午—上海某公司算法岗位(偏图像算法,制造行业)技术面试考点之AI算法与实际场景结合产生商业价值的头脑风暴
  5. DL之CNN:基于CRNN_OCR算法(keras,CNN+RNN)利用数据集(torch,mdb格式)训练来实现新图片上不定长度字符串进行识别—预测过程
  6. RL之PG:基于TF利用策略梯度算法玩Cartpole游戏实现智能得高分
  7. 成功解决TypeError: map() got an unexpected keyword argument 'num_threads'
  8. TF之VGG系列:利用预先编制好的脚本data_convert .py文件将图片格式转换为tfrecord 格式
  9. 成功解决打包时不能import自定义的包或库出现运行exe时No module named 缺少包
  10. OpenGL ES 如何能看到一个物体内部和象3dmax中能只显示网格线