看看分配内存的地方,在fork->copy_process(),执行”p = (struct task_struct *)get_free_page();”
开启分页后, 页目录地址放在CR3,且高20位有效,所以低12位的偏移空间,即4K(一页内存)用来存放页表项地址,每个页表项4字节,所以能存放1000个页表项地址。 页表项也是高20位有效,低12位偏移空间,即4K(一页内存)用来存放页地址,每个页地址4字节,所以可存放1000个页地址。 =>1000页表项 * 1000 页地址 * 4KB = 4G 内存空间。 如果要完全映射4G的内存空间,那么必须占用的内存就 4K(页目录空间,必须的) + 1000*4K = 4K+4M。 在0.11内核里,只用16M内存空间。所以在页目录里只放了4个页表项地址。那么必须占用的内存为 4K(页目录) + 4*4K = 20KB 而且,内核的 _pg_dir = 0,从物理地址0处的4K存放页目录内容,4K-20K存放页表项内容。
有个地方很奇怪,jpc跑到指令9573处"test dword[ebp+0x0], 0x1", 此时ebp=0x40, ess=0x0, dword[物理地址0x40对应64M开始的内存页目录 就是fork后->copy_mem->copy_page_tables,每次创建个新任务时,在64M*nr的地址上为其分配内存。 当执行完copy_page_tables中的if(1 & *to_dir)后,地址0x1000处的内容有0x07变成了0x27。回去用bochs试了,也这样。下面也有0x67之类的。所以不是JPC的问题。