• <ul id="mayc0"></ul>
    <ul id="mayc0"><center id="mayc0"></center></ul>
    <strike id="mayc0"><input id="mayc0"></input></strike>
    <ul id="mayc0"></ul>
  • 始創(chuàng)于2000年 股票代碼:831685
    咨詢熱線:0371-60135900 注冊有禮 登錄
    • 掛牌上市企業(yè)
    • 60秒人工響應
    • 99.99%連通率
    • 7*24h人工
    • 故障100倍補償
    全部產品
    您的位置: 網(wǎng)站首頁 > 幫助中心>文章內容

    深入理解Linux內存映射機制 (1)

    發(fā)布時間:  2012/8/15 18:17:27

    一. 緒 論
    二. X86的硬件尋址方法
    三. 內核對頁表的設置
    四. 實例分析映射機制

    一. 緒 論
    我們經常在程序的反匯編代碼中看到一些類似0x32118965這樣的地址,操作系統(tǒng)中稱為線性地址,或虛擬地址。虛擬地址有什么用?虛擬地址又是如何轉換為物理內存地址的呢?本章將對此作一個簡要闡述。
    1.1 Linux內存尋址概述
    現(xiàn)代意義上的操作系統(tǒng)都處于32位保護模式下。每個進程一般都能尋址4G的物理空間。但是我們的物理內存一般都是幾百M,進程怎么能獲得4G的物理空間呢?這就是使用了虛擬地址的好處,通常我們使用一種叫做虛擬內存的技術來實現(xiàn),因為可以使用硬盤中的一部分來當作內存使用。例外一點現(xiàn)在操作系統(tǒng)都劃分為系統(tǒng)空間和用戶空間,使用虛擬地址可以很好的保護內核空間被用戶空間破壞。
    對于虛擬地址如何轉為物理地址,這個轉換過程有操作系統(tǒng)和CPU共同完成. 操作系統(tǒng)為CPU設置好頁表。CPU通過MMU單元進行地址轉換。
    1.2 瀏覽內核代碼的工具
    現(xiàn)在的內核都很大, 因此我們需要某種工具來閱讀龐大的源代碼體系,現(xiàn)在的內核開發(fā)工具都選用vim ctag cscope瀏覽內核代碼,網(wǎng)上已有現(xiàn)成的makefile文件用來生成ctags/cscope/etags。
    一、用法:
    找一個空目錄,把附件Makefile拷貝進去。然后在該目錄中選擇性地運行如下make命令:
    $ make
    將處理/usr/src/linux下的源文件,在當前目錄生成ctags, cscope
    注:SRCDIR用來指定內核源代碼目錄,如果沒有指定,則缺省為/usr/src/linux/
    1) 只創(chuàng)建ctags
    $ make SRCDIR=/usr/src/linux-2.6.12/ tags
    2) 只創(chuàng)建cscope
    $ make SRCDIR=/usr/src/linux-2.6.12/ cscope
    3) 創(chuàng)建ctags和cscope
    $ make SRCDIR=/usr/src/linux-2.6.12/
    4) 只創(chuàng)建etags
    $ make SRCDIR=/usr/src/linux-2.6.12/ TAGS

    二、處理時包括的內核源文件:
    1) 不包括drivers,sound目錄
    2) 不包括無關的體系結構目錄
    3) fs目錄只包括頂層目錄和ext2,proc目錄

    三、最簡單的ctags命令
    1) 進入
    進入vim后,用
    :tag func_name
    跳到函數(shù)func_name
    2) 看函數(shù)(identifier)
    想進入光標所在的函數(shù),用
    CTRL ]
    3) 回退
    回退用 CTRL T

    1.3 內核版本的選取
    本次論文分析, 我選取的是linux-2.6.10版本的內核。最新的內核代碼為2.6.25。但是現(xiàn)在主流的服務器都使用的是RedHat AS4的機器,它使用2.6.9的內核。我選取2.6.10是因為它很接近2.6.9,現(xiàn)在紅帽企業(yè)Linux 4以Linux2.6.9內核為基礎,是最穩(wěn)定、最強大的商業(yè)產品。在2004年期間,F(xiàn)edora等開源項目為Linux 2.6內核技術的更加成熟提供了一個環(huán)境,這使得紅帽企業(yè) Linux v.4內核可以提供比以前版本更多更好的

    功能和算法,具體包括:
    • 通用的邏輯CPU調度程序:處理多內核和超線程CPU。
    • 基于對象的逆向映射虛擬內存:提高了內存受限系統(tǒng)的性能。
    • 讀復制更新:針對操作系統(tǒng)數(shù)據(jù)結構的SMP算法優(yōu)化。
    • 多I/O調度程序:可根據(jù)應用環(huán)境進行選擇。
    • 增強的SMP和NUMA支持:提高了大型服務器的性能和可擴展性。
    • 網(wǎng)絡中斷緩和(NAPI):提高了大流量網(wǎng)絡的性能。
    Linux 2.6 內核使用了許多技術來改進對大量內存的使用,使得 Linux 比以往任何時候都更適用于企業(yè)。包括反向映射(reverse mapping)、使用更大的內存頁、頁表條目存儲在高端內存中,以及更穩(wěn)定的管理器。因此,我選取linux-2.6.10內核版本作為分析對象。

     

    二. X86的硬件尋址方法
    請參考Intel x86手冊^_^

     

    三. 內核對頁表的設置
    CPU做出映射的前提是操作系統(tǒng)要為其準備好內核頁表,而對于頁表的設置,內核在系統(tǒng)啟動的初期和系統(tǒng)初始化完成后都分別進行了設置。
    3.1 與內存映射相關的幾個宏
    這幾個宏把無符號整數(shù)轉換成對應的類型
    #define __pte(x) ((pte_t) { (x) } )
    #define __pmd(x) ((pmd_t) { (x) } )
    #define __pgd(x) ((pgd_t) { (x) } )
    #define __pgprot(x) ((pgprot_t) { (x) } )

    根據(jù)x把它轉換成對應的無符號整數(shù)
    #define pte_val(x) ((x).pte_low)
    #define pmd_val(x) ((x).pmd)
    #define pgd_val(x) ((x).pgd)
    #define pgprot_val(x) ((x).pgprot)

    把內核空間的線性地址轉換為物理地址
    #define __pa(x) ((unsigned long)(x)-PAGE_OFFSET)

    把物理地址轉化為線性地址
    #define __va(x) ((void *)((unsigned long)(x) PAGE_OFFSET))

    x是頁表項值, 通過pte_pfn得到其對應的物理頁框號, 最后通過pfn_to_page得到對應的物理頁描述符
    #define pte_page(x) pfn_to_page(pte_pfn(x))

    如果對應的表項值為0, 返回1
    #define pte_none(x) (!(x).pte_low)

    x是頁表項值, 右移12位后得到其對應的物理頁框號
    #define pte_pfn(x) ((unsigned long)(((x).pte_low >> PAGE_SHIFT)))
    根據(jù)頁框號和頁表項的屬性值合并成一個頁表項值
    #define pfn_pte(pfn, prot) __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot))

    根據(jù)頁框號和頁表項的屬性值合并成一個中間表項值
    #define pfn_pmd(pfn, prot) __pmd(((pfn) << PAGE_SHIFT) | pgprot_val(prot))

    向一個表項中寫入指定的值
    #define set_pte(pteptr, pteval) (*(pteptr) = pteval)
    #define set_pte_atomic(pteptr, pteval) set_pte(pteptr,pteval)
    #define set_pmd(pmdptr, pmdval) (*(pmdptr) = pmdval)
    #define set_pgd(pgdptr, pgdval) (*(pgdptr) = pgdval)

    根據(jù)線性地址得到高10位值, 也就是在目錄表中的索引
    #define pgd_index(address) (((address)>>PGDIR_SHIFT) & (PTRS_PER_PGD-1))

    根據(jù)頁描述符和屬性得到一個頁表項值
    #define mk_pte(page, pgprot) pfn_pte(page_to_pfn(page), (pgprot))
    3.2內核頁表的初始化
    內核在進入保護模式前, 還沒有啟用分頁功能, 在這之前內核要先建立一個臨時內核

    億恩科技地址(ADD):鄭州市黃河路129號天一大廈608室 郵編(ZIP):450008 傳真(FAX):0371-60123888
       聯(lián)系:億恩小凡
       QQ:89317007
       電話:0371-63322206


    本文出自:億恩科技【www.vbseamall.com】

    服務器租用/服務器托管中國五強!虛擬主機域名注冊頂級提供商!15年品質保障!--億恩科技[ENKJ.COM]

  • 您可能在找
  • 億恩北京公司:
  • 經營性ICP/ISP證:京B2-20150015
  • 億恩鄭州公司:
  • 經營性ICP/ISP/IDC證:豫B1.B2-20060070
  • 億恩南昌公司:
  • 經營性ICP/ISP證:贛B2-20080012
  • 服務器/云主機 24小時售后服務電話:0371-60135900
  • 虛擬主機/智能建站 24小時售后服務電話:0371-60135900
  • 專注服務器托管17年
    掃掃關注-微信公眾號
    0371-60135900
    Copyright© 1999-2019 ENKJ All Rights Reserved 億恩科技 版權所有  地址:鄭州市高新區(qū)翠竹街1號總部企業(yè)基地億恩大廈  法律顧問:河南亞太人律師事務所郝建鋒、杜慧月律師   京公網(wǎng)安備41019702002023號
      1
     
     
     
     

    0371-60135900
    7*24小時客服服務熱線