用户进程换出页面时,该页面的虚拟地址是在用户空间还是内核空间?

问题描述 投票:0回答:1

我是Linux的初学者,一直对内核空间和用户空间的区别感到困惑。 我目前正在研究内存管理,想知道当换入或换出时,用户进程的页面的虚拟地址属于用户空间还是内核空间

(如在 64 位 Linux 中

用户态虚拟地址范围:0x0000000 000000-0x00007FFFFFFFFFFFFF

内核态虚拟地址范围:0xFFFF8000000000-0xFFFFFFFFFFFFFFFFFFFF)

linux-6.5.1/mm/内存.c

mm_account_fault()
    if (major) {
        struct major_page_fault_hash_entry *temp = NULL;
        unsigned long pfn = virt_to_pfn(address);
        printk("[%lu][i][%lu]", pfn, address);
        perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, 1, regs, address);
    }

linux-6.5.1/mm/swap_state.c

bool add_to_swap(struct folio *folio)
    long pages_number = folio_nr_pages(folio);
    unsigned long start_pfn = folio_pfn(folio);

    for (int i = 0; i < pages_number; i++) {
        struct page *current_page = pfn_to_page(start_pfn + i);
        unsigned long current_virt_addr = (unsigned long)page_to_virt(current_page);
        printk("[%lu][o][%lu]\n",start_pfn + i, current_virt_addr);
    }
linux memory-management process linux-kernel virtual-address-space
1个回答
0
投票

您将在错误时打印用户虚拟地址(及其指向的 PFN),并在

add_to_swap()
上打印内核虚拟地址(及其指向的 PFN)。比较这两件事没有多大意义。

物理内存页在任何时候都可以有任意数量的虚拟地址指向它,无论是在内核空间还是在用户空间。此外,页面可以在物理内存中移动,并且其 PFN 可以随着时间的推移而改变。页面被换出仅意味着其页表项的位将被更新以指示该页面已被交换,以便在下一次缺页时可以正确地换入。现有用户虚拟地址不会发生或可能发生变化。

© www.soinside.com 2019 - 2024. All rights reserved.