这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 有奖活动 » 【分享开发笔记,赚取280元手持便携数字示波器】32位linux内核内存映射89

共1条 1/1 1 跳转至

【分享开发笔记,赚取280元手持便携数字示波器】32位linux内核内存映射896的理解

助工
2026-03-11 11:46:57     打赏

1 前言

linux内存管理是一个很大的节目。要想研究个透亮,不是个容易的事情。

对于很多书上所说,896是直接映射区,可以简单的加减操作就能知道实际物理地址,关于这点下面是几点思考。

而内核开启了mmu,从cpu出去的地址都是虚拟地址,通过mmu映射到不同的物理地址上。

这两点如何统一理解呢?

2 相关理解

virt_to_phys() 和 phys_to_virt()  是两个函数,用于896MB以下低端内存的虚拟地址和物理内存地址之间进行换算。物理地址从0开始计算,内核地址从3g处开始计算。

关于函数的计算公式:va= pa+0xc0000000(pageoffset)。物理地址从0开始。

在许多核心架构里,总线上的ram地址不一定是从0开始的,内核有一个宏用于解决此问题:phys_offset.

内核初始化的时候会创建永久的896空间的页表,在初始化函数里手动计算896空间的页表。计算关系:va=pa-phys_offset+pageoffset。

image.png

此后访问空间速度极快,省去了查表计算的损耗,只需要加减偏移就能得到物理地址。

由于896直接映射是永固内存,所以不会触发fagefault,自然也就不会出现延迟需要休眠等场景。

实现了既要也要的需求:使用了mmu隔离物理内存的需求,分页模式访问物理内存;也实现几乎是直接访问物理内存的畅快。



共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]