MIT 6.828 JOS????????????10. Lab 1 Part 3: The kernel
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MIT 6.828 JOS????????????10. Lab 1 Part 3: The kernel相关的知识,希望对你有一定的参考价值。
?????????
Lab 1 Part 3: The kernel
?????????????????????????????????????????????JOS??????????????????boot loader?????????????????????????????????????????????????????????????????????????????????????????????C???????????????????????????????????????
??????????????????
???????????????boot loader??????boot loader????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????0xf0100000???????????????????????????????????????????????????????????????????????????????????????????????????????????????
??????????????????????????????????????????????????????0xf0100000?????????????????????????????????????????????????????????????????????0xf0100000?????????????????????????????????0xf0100000?????????????????????
?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????????????????????????????0xf0100000???????????????????????????????????????????????????????????????????????????????????????????????????0x00100000??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????lab\kern\entrygdir.c??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????0xf0000000~0xf0400000?????????????????????????????????0x00000000~0x00400000??????????????????????????????????????????0x00000000~0x00400000???????????????????????????????????????0x00000000~0x00400000???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
??????Exercise 7???
????????????Qemu???GDB?????????JOS??????????????????????????????movl %eax, %cr0???????????????????????????????????????0x00100000??????0xf0100000???????????????????????????????????????stepi??????????????????????????????????????????????????????????????????????????????????????????????????????????????????
????????????????????????movl %eax, %cr0????????????????????????????????????????????????????????????????????????????????????????????????????????????entry.S?????????????????????????????????????????????
???????????????
???????????????????????????????????????0x10000C?????????????????????????????????????????????????????????0x10000C????????????????????????????????? ???????????????????????????????????????????????????????????????movl %eax, %cr0?????????????????????????????????????????????0x00100000?????????0xf0100000???????????????????????????
??????
?????????????????????????????????????????????????????????
??????????????????stepi?????????????????????si????????????????????????????????????
??????
????????????????????????????????????????????????????????? ?????????????????????0xf0100000?????????????????????????????????0x00100000?????????
??????
??????????????????????????????entry.S????????????%movl %eax, %cr0?????????????????????????????????????????????????????????make clean????????????%movl %eax, %cr0???????????????????????????????????? ?????????qemu??????????????????????????????0x10000C????????????????????????????????????????????????????????????????????????????????????
??????
???????????????0x10002a??????jmp??????????????????????????????0xf010002C???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????make qemu-gdb?????????????????????????????????
??????
????????????????????????????????????????????????????????????
???????????????????????????(??????)
??? ????????????????????????????????????printf?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
??? Exercise 8???http://www.cnblogs.com/fatsheep9146/p/5066690.html
????????????????????????Exercise 8??????????????????
??? 1. ????????????printf.c???console.c????????????????????????console.c??????????????????????????????????????????????????????printf.c???????????????
??? ?????????Exercise 8???????????????????????????????????????????????????????????????console.c????????????static????????????????????????????????????????????????????????????????????????printf????????????????????????cputchar????????????
??? 2. ????????????console.c??????????????????????????????????????????
1 if (crt_pos >= CRT_SIZE) { 2 int i; 3 memcpy(crt_buf, crt_buf + CRT_COLS, (CRT_SIZE - CRT_COLS) * sizeof(uint16_t)); 4 for (i = CRT_SIZE - CRT_COLS; i < CRT_SIZE; i++) 5 crt_buf[i] = 0x0700 | ??? ???; 6 crt_pos -= CRT_COLS; 7 }
??? ??????????????????????????????????????????
????????? crt_buf:?????????????????????????????????????????????????????????????????????????????????
????????? crt_pos:???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
?????? ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????console.c???????????????????????????????????????????????????????????????80x25???????????????????????????????????????????????????25??????????????????????????????80?????????????????????????????????80x25?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????cga???
????????? ??????console.c?????????????????????cga_putc(int c)????????????????????????????????????c????????????????????????????????????????????????????????????????????????????????????????????????(0?????????1?????????2??????)?????????????????????????????????40????????????????????????cga_putc(0x65)??????????????????0x65??????????????????A????????????2?????????41?????????????????????cga_putc?????????????????????crt_buf???????????????????????????????????????????????????????????????????????????????????????????????????crt_pos????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????crt_pos = 85?????????????????????????????????2?????????1???????????????6?????????5????????????????????????crt_pos???????????????????????????0~(80*25-1)???
????????? ?????????????????????????????????????????????cga_putc??????cga_putc???????????????????????????????????????????????????int c???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
????????? ???crt_pos >= CRT_SIZE?????????CRT_SIZE = 80*25?????????????????????crt_pos???????????????0~(80*25-1)???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????1~79?????????????????????0~78??????????????????79????????????????????????????????????????????????????????????0???????????????????????????????????????int c????????????memcpy???????????????crt_buf???????????????1~79????????????????????????0~78????????????????????????????????????for??????????????????????????????79????????????????????????????????????????????????crt_pos?????????
???3. ??????????????????????????????
int x = 1, y = 3, z = 4; cprintf("x %d, y %x, z %d\n", x, y, z);
???????????????????????????
????????????* ?????????cprintf??????fmt???????????????????????????ap???????????????????????????
????????????* ????????????????????????????????????cons_putc, va_arg??????vcprintf??????????????????cons_putc??????????????????????????????????????????va_arg??????ap???????????????????????????????????????????????????????????????vcprintf???????????????????????????????????????
????????????
????????????cprintf?????????
1 int 2 cprintf(const char *fmt, ...) 3 { 4 va_list ap; 5 int cnt; 6 7 va_start(ap, fmt); 8 cnt = vcprintf(fmt, ap); 9 va_end(ap); 10 11 return cnt; 12 }
????????????????????????????????????fmt????????????????????????????????????????????????????????????????????????????????????????????????"x %d, y %x, z %d\n"???????????????ap???va_list????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????ap???????????????????????????????????????
???????????????????????????cprint????????????vcprintf?????????????????????????????????fmt????????????????????????ap?????????x,y,z??????????????????????????????vcprintf?????????vcprintf?????????\lib\printfmt.c??????vprintfmt??????????????????????????????4???????????????1???????????????????????????????????????????????????????????????printf.c????????????????????????putch????????????????????????????????????????????????????????????????????????????????????0????????????????????????2?????????????????????2???????????????????????????????????????????????????1????????????????????????????????????????????????????????????????????????2?????????????????????????????????????????????????????????1????????????????????????????????????????????????????????????2???????????????????????????????????????????????????????????????2????????????????????????????????????????????????????????????????????????3,4??????????????????????????????cprintf??????????????????
??????????????????vprintfmt???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????fmt??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????4????????????
??????"x %d"??? ", y %x" , ", z %d", "\n"
????????????????????????????????????%???????????????????????????????????????????????????"x %d"???"x "???????????????%???????????????????????????"x %d"?????????????????????????????????10??????????????????????????????????????????%?????????????????????????????????????????????????????????????????????????????????????????????"x %d"?????????????????????????????????????????????
1 case ???d???: 2 num = getint(&ap, lflag); //?????????????????????????????????int?????????long?????????long long??????????????????ap?????????????????????????????? 3 if ((long long) num < 0) { //??????????????????????????????????????????????????? 4 putch(???-???, putdat); 5 num = -(long long) num; 6 } 7 base = 10; 8 goto number;
?????????????????????????????????????????????getint????????????????????????????????????
1 static long long 2 getint(va_list *ap, int lflag) 3 { 4 if (lflag >= 2) 5 return va_arg(*ap, long long); 6 else if (lflag) 7 return va_arg(*ap, long); 8 else 9 return va_arg(*ap, int); 10 }
??????????????????????????????????????????????????????va_arg?????????ap????????????????????????????????????????????????????????????????????????9????????????????????????va_arg?????????????????????????????????ap?????????x???y???z????????????????????????1???3???4???????????????????????????y???z????????????3,4.
????????????vprintfmt?????????num??????????????????????????????1??????????????????????????????????????????????????????????????????????????????????????????putch?????????????????????????????????????????????????????????number??????
??????number????????????????????? printnum(putch, putdat, num, base, width, padc)???????????????????????????????????????????????????????????????????????????????????????1???????????????????????????????????????????????????????????????????????????num = 1?????????????????????????????????base = 10????????????????????????????????????????????????????????????????????????????????????putch????????????????????????????????????????????????putch(padc, putdat);??????????????????????????????????????????????????????????????????????????????
?????????????????????1?????????x=1?????????????????????????????????????????????????????????????????????
??????????????????????????????????????????????????????????????????\lab\kern\monitor.c????????????vim????????????????????????????????????monitor????????????????????????
??????
??????????????????????????????????????????lab??????????????? make qemu ????????????????????????????????????
??????
??????4. ????????????????????????
unsigned int i = 0x00646c72; cprintf("H%x Wo%s", 57616, &i);
?????????????????????????????????????????????????????????????????????
???????????????
?????????????????????????????????????????????????????????????????????????????????????????????moniter.c??????????????????????????????????????????????????????
????????????
??????????????????????????????????????????????????????????????????%x?????????????????????16??????????????????????????????????????????????????????57616???????????????16????????????????????????e110???????????????????????????He110???
??????????????????????????????%s????????????????????????????????????????????????&i????????????i??????????????????????????????????????????i??????????????????????????????
??????????????????cprintf???????????????i???????????????int????????????????????????????????????????????????????????????????????????????????????????????????????????????
??????????????????x86???????????????????????????????????????????????????????????????????????????????????????i??????????????????0x00?????????i???4????????????????????????0x00???0x01???0x02???0x03???????????????????????????????????????0x00?????????0x72(???r???)???0x01?????????0x6c(???l???)???0x02?????????0x64(???d???)???0x03?????????0x00(???\0???).
?????????????????????cprintf?????????i???????????????????????????????????????????????????????????? "World"
??????5. ???????????????????????????y=????????????????????????????????????????????????
cprintf("x=%d y=%d", 3);
???????????????
?????????????????????????????????
????????????
??????????????????y??????????????????????????????????????????????????????????????????
??????
????????????????????????????????????????????????????????????C??????????????????x86?????????????????????????????????????????????????????????????????????kernel monitor??????????????????????????????????????????????????????????????????????????????????????????????????????IP?????????????????????????????????????????????????????????????????????IP??????????????????????????????????????????????????????????????????????????????????????????call?????????
??????Exercise 9???
???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????http://www.cnblogs.com/fatsheep9146/p/5079177.html
??????X86????????????????????????%esp?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????1??????????????????4????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????1??????????????????4?????????32bit????????????????????????????????????????????????32bit?????????????????????%esp??????????????????????????????4????????????
?????????ebp?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????ebp??????????????????????????????????????????????????????ebp??????????????????????????????esp?????????????????????????????????????????????????????????????????????ebp???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????ebp????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
??????Exercise 10???
????????????????????????????????????x86??????C???????????????????????????????????????????????????obj/kern/kern.asm???test_backtrace????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????test_backtrace???????????????????????????????????????????????????????????????????????????????????????
?????????????????????http://www.cnblogs.com/fatsheep9146/p/5079930.html
??????????????????????????????????????????????????????????????????????????????????????????mon_backtrace??????kern/monitor.c???????????????????????????????????????????????????C?????????????????????????????????????????????????????????kernel moniter????????????????????????????????????????????????moniter???????????????????????????
??? ???????????????????????????????????????????????????????????????
??? Stack backtrace:
??? ??????ebp f0109358 eip f0100a62 args 00000001 f0109e80 f0109e98 f0100ed2 00000031
????????? ebp f0109ed8 eip f01000d6 args 00000000 00000000 f0100058 f0109f28 00000061
??? ...
??? ??????????????? "Stack backtrace"?????????????????????????????????mon_backtrace??????????????????????????????????????????mon_backtrace?????????a???????????????????????????????????????a?????????b????????????????????????????????????
??? ??????????????????ebp???????????????????????????????????????????????????ebp???????????????????????????????????????????????????????????????????????????eip?????????????????????????????????????????????????????????????????????args?????????16???????????????????????????????????????????????????????????????????????????????????????????????????????????????
??? Exercise 11???
??? ????????????????????????????????????backtrace????????????
??? ?????????
??? ???????????????????????????????????????????????????????????????????????????????????????????????????ebp????????????????????????????????????????????????????????????????????????????????????eip????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
??? ???????????????????????????????????????????????????????????????????????????????????????
???
?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????ebp???????????????????????????????????????????????????????????????????????????????????????????????????
??????????????????????????????????????????????????????????????????????????????????????????ebp???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
??????????????????????????????????????????ebp+4??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????(ebp+8, ebp+12....)???
??????????????????????????????????????????????????????????????????ebp?????????????????????????????????????????????????????????????????????ebp??????????????????????????????
????????????????????????????????????github???????????????~
??? ?????????????????????????????????backtrace???????????????????????????mon_backtrace()????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
??? ??????????????????????????????????????????????????????????????? debuginfo_eip()?????????????????????????????????symbol table????????????eip???????????????????????????????????????eip???????????????????????????????????????????????????kern/kdebug.c????????????
??????Exercise 12
??????????????????Exercise?????????????????????????????????????????????????????????????????????
??????
????????????
?????????
?????????
以上是关于MIT 6.828 JOS????????????10. Lab 1 Part 3: The kernel的主要内容,如果未能解决你的问题,请参考以下文章
MIT 6.828 JOS学习笔记9. Exercise 1.5
MIT 6.828 JOS学习笔记8. Exercise 1.4
MIT 6.828 JOS学习笔记5. Exercise 1.3
MIT-6.828-JOS-lab5:File system, Spawn and Shell