提交 ebb400eb 编写于 作者: R rain

0.619s-boot: load 180KB to 0x8000

上级 df0774c3
......@@ -18,3 +18,5 @@
2021-2-23 0.556: 556 lines, 6 files, rain
2021-2-25 0.619: 619 lines, 6 files, rain
<pre>
Cunix kernel
============
# Versions
`0.362s-boot`:
&#9`Boot` read `loader` from `boot-device`, then it jumps to it.
&#9Loader doesn't load anything, it just enable long-mode and paging.
&#9Loader defines temporary page table at `0x70000` (0x0000:0x7000),
&#9it uses `2MB` page to make 0-12 MB memory to `0x0000 - 0xc0000`.
&nbsp;&nbsp;&nbsp;&nbsp;`Boot` read `loader` from `boot-device`, then it jumps to it.
&nbsp;&nbsp;&nbsp;&nbsp;Loader doesn't load anything, it just enable long-mode and paging.
&nbsp;&nbsp;&nbsp;&nbsp;Loader defines temporary page table at `0x70000` (0x0000:0x7000),
&nbsp;&nbsp;&nbsp;&nbsp;it uses `2MB` page to make 0-12 MB memory to `0x0000 - 0xc0000`.
`0.385s-boot`:
&#9rebuild `boot` and `loader`.
&nbsp;&nbsp;&nbsp;&nbsp;rebuild `boot` and `loader`.
`0.391s-boot`:
&#9loader` forgot open A20 line, so `0.385` and `0.362` just can
&#9use 1MB memory like real-mode.
&nbsp;&nbsp;&nbsp;&nbsp;loader` forgot open A20 line, so `0.385` and `0.362` just can
&nbsp;&nbsp;&nbsp;&nbsp;use 1MB memory like real-mode.
`0.432s-boot`:
&#9make directory `include/`, and add segment.inc, but it doesn't work. :-)
&nbsp;&nbsp;&nbsp;&nbsp;make directory `include/`, and add segment.inc, but it doesn't work. :-)
`0.451s-boot`:
&#9`boot` can load 8 sectors (4KB) of loader (not 1 sector).
&nbsp;&nbsp;&nbsp;&nbsp;`boot` can load 8 sectors (4KB) of loader (not 1 sector).
`0.466s-boot`:
&#9rebuild `boot`
&nbsp;&nbsp;&nbsp;&nbsp;rebuild `boot`
`0.487s-boot`:
&#9`loader` let FS can access 4GB memory in real-mode. because
&#9`loader` loaded GDT and load a data-segment to fs, then disable
&#9protect-mode.
&nbsp;&nbsp;&nbsp;&nbsp;`loader` let FS can access 4GB memory in real-mode. because
&nbsp;&nbsp;&nbsp;&nbsp;`loader` loaded GDT and load a data-segment to fs, then disable
&nbsp;&nbsp;&nbsp;&nbsp;protect-mode.
`0.484s-boot`:
&#9let `readdisk.inc` smaller, but we just can use CHS or LBA, not both.
&nbsp;&nbsp;&nbsp;&nbsp;let `readdisk.inc` smaller, but we just can use CHS or LBA, not both.
`0.509s-kernel`:
&#9load kernel to 0x8200-0x9200 for 4KB, kernel.asm display 'K' to screen.
&nbsp;&nbsp;&nbsp;&nbsp;load kernel to 0x8200-0x9200 for 4KB, kernel.asm display 'K' to screen.
`0.556s-int`:
&#9init IDT at 0x0000-0x1000, and set all handler at ignore_int, but it do nothing.
</pre>
&nbsp;&nbsp;&nbsp;&nbsp;init IDT at 0x0000-0x1000, and set all handler at ignore_int, but it do nothing.
`0.619s-boot`:
&nbsp;&nbsp;&nbsp;&nbsp;load 180KB of disk, not 4KB.
......@@ -17,6 +17,8 @@
CYLINDERS_NEED equ 10
org 0x7c00
_start:
......@@ -38,7 +40,7 @@ _start:
mov si, message
call print
call load_loader
call read_it
jmp 0x0000:0x8000
......@@ -67,28 +69,89 @@ print:
ret
load_loader:
mov cl, 0x02
mov bx, 0x8000
read_it:
; segment address of loader+kernel
mov ax, 0x0800
mov es, ax
mov di, diskpanic_message
; cylinder 0
mov ch, 0
; header 0
mov dh, 0
; start sector 2
mov cl, 2
.read_loop:
call read_sector
jc panic
; I know it use to save source-address, but there isn't another
; register free.
; read 9 sectors (1 loader, 8 kernel)
add cl, 0x01
add bx, 0x0200
; error counts
mov si, 0
cmp cl, 0x0a
je .ret
.retry:
mov ah, 0x02
; one sector
mov al, 1
jmp .read_loop
; offset 0x0000
mov bx, 0
.ret:
ret
; boot device
mov dl, [BI_BOOTDEV]
; call -> BIOS
int 0x13
; if error
jnc .cont_read
.error:
add si, 1
; we try it for 5 times
mov di, diskpanic_message
cmp si, 5
jae panic
.reset_disk:
mov ah, 0x00
mov dl, [BI_BOOTDEV]
int 0x13
; and retry
jmp .retry
.cont_read:
; add for 0x0020 (not 0x0200)
mov ax, es
add ax, 0x0020
mov es, ax
; we've been read one sector
add cl, 1
; if read done
SECTORS_1_TRACK equ 18
cmp cl, SECTORS_1_TRACK
jbe .read_loop
.update_track:
mov cl, 1
add dh, 1
HEADS_1_CYLINDER equ 2
cmp dh, HEADS_1_CYLINDER
jb .read_loop
.update_head
mov dh, 0
add ch, 1
cmp ch, CYLINDERS_NEED
jb .read_loop
ret
panic:
mov si, panic_message
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册