Linux位址對映 3 位址轉換

2021-08-04 12:58:54 字數 2571 閱讀 9636

部落格:fireaxe.blog.chinaunix.net

三、位址轉換

上圖揭示了程序空間、核心空間與實體地址之間的轉換關係。

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

所有轉換中,只有mmap可以在程序中使用,其他都是核心函式。即使使用mmap,其內部也是靠核心中使用remap_pfn_range實現的。所有位址空間轉換都在核心中實現。

1.       程序空間與核心空間

copy_from_user

copy_to_user

這兩個函式不算是單純的位址轉換,他們完成的是程序空間與位址空間的資料拷貝,使用起來非常簡單。

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

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

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

Linux記憶體管理 二 位址對映

基本概念 cpu位數 alu位數 匯流排 可作為位址匯流排或資料匯流排或控制匯流排使用,具體視傳送指令而定 位址匯流排 cpu通過位址匯流排來指定儲存單元 資料匯流排 cpu與記憶體或其他器件之間的資料傳送的通道,位數與cpu位數一樣 cpu定址 cpu發出相應指令到位址匯流排上,尋找主存相應位址 ...

s3c6410位址對映

arm處理器為32bit處理器,內部32bit位址匯流排理論定址空間為4gb,對於6410來說,定址空間的高2gb在內部為保留 reserved 低2gb 0x0 0x7fffffff 可劃分為2部分 主儲存區 main memory area 和外設區 peripheral area 6410核心...

s3c6410位址對映

arm處理器為32bit處理器,內部32bit位址匯流排理論定址空間為4gb,對於6410來說,定址空間的高2gb在內部為保留 reserved 低2gb 0x0 0x7fffffff 可劃分為2部分 主儲存區 main memory area 和外設區 peripheral area boot映象...