1. 修改build-initrd-img-busybox-dyn.sh把测试程序copy到initrd img里
2. bochs启动到busybox的shell里
3. bochs gui debugger里设breakpoint,查Sysmap可知do_execve的地址. b 0x1166000
4. 在busybox的shell里运行测试程序,当执行到 do_execve(char *filename, char *argv, char *envp, pt_regs)
时会break住,查看%rdi的内容可确定是在执行测试程序.
5. 再设breakpoint,查Sysmap可知vfs_write的地址. b 0x115f130
6. vfs_write(struct file *file, char *buf, size_t count, loff_t *pos)
, 查看%rsi的内容可确定执行到正确的位置.
7. 从%cr3里得到当前的pgd,运行 tools/calc-pgt addr
得到page table的情况,一路查下去pgd->pud->pmd->pte可知当前page table entry还没有,此时仅仅是在进程的process address space里做了标记而已.
8. 继续执行,再次break到vfs_write.同样查看%rsi的内容可确定执行到正确的位置.再查看page table, entry已经有了.
cat /sys/kernel/mm/transparent_hugepage/enabled
always [madvise] never
1. 简单的mmap不会分配大块内存,还是4K,4K的分配的 madvise(addr_aligned, length, MADV_HUGEPAGE)
,kernel此时会分配大块内存(2M)cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
always的情况下,简单的mmap后,如果使用到的内存地址对齐到了2M上,那么kernel就真的分配2M的内存.不需要程序里额外做什么.