info tab:地址映射,映射结果
vaddr:虚拟地址从0x00100000开始
物理地址phy_addr: 0x200000 (2M) 即:低地址下的1M大小与一页4k大小的页目录(1024个页目录项)(一个页目录项占4个字节(即32位),一个地址对应一个字节),页目录项安装位置(0x1 00000),页目录对应的页表项安装位置(0x1 01000),(0x1000=2^12,4k(1k*4个字节)),1k个页目录项对应1k张一级页表,故0x100000~0x101fff为(第0与768)页目录项与其对应的同一页目录(0x101000)下对应的一级页表的总安装容量,
一个页目录对应1k个页表项,而页表项里存储的地址为32位(其中前20位为真实物理地址),对于它的页表索引(虚拟地址中间10位)来说,每次加1,它存储的地址要加上4096,即在初始化1024个页表项过程中,即0x1000;故1k*1k,第0个页目录对应的页表的最后一个页表项为0xff000,
即第0个与第768个页目录安装的页表大小为8k,中间254个(769~1022)页目录项对应的页表项所需要254*4k大小,所以页表总大小为1M,再加上此前的低端1M大小,故0x200000物理地址为虚拟地址0xc0100000所映射的起始地址。
位图安装地址:0xc009a000,预计四页大小,管理512mb,一页位图可管理128MB的内存大小
虚拟地址 K_HEAP_START:0xc0100000
虚拟地址内存池与内存池
extern的作用?(memory.h)
虚拟地址结构含一个位图,安装在内存池位图后面
vaddr_start 虚拟地址
phy_addr_start 真实地址
第八章makefile里犯过的各种小错误
makefile :
没插入头文件<stdio.h>,NULL,报错 ‘NULL’ undeclared
2.个别语句忘记加‘;’
出现字母倒转的情况,如:char,cahr,
函数名重复
使用系统宏时 把__当作_
枚举enum{ a=1,b }中,写作{a=1;b;},此处与struct不同
语句中漏写(),此处十分危险,一、在许多位运算的过程中,如果漏掉个别括号导致运算顺序发生变化,极有可能导致程序编译通过但运算错误带来的严重错误,二、在进行类型转换与位运算复合的语句中,漏掉括号致使类型转换错误或无效,这对程序也是十分危险的。
头文件中没有插入所需类型的头文件报错:lib/string.h:3: error: expected declaration specifiers or ‘...’ before ‘uint8_t’
lib/string.h:3: error: expected declaration specifiers or ‘...’ before ‘uint32_t’
lib/string.h:4: error: expected declaration specifiers or ‘...’ before ‘uint32_t’
lib/string.h:5: error: expected declaration specifiers or ‘...’ before ‘uint32_t’
解决方案:插入相应的头文件
5 error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘strlen’
lib/string.h:8: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘strcmp’
warning: no previous prototype for ‘pte_ptr’
头文件没有写对应的函数声明,如果不是static 修饰符,则需要在头文件里加函数语句
其次:gcc与g++编译器在编译时,处理bool类型会有不同的结果,如果不能识别bool类型也会出现5中的上述问题,则需要更换数据类型。
kernel/init.c:4: warning: missing terminating " character
kernel/init.c:4: error: #include expects "FILENAME" or <FILENAME>
出错原因:两个" "打成" '
记得在obj后加xx.o 所有需要新增的文件其对应依赖的文件也要!!!完整!!!的添加所在路径。