- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
为什么在VMALLOC_START~VMALLOC_END发生page fault时do_translation_fault不填充Page table entry而只填充PG, PUD和PMD?
arch/arm/mm/fault.c中对应源码@do_translation_fault:
414 static int __kprobes
415 do_translation_fault(unsigned long addr, unsigned int fsr,
416 struct pt_regs *regs)
417 {
418 unsigned int index;
419 pgd_t *pgd, *pgd_k;
420 pud_t *pud, *pud_k;
421 pmd_t *pmd, *pmd_k;
422
423 if (addr < TASK_SIZE)
424 return do_page_fault(addr, fsr, regs);
425
426 if (user_mode(regs))
427 goto bad_area;
428
429 index = pgd_index(addr);
430
431 /*
432 * FIXME: CP15 C1 is write only on ARMv3 architectures.
433 */
434 pgd = cpu_get_pgd() + index;
435 pgd_k = init_mm.pgd + index;
436
437 if (pgd_none(*pgd_k))
438 goto bad_area;
439 if (!pgd_present(*pgd))
440 set_pgd(pgd, *pgd_k);
441
442 pud = pud_offset(pgd, addr);
443 pud_k = pud_offset(pgd_k, addr);
444
445 if (pud_none(*pud_k))
446 goto bad_area;
447 if (!pud_present(*pud))
448 set_pud(pud, *pud_k);
449
450 pmd = pmd_offset(pud, addr);
451 pmd_k = pmd_offset(pud_k, addr);
452
453 #ifdef CONFIG_ARM_LPAE
454 /*
455 * Only one hardware entry per PMD with LPAE.
456 */
457 index = 0;
458 #else
459 /*
460 * On ARM one Linux PGD entry contains two hardware entries (see page
461 * tables layout in pgtable.h). We normally guarantee that we always
462 * fill both L1 entries. But create_mapping() doesn't follow the rule.
463 * It can create inidividual L1 entries, so here we have to call
464 * pmd_none() check for the entry really corresponded to address, not
465 * for the first of pair.
466 */
467 index = (addr >> SECTION_SHIFT) & 1;
468 #endif
469 if (pmd_none(pmd_k[index]))
470 goto bad_area;
471
472 copy_pmd(pmd, pmd_k);
473 return 0;
474
475 bad_area:
476 do_bad_area(addr, fsr, regs);
477 return 0;
478 }
最佳答案
此范围为内核内存保留,使用 vmalloc
分配。
当 IRQ(软或硬)被禁用时,内核内存可以正常访问,并且无法处理页面错误。vmalloc
函数负责预先创建映射,因此访问不会出错。
如果出现错误,那是因为访问的是未分配(或已释放)的内存,因此无法处理。
关于linux - 为什么不在 ARM Linux Kernel 上为 vmalloc 填写页面错误中的 PTE 条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11068478/
当我们在Linux中使用函数mmap(,,, MAP_ANON | MAP_SHARED);时,那么对于同一区域的碎片化物理内存(已分配),进程之间正在分配虚拟内存页(PTEs) .即这些PTE是从一
当我阅读 Linux 中的 NUMA 文档并通过源代码时,我可以看到它们替换了迁移条目,它是类型为 SWP_MIGRATION_WRITE 或 SWP_MIGRATION_READ,具有正常的PTE。
我知道通常的内存访问将通过页表进行虚拟地址到物理地址的转换。但是pte修改呢?假设操作系统想要修改进程的页表项,它是否也会遍历进程的页表?换句话说,页表中是否有一个条目指向它自己? 最佳答案 这在很大
本文整理了Java中de.schildbach.pte.ZvvProvider类的一些代码示例,展示了ZvvProvider类的具体用法。这些代码示例主要来源于Github/Stackoverflow
众所周知,MMIO 空间被映射(例如通过/dev/mem,通过调用 remap_pfn_range())作为单个 PTE,因此没有结构页面。 在使用 ioremap_wc() 时是否做同样的事情,或者
我遍历任务的 vm_area_struct 区域并尝试获取相应的结构页面 *(页面),但 RAM 中不存在某些页面:pte_present(*pte) 返回 0。我无法理解这种行为,因为我有没有交换区
我正在尝试编写获取页面并在 Linux 内核中将其返回 PTE(页表项)的代码。 函数的原型(prototype)应该是这样的: static pte_t getPteOfPage(struct pa
我搜索了很多资源,但没有发现任何具体的问题: 我知道对于某些 linux 系统,fork()系统调用与写时复制一起工作;即父子共享同一个地址空间,但PTE现在标记为只读 , 稍后在 COW 中使用。当
有人能给我指出内核如何将进程页表映射到内核空间的代码或资源吗? 这在 32 位和 64 位(在 x86 和 x86_64 处理器上)如何工作?内核如何设置通过内核虚拟地址访问进程和内核的页表? 这似乎
为了更容易发现缓冲区溢出,我正在更改我们的自定义内存分配器,以便它分配一个完整的 4KB 页面,而不是仅分配所需的字节数。然后我更改页面保护和大小,这样如果调用者在其分配的内存块之前或之后写入,应用程
我知道 ARM 体系结构通过在页错误处理程序中设置它们来模拟 Linux 的新标志和脏标志,如讨论的那样 here .但最近对于一个小型二进制文件,我观察到其中一个匿名段中的 Linux PTE 被设
是否可以将 PTE 指向不同的物理页面? 假设我目前在某个进程 A 的上下文中处于内核模式,该进程当前将地址 400k 映射到物理页号。 5. 我可以将该地址 (400k) 映射到物理页号吗? 6 ?
我读过 Duartes 的文章:http://duartes.org/gustavo/blog/post/how-the-kernel-manages-your-memory 在描述PTE内容的部分,
根据 pgtable-2-level.h 、ARM Linux有两个版本的PTE; Linux PTE 和 H/W PTE。 Linux PTE 存储在 1024 字节的偏移量以下。 在 handle
对象 WMA(虚拟内存区域:struct vm_area_struct,用于运行内核 Linux)和 PTE(页表条目,用于运行 MMU)之间有什么区别,为什么我们需要 WMA 而没有足够的 PTE?
所以我研究了 Intel 的虚拟化扩展中的 EPT。我知道对于影子页表,VMM 必须对硬件可访问的影子 PT 进行写保护,这样每当 guest 试图写入 PT 时,它就会陷入 VMM。这种基于软件的页
为什么在VMALLOC_START~VMALLOC_END发生page fault时do_translation_fault不填充Page table entry而只填充PG, PUD和PMD? ar
我是一名优秀的程序员,十分优秀!