1. 程式人生 > >關於JOS 未對全部內存分頁映射之前 物理地址映射問題的思考

關於JOS 未對全部內存分頁映射之前 物理地址映射問題的思考

directory 重復 為什麽 rec ini tab continue ble 指令



在kern/pmap.c 裏面會又以下這段代碼,要知道boot_alloc只會分配線性地址,真正建立虛擬頁和物理頁映射關系的在後面的page_alloc.

//////////////////////////////////////////////////////////////////////
// create initial page directory.
kern_pgdir = (pde_t *) boot_alloc(PGSIZE);
memset(kern_pgdir, 0, PGSIZE);

這裏有個疑問,memset僅會接受虛擬地址,而這裏boot_alloc分配出的kern_pgdir 是線性地址,這裏還“沒有建立起實際的物理映射”,怎麽就能用memset去把kern_pgdir指向的地址出PGSIZE大小空間的數據所有填充為0.


前面說的話已經又雙引號了,嘿嘿。說明這就是個假象,或者說我理解的不夠透徹. 這裏要感謝Eric eshyong。以及和我一起討論問題的Essential On C & Linux的道友.


上面代碼部分還處於已經開啟分頁可是還沒有建立起全部的分頁映射. 為什麽這樣說,是由於之前JOS的kernel 作者手動靜態的完畢了部分內存的映射,而這部分內存就是物理內存的前4M(0x400000)


在kern/entrypgdir.c 裏面

註意這裏把虛擬地址的 [0,4M) [KERNBASE,KERNBASE + 4M) 兩個區間都映射到同一物理地址區間[0,4M)

所謂的靜態映射

就是手動的...把一個個地址頁面都分配好。例如以下....

技術分享



Revisit the page table setup in kern/entry.S and kern/entrypgdir.c . Immediately after we turn on paging, EIP is still a low number (a little over 1MB). At what point do we transition to running at an EIP above KERNBASE? What
makes it possible for us to continue executing at a low EIP between when we enable paging and when we begin running at an EIP above KERNBASE? Why is this transition necessary?

這裏就相當於要回答這個問題,在剛剛開啟分頁的時候(entry.S 裏面 cr0 的)

	# Turn on paging.
	movl	%cr0, %eax
	orl	$(CR0_PE|CR0_PG|CR0_WP), %eax
	movl	%eax, %cr0

緊接著此時EIP指令寄存器還指向地址的低空間(1M多一點點的地方)

技術分享 不難看出jmp這行代碼使得地址空間起了變化,分頁機制開始作用

技術分享


既然分頁已經開啟了,那麽就應當把高地址的KERNBASE映射到物理地址上,之前事實上就已經做好了,這裏把虛擬地址的 [0,4M) [KERNBASE,KERNBASE + 4M) 兩個區間都映射到同一物理地址區間[0,4M)的目的就在於不要讓指令的尋址受到地址空間變化的影響.

技術分享

(這段代碼我重復給出,比較重要)




回到我們原來的問題

//////////////////////////////////////////////////////////////////////
// create initial page directory.
kern_pgdir = (pde_t *) boot_alloc(PGSIZE);
memset(kern_pgdir, 0, PGSIZE);

這裏有個疑問。memset僅會接受虛擬地址,而這裏boot_alloc分配出的kern_pgdir 是線性地址,這裏還“沒有建立起實際的物理映射”,怎麽就能用memset去把kern_pgdir指向的地址出PGSIZE大小空間的數據所有填充為0.

在這一步的時候。boot_alloc確實是申請出的線性地址,可是註意!這部分地址早就被靜態映射好了。

此時的kern_pgdir 得到的是線性地址,然而它並不須要page_alloc來給它動態的分配實際的內存,由於之前已經分配好了.

memset接受的參數也是線性的(虛擬的)。

技術分享











二零一四年 十月 攝於妙音寺前

技術分享



關於JOS 未對全部內存分頁映射之前 物理地址映射問題的思考