亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
12下一頁(yè)
最近訪問(wèn)板塊 發(fā)新帖
查看: 9044 | 回復(fù): 15
打印 上一主題 下一主題

X86 head_32.S文件中內(nèi)存映射詳解(附圖) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2011-02-20 22:18 |只看該作者 |倒序?yàn)g覽
本帖最后由 cluter 于 2011-02-20 22:29 編輯

Non-PAE模式:

在non-PAE模式下,x86系統(tǒng)采用2-level頁(yè)表。

相關(guān)的宏定義如下:

在Pgtable-2level_types.h文件中
//頁(yè)全局目錄的掩碼
#define PGDIR_SHIFT            22
//頁(yè)全局目錄1024項(xiàng)
#define PTRS_PER_PGD        1024
//頁(yè)表1024項(xiàng)
#define PTRS_PER_PTE        1024

在Page_32_types.h文件中
//定義內(nèi)核大小為512MB---只是限制內(nèi)核最大512MB
#define KERNEL_IMAGE_SIZE        (512 * 1024 * 1024)

代碼分析:

1 相關(guān)的宏定義

//頁(yè)表的大小=頁(yè)數(shù)量 / 每個(gè)頁(yè)表中頁(yè)目錄的個(gè)數(shù)
#define PAGE_TABLE_SIZE(pages) ((pages) / PTRS_PER_PGD)

//映射內(nèi)核線性地址空間需要的內(nèi)存大小
MAPPING_BEYOND_END = \
        PAGE_TABLE_SIZE(((1<<32) - __PAGE_OFFSET) >> PAGE_SHIFT) << PAGE_SHIFT

//內(nèi)核頁(yè)數(shù)量==(內(nèi)核的大小+映射內(nèi)核線性地址空間的頁(yè)表的大小) / 頁(yè)大小
//可以看出這個(gè)是 worst-case 下需要的內(nèi)核頁(yè)數(shù)量
KERNEL_PAGES = (KERNEL_IMAGE_SIZE + MAPPING_BEYOND_END)>>PAGE_SHIFT

//INIT_MAP_SIZE=初始化的時(shí)候必須要映射的內(nèi)存大小,也就是上面kernel_pages的大小
INIT_MAP_SIZE = PAGE_TABLE_SIZE(KERNEL_PAGES) * PAGE_SIZE_asm

//在brk段 預(yù)留名字為pagetables大小為INIT_MAP_SIZE的空間
RESERVE_BRK(pagetables, INIT_MAP_SIZE)

2 頁(yè)表相關(guān)數(shù)據(jù)的內(nèi)存分配

//為頁(yè)全局目錄(pgd)分配1024*4byte的內(nèi)存空間
ENTRY(swapper_pg_dir)
      .fill 1024,4,0


//為固定映射頁(yè)表分配1024*4byte的內(nèi)存空間
swapper_pg_fixmap:
        .fill 1024,4,0
//分配一頁(yè)并初始化為0
ENTRY(empty_zero_page)
        .fill 4096,1,0

3 臨時(shí)頁(yè)表初始化代碼

  //內(nèi)核線性地址開(kāi)始的地方在pgd中的偏移位置
  //__PAGE_OFFSET>>12>>10計(jì)算出在pgd中的頁(yè)目錄項(xiàng)index
  //(__PAGE_OFFSET>>12>>10)<<2計(jì)算出偏移地址(因?yàn)槊總(gè)頁(yè)目錄項(xiàng)4byte)
  page_pde_offset = (__PAGE_OFFSET >> 20);
   
    //把開(kāi)始存放頁(yè)表(page table)的物理地址寫(xiě)入edi
        movl $pa(__brk_base), %edi
    //把頁(yè)全局目錄(pgd)的物理地址寫(xiě)入edx
        movl $pa(swapper_pg_dir), %edx
        //把頁(yè)表項(xiàng)(pte)屬性寫(xiě)入eax
    movl $PTE_IDENT_ATTR, %eax
10:
    //創(chuàng)建一個(gè)頁(yè)表項(xiàng)(地址+屬性)
        leal PDE_IDENT_ATTR(%edi),%ecx                /* Create PDE entry */
        //把頁(yè)表項(xiàng)存入頁(yè)全局目錄(pgd)
    movl %ecx,(%edx)                        /* Store identity PDE entry */
    movl %ecx,page_pde_offset(%edx)                /* Store kernel PDE entry */
        //指向頁(yè)全局目錄的下一項(xiàng)
        addl $4,%edx
        //建立一個(gè)頁(yè)表
        movl $1024, %ecx
11:
    //把eax中的內(nèi)容(頁(yè)地址+頁(yè)屬性)寫(xiě)入edi指向的物理地址,同時(shí)edi+4
        stosl
        addl $0x1000,%eax
        loop 11b
        //必須映射(KERNEL_IMAGE_SIZE+PAGE_TABLE_SIZE)大小的內(nèi)存區(qū)域
        movl $pa(_end) + MAPPING_BEYOND_END + PTE_IDENT_ATTR, %ebp
        cmpl %ebp,%eax
    //如果還沒(méi)有映射到則繼續(xù)
        jb 10b
        //把頁(yè)表結(jié)束的線性地址寫(xiě)入_brk_end變量中--->safe location
        addl $__PAGE_OFFSET, %edi
        movl %edi, pa(_brk_end)
        //把最大映射的頁(yè)框數(shù)量寫(xiě)入max_pfn_mapped變量中
    shrl $12, %eax
        movl %eax, pa(max_pfn_mapped)

        //把pgd中的最后一個(gè)頁(yè)全局目錄項(xiàng)(pgd entry)設(shè)置成固定內(nèi)存映射(fixmap)項(xiàng)
        movl $pa(swapper_pg_fixmap)+PDE_IDENT_ATTR,%eax
        movl %eax,pa(swapper_pg_dir+0xffc)

臨時(shí)內(nèi)核映射.jpg (45.7 KB, 下載次數(shù): 48)

臨時(shí)內(nèi)核映射.jpg

評(píng)分

參與人數(shù) 1可用積分 +24 收起 理由
Godbach + 24 感謝分享

查看全部評(píng)分

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2011-02-20 22:38 |只看該作者
看看

論壇徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16賽季CBA聯(lián)賽之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金雞報(bào)曉
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年紀(jì)念徽章
日期:2016-11-09 13:19:1015-16賽季CBA聯(lián)賽之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-12-03 06:20:002015七夕節(jié)徽章
日期:2015-08-21 11:06:17IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-08-09 06:20:002015亞冠之吉達(dá)阿赫利
日期:2015-07-03 08:39:42
3 [報(bào)告]
發(fā)表于 2011-02-21 08:59 |只看該作者
總結(jié)得很不錯(cuò)哦~ lz發(fā)的都是好帖!

論壇徽章:
36
IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-10 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-16 06:20:0015-16賽季CBA聯(lián)賽之廣東
日期:2016-04-16 19:59:32IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-18 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-19 06:20:00每日論壇發(fā)貼之星
日期:2016-04-19 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-25 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-06 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-08 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-13 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-28 06:20:00每日論壇發(fā)貼之星
日期:2016-05-28 06:20:00
4 [報(bào)告]
發(fā)表于 2011-02-21 09:48 |只看該作者
感謝分享
一路征程一路笑 該用戶已被刪除
5 [報(bào)告]
發(fā)表于 2011-02-21 09:52 |只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2011-02-21 13:20 |只看該作者
支持并感謝樓主分享哈

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2011-02-25 15:05 |只看該作者
本帖最后由 JackyBsh 于 2011-02-25 16:09 編輯

回復(fù) 1# cluter


有不明之處,請(qǐng)教樓主,我參考的內(nèi)核版本是 2.6.35.4:

實(shí)際上,頁(yè)表在段 brk 開(kāi)始的地方,也就是占據(jù)的空間在符號(hào) “_end” 前,根據(jù)下面鏈接腳本 arch/x86/kernel/vmlinux.lds.S 中片段可以確定這點(diǎn)。

------------------------------------------------------------------------
    . = ALIGN(PAGE_SIZE);
    .brk : AT(ADDR(.brk) - LOAD_OFFSET) {
        __brk_base = .;
        . += 64 * 1024;     /* 64k alignment slop space */
        *(.brk_reservation) /* areas brk users have reserved */
        __brk_limit = .;
    }

    _end = .;
-----------------------------------------------------------------------

問(wèn)題是:

1 映射到 “_end” 應(yīng)該就可以了,因?yàn)轫?yè)表應(yīng)該在 __brk_base 和 _end 之間。那為什么還要在 “_end” 后多映射 MAPPING_BEYOND_END 個(gè)字節(jié)。根據(jù)變量 MAPPING_BEYOND_END 的定義,其確實(shí)代表著映射1G內(nèi)核空間需要的頁(yè)表要占用的內(nèi)存大小;蛘呤且?yàn)閾?dān)心 brk 段預(yù)留的空間不足?

2 頁(yè)表是從 __brk_base 開(kāi)始建立的,如果這樣,映射的最終物理地址是否應(yīng)該是 $pa(__brk_base) + MAPPING_BEYOND_END,而不是 $pa(_end) + MAPPING_BEYOND_END 呢?

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2011-02-26 12:12 |只看該作者
回復(fù) 7# JackyBsh


頁(yè)表雖然在 _brk_base 和 _end之間
但是 這個(gè)只是啟動(dòng)時(shí)的頁(yè)表大小---size非常小

RESERVE_BRK(pagetables, INIT_MAP_SIZE)
由代碼可以得出INIT_MAP_SIZE小于MAPPING_BEYOND_END,差不多是MAPPING_BEYOND_END的一半

reserve數(shù)據(jù)段是 給啟動(dòng)時(shí)頁(yè)表映射用的。--->其實(shí)基本上也用不到,因?yàn)楦杏X(jué)前64k基本上夠了。

而 mapping_beyond_end是給 后來(lái)建立內(nèi)存映射頁(yè)表用的。

后來(lái)內(nèi)核要建立物理內(nèi)存直接映射的時(shí)候,這段區(qū)域就不夠用了。所以要從_end開(kāi)始。

在i386上代碼比較清晰,沒(méi)有這么多的reserve段。
現(xiàn)在合并后,確實(shí)有點(diǎn)繁瑣。。。

話說(shuō)我也是拋磚引玉,也有很多地方不是時(shí)分清晰。

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2011-02-26 17:07 |只看該作者
回復(fù) 8# cluter

針對(duì)您的這句解釋?zhuān)骸岸?mapping_beyond_end是給 后來(lái)建立內(nèi)存映射頁(yè)表用的”, 不清楚您所說(shuō)的后來(lái)是否指的是內(nèi)核第二次建立完善的頁(yè)面映射?

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2011-02-26 17:15 |只看該作者
回復(fù) 9# JackyBsh


    是的, 在setup_arch--》Init_memory_mapping函數(shù)中 建立物理內(nèi)存直接映射的頁(yè)表。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專(zhuān)區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP