Linux核心Vmalloc地區大小的計算

來源:互聯網
上載者:User

以前自己跟著核心記憶體管理的一些宏定義畫過記憶體分布圖
比如VMALLOC_START, VMALLOC_END, FIXADDR_START等等
一直以為這些值在實際核心中多多少少會有誤差,沒想到前幾天看了一下
居然完全吻合。

來試著計算一下Vmalloc的總大小,為了便於計算我們認為1G的核心空間從0地址開始。
首先我的實體記憶體超過了896M,因此high_memory就是896M
其上是8M的空洞用於捕捉越界的記憶體訪問,於是VMALLOC_START在896M+8M = 904M

下面再來計算VMALLOC_END。
最頂上是一個記憶體空洞,然後是固定映射的地區,這個地區的分布可以參考下面這個枚舉
enum fixed_addresses {
    FIX_HOLE,
    FIX_VDSO,
    FIX_DBGP_BASE,
    FIX_EARLYCON_MEM_BASE,
#ifdef CONFIG_X86_LOCAL_APIC
    FIX_APIC_BASE,    /* local (CPU) APIC) -- required for SMP or not */
#endif
#ifdef CONFIG_X86_IO_APIC
    FIX_IO_APIC_BASE_0,
    FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS-1,
#endif
#ifdef CONFIG_X86_VISWS_APIC
    FIX_CO_CPU,    /* Cobalt timer */
    FIX_CO_APIC,    /* Cobalt APIC Redirection Table */
    FIX_LI_PCIA,    /* Lithium PCI Bridge A */
    FIX_LI_PCIB,    /* Lithium PCI Bridge B */
#endif
#ifdef CONFIG_X86_F00F_BUG
    FIX_F00F_IDT,    /* Virtual mapping for IDT */
#endif
#ifdef CONFIG_X86_CYCLONE_TIMER
    FIX_CYCLONE_TIMER, /*cyclone timer register*/
#endif
    FIX_KMAP_BEGIN,    /* reserved pte's for temporary kernel mappings */
    FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1,
#ifdef CONFIG_PCI_MMCONFIG
    FIX_PCIE_MCFG,
#endif
#ifdef CONFIG_PARAVIRT
    FIX_PARAVIRT_BOOTMAP,
#endif
    __end_of_permanent_fixed_addresses,
    /*
     * 256 temporary boot-time mappings, used by early_ioremap(),
     * before ioremap() is functional.
     *
     * We round it up to the next 256 pages boundary so that we
     * can have a single pgd entry and a single pte table:
     */
#define NR_FIX_BTMAPS        64
#define FIX_BTMAPS_SLOTS    4
    FIX_BTMAP_END = __end_of_permanent_fixed_addresses + 256 -
            (__end_of_permanent_fixed_addresses & 255),
    FIX_BTMAP_BEGIN = FIX_BTMAP_END + NR_FIX_BTMAPS*FIX_BTMAPS_SLOTS - 1,
    FIX_WP_TEST,
#ifdef CONFIG_ACPI
    FIX_ACPI_BEGIN,
    FIX_ACPI_END = FIX_ACPI_BEGIN + FIX_ACPI_PAGES - 1,
#endif
#ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT
    FIX_OHCI1394_BASE,
#endif
    __end_of_fixed_addresses
};
其中每一個枚舉量代表一個或一些頁面,
除了NR_CPUS我們取1之外,其他的全都取最大值也不超過1K個頁面
也就是說固定映射最多不到4M

再下面就是永久映射地區,先看看永久核心映射的起始地址定義
#define PKMAP_BASE ((FIXADDR_BOOT_START - PAGE_SIZE * (LAST_PKMAP + 1)) & PMD_MASK)
也就是說永久核心映射的起始地址是在固定核心映射-4M之下4M對齊的位置,
前面已經看到固定核心映射是小於4M的,因此永久核心映射的起始地址就在1G-8M的位置
在這裡佔用一個PMD,對於x86來說也就是佔用4M的空間

再往下就是VMALLOC區了,看定義
# define VMALLOC_END    (PKMAP_BASE - 2 * PAGE_SIZE)
就是說永久核心映射起始地址再往下2個頁面就是VMALLOC_END了
因此VMALLOC_END = 1G-8M-2*4K

由此可得總的vmalloc空間為
  VMALLOC_END - VMALLOC_START
= 1G-8M-2*4K - 904M
= 1048576k - 8192k - 8k - 925696k
= 114680k

現在看看
cat /proc/meminfo |grep VmallocTotal
是不是114680k?

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.