[Preface] A Hope That My Crude Remarks May Draw Forth By Abler People
[前言]拋磚引玉
Exercise7:
- Something needed to know.
- Examine before and after Paging Enable.
- brack at movl %eas,%cr0 to check 0x00100000/0xf0100000
- x/20h 0x100000
0x100000: 0xb002 0x1bad 0x0000 0x0000 0x4ffe 0xe452 0xc766 0x72050
x100010: 0x0004 0x3400 0xb812 0x0000 0x0011 0x220f 0x0fd8 0xc020
0x100020: 0x010d 0x0100 0x0f80 0xc022 - x/20h 0xf0100000
0xf0100000: 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff
0xf0100010: 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff
0xf0100020: 0xffff 0xffff 0xffff 0xffff - si then check again.
- x/20h 0x100000
0x100000: 0xb002 0x1bad 0x0000 0x0000 0x4ffe 0xe452 0xc766 0x7205
0x100010: 0x0004 0x3400 0xb812 0x0000 0x0011 0x220f 0x0fd8 0xc020
0x100020: 0x010d 0x0100 0x0f80 0xc022 - x/20h 0xf0100000
0x100000: 0xb002 0x1bad 0x0000 0x0000 0x4ffe 0xe452 0xc766 0x7205
0x100010: 0x0004 0x3400 0xb812 0x0000 0x0011 0x220f 0x0fd8 0xc020
0x100020: 0x010d 0x0100 0x0f80 0xc022
- x/20h 0x100000
- They are mapped.
- Geuss where would be happaned, if mapping weren't in place by commenting out movl %eas,%cr0.
- mov $relocated, %eax
jmp *%eax #<---Here - Why?
- $relocate is addressed as 0xf0100025(by VMA:0xf0100000), but commenting out the line,enabling protected mode. It resulted in mapping failed.
- No protected mode no mapping from 0xf010000c to 0x10000c(phy address) at view of entry address.
- By the way, above code could be executed because the bootloader directly move/copy/jmp in real address. (know details by the following discussion)
- Discussion:
- How did kernel execute its start address at 0x10000c?
- BIOS read disk's #0 sector(boot sector) and load them into ram:0x7C00 to execute
- bootload read disk's #1 sector and load them into ram:0x100000 to execute
- dd command put kernel into #1 sector.
- bootloader jump to kernel's start entry address by ((void (*)(void)) (ELFHDR->e_entry))();
- After Lesson:
- What did kernel.asm do from 0x100000 to 0x10000c
- .globl entry
- entry:
- movw $0x1234,0x472 # warm boot f0100000: 02 b0 ad 1b 00 00 add 0x1bad(%eax),%dh
- f0100006: 00 00 add %al,(%eax)
- f0100008: fe 4f 52 decb 0x52(%edi) f010000b: e4 66 in $0x66,%al
- f010000c <entry>:
#
Exercise8:
- Something needed to kow
- Trace code to understand the following code's relateionship.
- kern/printf.c
- kernel internal API function
- lib/printfmt.c
- Utility to format output used by Kernel/User mode
- kern/console.c
- Driver
- Accomplish to print "%o" for octal.
- 209 num = getuint(&ap, lflag);
- 210 base = 8;
- 211 goto number;
- Discussion:
- Interface between console.c and printf.c
- Exported by inc/stdio.h
- cputchar by printf.c
- getchar;by readline.c
- iscons ;by readline.c
- Exported by inc/console.h
- cons_init; by init.c
- cons_getc;
- kbd_intr
- serial_intr
- Roll up One Empty line.
- check arguments
- cprintf
- fmt=0xf0101a69 "x:%d,y:%d,z:%d\n"
- ap=0xf010ffe4 ("\001")
- x/4w 0xf010ffe0
0xf010ffe0: 0xf0101a69 0x00000001 0x00000003 0x00000004 - push order: arg4(0x0000004) arg3 arg2 arg1(0xf0101a69)
- pop order is the reverse.
- cons_putc/va_arg/vcprintf
- order: vcprintf->va_arg->cons_putc
- vcprintf:
- fmt=0xf0101a69 "x:%d,y:%d,z:%d\n"
- ap=0xf010ffe4 ("\001"
- va_arg:
- the next stack address to print
- cons_putc:
- the int type variable to be printed on Screen.
- type translation and ASCII table
- Output "He110 World"
- 57616 (Decimal) = E110 (Hex)
- 0x00646c72
- 0x72 :'r'
- 0x6c :'l'
- 0x64 :'d'
- 0x00 :'\0'
- Note: little endian printed.
- cprintf("x=%d y=%d",3)
- y=%d in va_arg, it gets the next stack frame's value.
- reverse order.
- After Lesson:
- Why is printfmt.c located in the separate lib directory?
- GitHub Link
#
No comments:
Post a Comment
歡迎正面積極的討論。