色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 內(nèi)核邏輯地址和內(nèi)核虛擬地址的區(qū)別

          內(nèi)核邏輯地址和內(nèi)核虛擬地址的區(qū)別

          作者: 時(shí)間:2016-12-01 來(lái)源:網(wǎng)絡(luò) 收藏
          **********************************************************************

          1)凡是通過(guò)MMU頁(yè)表訪問(wèn)的地址都叫虛擬地址,而一旦啟用了MMU,那CPU發(fā)出的所有地址都是虛擬地址

          本文引用地址:http://cafeforensic.com/article/201612/324530.htm

          內(nèi)核用到的地址范圍是3G-4G(不是很精確,與CPU體系有關(guān)吧),這當(dāng)然就稱為內(nèi)核虛擬地址了(這跟用戶態(tài)的0-3G的用戶虛擬地址相對(duì)應(yīng)),在3G-4G這段范圍內(nèi),有段子集3G -3G+main_memory_size,這段主存大小的虛擬地址空間,由于在MMU頁(yè)表映射時(shí)是采用的是平坦的線性映射,在LDD里所以又給她起個(gè)專門稱呼,叫內(nèi)核邏輯地址

          2) 用不同名字分開叫的原因,與所有的名字的作用一樣,是為了方便稱呼,方便描述,因此可以說(shuō),在內(nèi)核代碼里,對(duì)于內(nèi)核邏輯地址,你可以通過(guò)簡(jiǎn)單的偏移(3G)(rwen2012兄所述),獲曉對(duì)應(yīng)的物理地址,而不是內(nèi)核邏輯地址的那部分內(nèi)核虛擬地址,是不能獲曉物理地址的

          ************************************************************************

          就是假設(shè)你的物理主存是256M,總線地址為0-0x10000000(256M),那么虛擬地址就是0xC0000000(3G)-0xD0000000(3G+256M),換句話說(shuō),內(nèi)核邏輯地址0xC0000000對(duì)應(yīng)物理主存地址0,內(nèi)核邏輯地址0xD0000000對(duì)應(yīng)物理地址256M,那么從內(nèi)核邏輯地址,就可以直接減去偏移量PHYS_OFFSET,比如為0xC0000000,就可以得到物理主存地址了,這種映射就叫做平坦的線性映射

          ************************************************************************

          還是不懂啊

          就是假設(shè)你的物理主存是256M,總線地址為0-0x10000000(256M),那么虛擬地址就是0xC0000000(3G)-0xD0000000(3G+256M),換句話說(shuō),內(nèi)核邏輯地址0xC0000000對(duì)應(yīng)物理主存地址0,內(nèi)核邏輯地址0xD0000000對(duì)應(yīng)物理地址256M,那么從內(nèi)核邏輯地址,就可以直接減去偏移量PHYS_OFFSET,比如為0xC0000000,就可以得到物理主存地址了,這種映射就叫做平坦的線性映射

          你的回復(fù)是指把所有的主內(nèi)存都映射到了內(nèi)核空間?那用戶空間不就訪問(wèn)不到主內(nèi)存了你么?我在清華大學(xué)出版的一本書上寫到:

          vmalloc()分配的地址不是內(nèi)核邏輯地址,但是在它緊跟著的例子程序里面又說(shuō) 找到vmalloc()分配的地址對(duì)應(yīng)的內(nèi)核邏輯地址,這是怎么回事啊,他還給出一大段代碼找vmalloc()分配的地址對(duì)應(yīng)的內(nèi)核邏輯地址,既然說(shuō)分配的不是內(nèi)核邏輯地址怎么又會(huì)找它對(duì)應(yīng)的內(nèi)核邏輯地址呢。

          struct page *virt_to_page(void *kaddr),需要的參數(shù)時(shí)內(nèi)核邏輯地址,那么怎么把vmalloc()分配的地址轉(zhuǎn)化為page結(jié)構(gòu)呢

          ***********************************************************************

          主內(nèi)存應(yīng)該是全部映射到內(nèi)核空間了,但是映射了并不代表就使用了,因此用戶空間的內(nèi)存映射也可以映射到相同的物理內(nèi)存空間(不過(guò)即使內(nèi)核使用了所有的物理內(nèi)存,應(yīng)該也可以通過(guò)缺頁(yè)請(qǐng)求技術(shù)獲得內(nèi)存)。內(nèi)核在初始化時(shí)將所有的物理內(nèi)存構(gòu)成了一個(gè)page結(jié)構(gòu)數(shù)組,vmalloc分配的是3g+main_memory_size之上的虛擬空間,因?yàn)樵趦?nèi)核初始化時(shí)并沒有建立這一段虛擬內(nèi)存空間的映射,因此就需要建立相應(yīng)的頁(yè)表映射。用page_address()函數(shù)即可返回頁(yè)的內(nèi)核虛擬地址。

          ************************************************************************

          從0xc0000000到0xffffffff-128M的內(nèi)核空間確實(shí)是映射到0到896M的物理空間上,而且是通過(guò)特殊地初始化頁(yè)表后進(jìn)行的線性映射,但是物理內(nèi)存被映射后不一定被分配,如果沒有被內(nèi)核分配,則可以由用戶進(jìn)程分配,該頁(yè)同時(shí)被內(nèi)核與用戶映射,

          ***********************************************************************

          LDD 15.1.1在介紹內(nèi)核虛擬地址的原話

          “ All logical addresses are kernel virtual addresses, but many kernel virtual addresses are not logical addresses. For example,memoryallocated by vmalloc has a virtual address (but no direct physical mapping).”

          配圖:

          內(nèi)核虛擬地址和內(nèi)核邏輯地址類似,都是把內(nèi)核空間的地址映射到物理地址上,但是,內(nèi)核虛擬地址不具有內(nèi)核邏輯地址的一些特點(diǎn),比如線性、和物理地址一對(duì)一映射的特點(diǎn)。

          所有的邏輯地址都是內(nèi)核虛擬地址,但反之不然。例如, vmalloc 分配的內(nèi)存有虛擬地址(但沒有直接物理映射)。

          在LDD中虛擬地址就是1G的內(nèi)核空間的線性地址,而邏輯地址則是一一映射物理內(nèi)存的那一塊,也叫做直接映射或平坦映射,就是ZONE_DMA+ZONE_NORMAL區(qū)。

          在ULK中,各種地址的由來(lái)主要是從分段和分頁(yè)機(jī)制講起的(不同于LDD是從模塊應(yīng)用的角度來(lái)說(shuō)的),所以分的很清楚。但出場(chǎng)率最高的還是線性地址。

          所以,我以為,(不一定正確,僅參考),管它什么各種地址,只要抓住物理地址以及對(duì)應(yīng)內(nèi)核1G地址的映射范圍和映射方式就行,具體看語(yǔ)境吧。



          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉