内核用到的内存不只8M。
第一次映射的8M只是为了在MMU enable的前后都能正确的使用物理地址和虚拟地址。 另外,内核并没有把所有的内存都映射到page table里面。page table的确是动态地被修改的来映射更多或更少的内存。(32位)内核初始化的时候只初始化了0xc0000000以上的空间(不包括动态映射的部 分)。这段虚拟地址只会由内核使用(的确,如果内存不多,那么这段地址已经可以把物理内存全部映射了,但这是内核使用的地址空间,用户空间一般的程序不能 使用)。 0xc0000000以下的地址是用户空间可直接使用的虚拟地址空间。这段虚拟地址到物理地址的映射的确是动态进行的,当进程申请跟多内存时,由内核动态地修改进程的page table来映射。 内核的虚拟地址跟用户空间的虚拟地址有可能映射到相同的内存。如果真的要使用,某些内存页面可能被swap出去。
6410的DRAM controller可以挂两个DDR,CS0对应 0x50000000~0x5fffffff的地址空间,CS1对应 0x60000000 ~ 0x6fffffff。也就是两个256M的空间。
在内核初始化的时候,可以看到内核占用的所有内存(code, data, init 总共4M)
第一次映射的8M只是为了在MMU enable的前后都能正确的使用物理地址和虚拟地址。 另外,内核并没有把所有的内存都映射到page table里面。page table的确是动态地被修改的来映射更多或更少的内存。(32位)内核初始化的时候只初始化了0xc0000000以上的空间(不包括动态映射的部 分)。这段虚拟地址只会由内核使用(的确,如果内存不多,那么这段地址已经可以把物理内存全部映射了,但这是内核使用的地址空间,用户空间一般的程序不能 使用)。 0xc0000000以下的地址是用户空间可直接使用的虚拟地址空间。这段虚拟地址到物理地址的映射的确是动态进行的,当进程申请跟多内存时,由内核动态地修改进程的page table来映射。 内核的虚拟地址跟用户空间的虚拟地址有可能映射到相同的内存。如果真的要使用,某些内存页面可能被swap出去。
6410的DRAM controller可以挂两个DDR,CS0对应 0x50000000~0x5fffffff的地址空间,CS1对应 0x60000000 ~ 0x6fffffff。也就是两个256M的空间。
在内核初始化的时候,可以看到内核占用的所有内存(code, data, init 总共4M)
