- 论坛徽章:
- 0
|
回复 accessory
内核页表初始化没看懂,如果要保护内核代码段应该把Read/Write置为0吧?
kgn28 发表于 2010-07-09 10:41 ![]()
很奇怪,代码里似乎不是这样的,函数调用流程如下
- start_kernel() --> setup_arch() --> paging_init() --> pagetable_init() --> kernel_physical_mapping_init()
复制代码
- static void __init kernel_physical_mapping_init(pgd_t *pgd_base)
- {
- unsigned long pfn;
- pgd_t *pgd;
- pmd_t *pmd;
- pte_t *pte;
- int pgd_idx, pmd_idx, pte_ofs;
- pgd_idx = pgd_index(PAGE_OFFSET);
- pgd = pgd_base + pgd_idx;
- pfn = 0;
- for (; pgd_idx < PTRS_PER_PGD; pgd++, pgd_idx++)
- {
- pmd = one_md_table_init(pgd);
- if (pfn >= max_low_pfn)
- continue;
-
- for (pmd_idx = 0; pmd_idx < PTRS_PER_PMD && pfn < max_low_pfn; pmd++, pmd_idx++)
- {
- unsigned int address = pfn * PAGE_SIZE + PAGE_OFFSET;
- /* Map with big pages if possible, otherwise create normal page tables. */
- if (cpu_has_pse)
- {
- unsigned int address2 = (pfn + PTRS_PER_PTE - 1) * PAGE_SIZE + PAGE_OFFSET + PAGE_SIZE-1;
- if (is_kernel_text(address) || is_kernel_text(address2))
- set_pmd(pmd, pfn_pmd(pfn, PAGE_KERNEL_LARGE_EXEC));
- else
- set_pmd(pmd, pfn_pmd(pfn, PAGE_KERNEL_LARGE));
- pfn += PTRS_PER_PTE;
- }
- else
- {
- pte = one_page_table_init(pmd);
- for (pte_ofs = 0; pte_ofs < PTRS_PER_PTE && pfn < max_low_pfn; pte++, pfn++, pte_ofs++)
- {
- if (is_kernel_text(address))
- set_pte(pte, pfn_pte(pfn, PAGE_KERNEL_EXEC));
- else
- set_pte(pte, pfn_pte(pfn, PAGE_KERNEL));
- }
- }
- }
- }
- }
复制代码 注意这一段:
- if (is_kernel_text(address))
- set_pte(pte, pfn_pte(pfn, PAGE_KERNEL_EXEC));
- else
- set_pte(pte, pfn_pte(pfn, PAGE_KERNEL));
- #define PAGE_KERNEL_EXEC __pgprot(__PAGE_KERNEL_EXEC)
- unsigned long long __PAGE_KERNEL_EXEC = _PAGE_KERNEL_EXEC;
- #define _PAGE_KERNEL_EXEC \
- (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED)
复制代码 这里置上了 _PAGE_RW ,说明kernel text也是读写允许的。。。。
哪位能指点下? |
|