一,
線性對映與非線性對映
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 實體地址可以被對映到核心空間或程序空間,也可以從核心空間或程序使用者空間解除實體地址 ...