1.了解Pintos
①如何下载与安装Pintos.
在threads目录下使用make,就可以将Pintos装好
②如何下载与安装bochs
需要有这些库的支持
sudo yum install gtk2 gtk2-devel
sudo yum install libXt libXt-devel
sudo yum install libXpm libXpm-devel
在make的时候可能会有错误。记得在Mikefile中加上-lpthread.
./configure --with-x --with-x11 --with-term --enable-debugger --enable-gdb-stub
然后在make,make install
③在centos中下载一个桌面.
2.学会GDB调试
①在一个终端中../../utils/pintos --gdb -s -- run mytest ,注意--必须放在run前面
②在另个终端中
../../utils/pintos-gdb kernel.o
target remote localhost:1234
layout regs
set dissassemble-next-line on
③b(break) main 设置断点
④c(continue) 运行到断点处
⑤n在C的情况下向下走一行, ni在汇编的情况下向下走一行
⑥调试用户态程序,需要先将macros进行启动,gdb>source pintosdir/src/misc/gdb-macros,其中pintosdir是pintos的存储的位置.再输入loadusersymbols echo将echo进行反汇编导入到gdb中。
3.loader.S的主要内容
①disk,sector,partition table的区别
disk是硬盘。
sector是扇区。
内核是放在一块硬盘中的第一个扇区的。因此只要找第一个扇区就可以了。
partition table是分区表,相关的partition table中存放着kernel的first sector与sector number
就是内核在硬盘中存放的位置
②查找kernel存在的位置
③读取kernel
④loader.S中的内存分配
00007c00 ~ 00007dff 存放的是loader.S的代码.
0000e000 ~ 0000efff
存放的是Stack for loader; kernel stack and struct thread for initial kernel thread.
0000f000~0000ffff Page directory for startup code. 这里是页目录
00010000--00020000 Page tables for startup code. 这里是页表
00020000~0009ffff 存放的是kernel code,data.
4.start.S的主要内容
①从BIOS中获取memory的大小,并计算出page的个数,存入init_ram_pages
②开启A20,使得我们可以访问1MB以后的内存空间
③建立页目录,与页表。
④将页目录的基地址放入cr3寄存器
⑤禁止中断
⑥从实模式转化到保护模式
⑦跳转到main函数
网友评论