linux kernel中的virt_to_phys代码解读
假设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代码解读相关推荐
- Linux kernel 中模块化的平台驱动代码介绍
介绍 在linux kernel中通过module_platform_driver来实现模块化平台驱动.大量的设备驱动程序都基于该种方式来实现,使用频次非常的高,在linux kernel 5.4.1 ...
- linux kernel中的栈的介绍
目录 1.linux kernel中的中断irq的栈stack (1).arm32体系的irq的栈 (2).arm64体系的irq的栈 2.linux kernel中的栈stack (1).概念介绍: ...
- linux kernel中的进程栈
1.linux中的user mode的进程栈 在thread_info.h中,设置进程栈的大小为16k #define THREAD_SIZE 16384 #define THREAD_START_S ...
- Linux kernel中常见的宏整理
0x00 宏的基本知识 // object-like #define 宏名 替换列表 换行符 //function-like #define 宏名 ([标识符列表]) 替换列表 换行符 替换列表和标识 ...
- 内存访问顺序 - part2: 屏障及Linux kernel中屏障的使用
文章目录 屏障是什么 Linux Kernel 中的屏障 Linux 屏障 API 一般的屏障 强制性屏障 SMP 条件屏障 隐式屏障 其他屏障 屏障的开销 未来的文章 本文翻译自 Memory ac ...
- Linux Kernel中AEP的现状和发展
阿里 石洋内核月谈Yesterday AEP简介 AEP是Intel推出的一种新型的非易失Optane Memory设备,又被称作Apache Pass,所以一般习惯称作AEP.在这之前也有类似的设备 ...
- linux kernel中local_irq_disable()、local_irq_enable()代码解读
在armv8-arch64架构下,控制cpu是否响应IRQ,FIQ,SERROR,DEBUG中断,是由PSTATUS(daif寄存器)控制的. 在armv8-arch32或armv7架构下,控制cpu ...
- linux kernel中cache代码解读
1. 在kernel中调用__dma_flush_range,底层是如何操作的呢? /* remove any dirty cache lines on the kernel alias */__dm ...
- linux内核 漏洞扫描,Linux kernel中存在15年的漏洞
SCSI 定义了并行I/O 总线和数据协议来连接硬盘驱动.打印机.扫描仪.光驱.测试设备.医疗设备等外部设备到本地计算机.近日,GRIMM在Linux kernel SCSI (Small Compu ...
最新文章
- 【camera】全景驾驶感知网络YOLOP部署与实现(交通目标检测、可驾驶区域分割、车道线检测)
- zabbix3.2.4监控MySQL5.7.16状态
- 回到顶部JavaScript实现
- LeetCode --- Valid Parentheses
- Spring事务—方法调用事务回滚
- MySQL中的执行计划(explain)
- 法语学习笔记--第四课(家庭)
- dom文档对象模型图
- CStatic类简介
- Atitit 记录方法调用参数上下文arguments
- 计算机网络管理员中级试题及解析,计算机网络管理员中级考试题及答案(一)(1)...
- 感知机(Perceptron)-《统计学习方法》例题对偶形式手算全过程
- mysql,sqlserver查询表所有字段名
- 以清净心看世界,以欢喜心过生活,以平常心生情味,以柔软心除挂碍。
- 移植fastboot到2440
- nginx日志统计pv、uv命令
- python执行其它py_如何在一个py程序里执行另一个py程序?
- win7计算机广告更改,Win7电脑如何找到带来弹窗广告的软件【图文教程】
- 论文代码Chrome神器:去谷歌学术搜到文章,代码链接就能自动展示-1
- linux 深入理解I2C内核驱动
热门文章
- 浅谈DCIM平台的6化
- TF版本升级问题:成功解决AttributeError: module tensorflow has no attribute mul
- CV:Visual Studio 2015版本+CUDA8.0+Cudnn8.0+OpenCV 3.1.0版本完美解决的详细攻略
- Interview:算法岗位面试—10.15上午—上海某公司算法岗位(偏图像算法,制造行业)技术面试考点之AI算法与实际场景结合产生商业价值的头脑风暴
- DL之CNN:基于CRNN_OCR算法(keras,CNN+RNN)利用数据集(torch,mdb格式)训练来实现新图片上不定长度字符串进行识别—预测过程
- RL之PG:基于TF利用策略梯度算法玩Cartpole游戏实现智能得高分
- 成功解决TypeError: map() got an unexpected keyword argument 'num_threads'
- TF之VGG系列:利用预先编制好的脚本data_convert .py文件将图片格式转换为tfrecord 格式
- 成功解决打包时不能import自定义的包或库出现运行exe时No module named 缺少包
- OpenGL ES 如何能看到一个物体内部和象3dmax中能只显示网格线