Linux位址對映 位址轉換 mmap,vma

2021-08-02 05:04:33 字數 3016 閱讀 6949

一,

線性對映與非線性對映

1.記憶體管理

物理記憶體管理:

linux

記憶體最小管理單位為頁(

page

),通常一頁為

4k。初始化時,

linux

會為每個物理記憶體也建立乙個

page

的管理結構,操作物理記憶體時實際上就是操作

page

頁。某些裝置會對映在物理記憶體位址外,這些位址會在使用時建立

page

結構。

程序記憶體管理:

linux

程序通過

vma進行管理,每個程序都有乙個

task_struct

結構體進行維護,其中的

mm_struct

結構體管理這程序的所有記憶體。

mm_struct

中維護者乙個

vma鍊錶,

其中的每乙個

vma節點對應著一段連續的程序記憶體。這裡的連續是指在程序空間中連續,物理空間中不一定連續。如果使用

malloc

等申請一段記憶體,則核心會給程序增加

vma節點。

struct mm_struct

printk(kern_alert」led: led_read ok: off = %d.\n」, off);

return 0; }

static ssize_t led_write(struct file *f, __user char *p, size_t size, loff_t *off)

printk(kern_alert」led: led_ write ok: off = %d.\n」, off);

return 0; }

2.程序空間與實體地址

get_user_pages

該函式完成程序位址到實體地址的轉換,要注意的是程序位址不一定是也對其的,但得到的實體地址是以

page

的形式給出,

4k對齊,使用時要記得新增偏移量。下面是例程,。其中的

current

很有用,用於表示呼叫核心函式的程序,是乙個

task_struct

結構體,其中的

mm為該程序的記憶體管理結構,

mm中的

vmalist

管理者程序

vma鍊錶。

static ssize_t led_read(struct file *f, __user char *p, size_t size, loff_t *off)

memcpy(addr + ((unsigned long)p & 0xfff), dev.mem, 8);

kunmap(pg);

printk(kern_alert」led: led_read ok: off = %d.\n」, off);

return 0; }

remap_pfn_range

mmap

該函式完成實體地址到程序空間的對映,每個程序的位址空間用

vma表示,所以就是把物理位址對映入

vma。這裡對映的實體地址一般都不會是記憶體,只有在

linux

管理之外的

device

空間需要用制定實體地址的方式來進行對映,而一般的記憶體只要用

kmalloc

或malloc

直接申請就可以了。

mmap

是使用者空間需要直接對映實體地址時呼叫的系統呼叫,其內部一般都通過

remap_pfn_range

實現。

程序中呼叫:

caddr_t addr = mmap(null, page_size, prot_write, map_shared, f, paddr & page_mask);

核心中實現:

static int led_mmap(struct file *f, struct vm_area_struct *vma)

return 0; }

使用者呼叫

mmap

後,在進入

led_mmap

之前,就已經為在程序空間申請號了程序位址空間,會存到乙個新的

vma結構體中,如果

mmap

第乙個入參為

null

,則這塊位址空間的起始位址有

linux 

自動分配,長度為第二個引數。

led_mmap

的入參vma

就是之前分配的

vma。

vm_pgoff 

是前面mmap

傳入的paddr

。epld_base_addr

是裝置基址如果為0,則

vm_pgoff

就是實際的實體地址。

3.核心空間與實體地址

kmap

kmap

實現物理記憶體到核心位址空間的對映,物理記憶體位址可以是低端記憶體區,也可以是高階記憶體區,如果是低端,作用與

page_address

相同。

ioremap

ioremap

實現實體地址到核心空間的對映,所謂的實體地址一般是指非物理記憶體的位址空間,也就是不在

linux

管理下的實體地址空間。它可以把這一段對映到核心空間中的非線性空間。

page_address

簡單的位址轉換,只適用於線性區,實現

page

到核心位址空間的轉換。

phy_to_virt

virt_to_page

virt_to_phy

幾個簡單的位址轉化逆函式,只是用於線性區。

部落格:fireaxe.blog.chinaunix.net 

Linux位址對映 3 位址轉換

部落格 fireaxe.blog.chinaunix.net 三 位址轉換 上圖揭示了程序空間 核心空間與實體地址之間的轉換關係。在linux中,實體地址用page結構表示,物理內存在初始化時已經生成了page結構管理,其他位址空間則需要生成page再進行管理 ioremap 實體地址可以被對映到核...

linux位址轉換

三 位址轉換 上圖揭示了程序空間 核心空間與實體地址之間的轉換關係。在linux中,實體地址用page結構 表示,物理內存在初始化時已經生成了page結構管理,其他位址空間則需要生成page再進行管理 ioremap 實體地址可以被對映到核心空間或程序空間,也可以從核心空間或程序使用者空間解除實體地...

linux位址轉換

位址轉換 上圖揭示了程序空間 核心空間與實體地址之間的轉換關係。在linux中,實體地址用page結構 表示,物理內存在初始化時已經生成了page結構管理,其他位址空間則需要生成page再進行管理 ioremap 實體地址可以被對映到核心空間或程序空間,也可以從核心空間或程序使用者空間解除實體地址 ...