splitting kernel into sections

git-svn-id: svn://kolibrios.org@851 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Sergey Semyonov (Serge) 2008-08-10 05:23:24 +00:00
parent bdd8453ba4
commit 4637e1f6a3
11 changed files with 293 additions and 245 deletions

Binary file not shown.

View File

@ -0,0 +1,69 @@
format MS COFF
include '../macros.inc'
$Revision: 849 $
__REV__ = __REV
include "../proc32.inc"
include "../kglobals.inc"
include "../lang.inc"
public _enter_bootscreen
public _leave_bootscreen
public _bx_from_load
extrn __setvars
section '.boot' code readable align 16
_enter_bootscreen:
org 0
use16
mov eax, cr0
and eax, not 0x80000001
mov cr0, eax
jmp far 0x1000:start_of_code
version db 'Kolibri OS version 0.7.1.0 ',13,10,13,10,0
include "bootstr.inc" ; language-independent boot messages
include "preboot.inc"
if lang eq en
include "booteng.inc" ; english system boot messages
else if lang eq ru
include "bootru.inc" ; russian system boot messages
include "ru.inc" ; Russian font
else if lang eq et
include "bootet.inc" ; estonian system boot messages
include "et.inc" ; Estonian font
else
include "bootge.inc" ; german system boot messages
end if
include "../data16.inc"
include "bootcode.inc" ; 16 bit system boot code
include "../bus/pci/pci16.inc"
include "../detect/biosdisk.inc"
;include "boot/shutdown.inc" ; shutdown or restart
cli
mov eax, cr0
or eax, 0x80000001
mov cr0, eax
jmp pword 0x08:__setvars
align 4
_leave_bootscreen:

View File

@ -32,9 +32,9 @@ putchar:
print: print:
; in: si->string ; in: si->string
mov al, 186 mov al, 186
call putchar call word putchar
mov al, ' ' mov al, ' '
call putchar call word putchar
printplain: printplain:
; in: si->string ; in: si->string

View File

@ -0,0 +1,135 @@
format MS COFF
include '../macros.inc'
$Revision: 849 $
include "../const.inc"
public __start
extrn _high_code
extrn __os_stack
extrn _boot_mbi
extrn _sys_pdbr
extrn _gdts
extrn __edata
section '.init' code readable align 16
use32
align 4
mboot:
dd 0x1BADB002
dd 0x00010003
dd -(0x1BADB002 + 0x00010003)
dd mboot
dd 0x100000
dd __edata; - OS_BASE
dd LAST_PAGE
dd __start
align 16
__start:
cld
mov esp, __os_stack +(0x100000000-OS_BASE)
push 0
popf
cmp eax, 0x2BADB002
mov ecx, sz_invboot
jne .fault
bt dword [ebx], 3
mov ecx, sz_nomods
jnc .fault
bt dword [ebx], 6
mov ecx, sz_nommap
jnc .fault
mov [_boot_mbi+(0x100000000-OS_BASE)], ebx
xor eax, eax
cpuid
cmp eax, 0
mov ecx, sz_nopse
jbe .fault
mov eax, 1
cpuid
bt edx, 3
mov ecx, sz_nopse
jnc .fault
; ENABLE PAGING
mov ecx, 32
mov edi, _sys_pdbr+(OS_BASE shr 20)+(0x100000000-OS_BASE)
mov eax, PG_LARGE+PG_SW
@@:
stosd
add eax, 4*1024*1024
loop @B
mov dword [_sys_pdbr+(0x100000000-OS_BASE)], PG_LARGE+PG_SW
mov dword [_sys_pdbr+(0x100000000-OS_BASE)+4], PG_LARGE+PG_SW+4*1024*1024
mov dword [_sys_pdbr+(0x100000000-OS_BASE)+(page_tabs shr 20)], _sys_pdbr+PG_SW+(0x100000000-OS_BASE)
mov ebx, cr4
or ebx, CR4_PSE
and ebx, not CR4_PAE
mov cr4, ebx
mov eax, _sys_pdbr+(0x100000000-OS_BASE)
mov ebx, cr0
or ebx,CR0_PG+CR0_WP
mov cr3, eax
mov cr0, ebx
mov ebx, [_boot_mbi+(0x100000000-OS_BASE)]
mov edx, [ebx+20]
mov esi, [ebx+24]
mov ecx, LAST_PAGE
test edx, edx
jz .no_mods
.scan_mod:
mov ecx, [esi+4]
add esi, 16
dec edx
jnz .scan_mod
.no_mods:
add ecx, 4095
and ecx, not 4095
lgdt [_gdts+(0x100000000-OS_BASE)]
jmp pword 0x08:_high_code
.fault:
; push ecx
; call _lcls
; call __bprintf
_hlt:
hlt
jmp _hlt
sz_invboot db 'Invalid multiboot loader magic value',0x0A
db 'Halted',0
sz_nomods db 'No modules loaded',0x0A
db 'Halted',0
sz_nommap db 'No memory table', 0x0A
db 'Halted',0
sz_nopse db 'Page size extensions not supported',0x0A
db 'Halted',0

View File

@ -198,6 +198,7 @@ OS_TEMP equ 0xDFC00000
kernel_tabs equ (page_tabs+ (OS_BASE shr 10)) ;0xFDE00000 kernel_tabs equ (page_tabs+ (OS_BASE shr 10)) ;0xFDE00000
master_tab equ (page_tabs+ (page_tabs shr 10)) ;0xFDFF70000 master_tab equ (page_tabs+ (page_tabs shr 10)) ;0xFDFF70000
BOOT_BASE equ 0x00010000
LOAD_BASE equ 0x00100000 LOAD_BASE equ 0x00100000
OS_BASE equ 0xE0000000 OS_BASE equ 0xE0000000

View File

@ -12,7 +12,7 @@ flm db 0
preboot_lfb db 0 preboot_lfb db 0
preboot_bootlog db 0 preboot_bootlog db 0
boot_drive db 0 boot_drive db 0
bx_from_load: dw 'r1' ; структура для хранения параметров- откуда гашрузились, берется ниже из bx ; {SPraid}[13.03.2007] _bx_from_load: dw 'r1' ; структура для хранения параметров- откуда гашрузились, берется ниже из bx ; {SPraid}[13.03.2007]
; a,b,c,d - גטםקוסעונ<EFBFBD>, r - נאל הטסך ; a,b,c,d - גטםקוסעונ<EFBFBD>, r - נאל הטסך
; # הטסךא... סטלגמכ, א םו באיע. '1', א םו 1 ; # הטסךא... סטלגמכ, א םו באיע. '1', א םו 1

View File

@ -171,10 +171,10 @@ end if
IncludeIGlobals IncludeIGlobals
align 16 align 16
gdts: _gdts:
dw gdte-$-1 dw 0x67; gdte-$-1
dd gdts dd _gdts
dw 0 dw 0
; Attention! Do not change the order of the first four selectors. They are used in Fast System Call ; Attention! Do not change the order of the first four selectors. They are used in Fast System Call

View File

@ -40,7 +40,7 @@ proc Parser_params
locals locals
buff db 4 dup(?) ; for test cd buff db 4 dup(?) ; for test cd
endl endl
mov eax,[bx_from_load+OS_BASE+LOAD_BASE] mov eax,[_bx_from_load+OS_BASE+BOOT_BASE]
mov ecx,sysdir_path mov ecx,sysdir_path
mov [ecx-64],dword 'sys' mov [ecx-64],dword 'sys'
cmp al,'r' ; if ram disk cmp al,'r' ; if ram disk

View File

@ -74,14 +74,14 @@ max_processes equ 255
tss_step equ (128+8192) ; tss & i/o - 65535 ports, * 256=557056*4 tss_step equ (128+8192) ; tss & i/o - 65535 ports, * 256=557056*4
os_stack equ (os_data_l-gdts) ; GDTs os_stack equ (os_data_l-_gdts) ; GDTs
os_code equ (os_code_l-gdts) os_code equ (os_code_l-_gdts)
graph_data equ (3+graph_data_l-gdts) graph_data equ (3+graph_data_l-_gdts)
tss0 equ (tss0_l-gdts) tss0 equ (tss0_l-_gdts)
app_code equ (3+app_code_l-gdts) app_code equ (3+app_code_l-_gdts)
app_data equ (3+app_data_l-gdts) app_data equ (3+app_data_l-_gdts)
pci_code_sel equ (pci_code_32-gdts) pci_code_sel equ (pci_code_32-_gdts)
pci_data_sel equ (pci_data_32-gdts) pci_data_sel equ (pci_data_32-_gdts)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -107,178 +107,29 @@ pci_data_sel equ (pci_data_32-gdts)
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
public __os_stack
public _boot_mbi
public _sys_pdbr
public _gdts
public _high_code
public __setvars
extrn _enter_bootscreen
extrn _leave_bootscreen
extrn _bx_from_load
section '.flat' code readable align 16 section '.flat' code readable align 16
public __start
extrn __edata
use32 use32
org 0x001001E0
org 0xE0102000
align 4 align 4
mboot:
dd 0x1BADB002
dd 0x00010003
dd -(0x1BADB002 + 0x00010003)
dd mboot
dd 0x100000
dd __edata; ;__edata - OS_BASE
dd LAST_PAGE
dd __start
align 16
__start:
cld
mov esp, __os_stack-OS_BASE
push 0
popf
cmp eax, 0x2BADB002
mov ecx, sz_invboot
jne .fault
bt dword [ebx], 3
mov ecx, sz_nomods
jnc .fault
bt dword [ebx], 6
mov ecx, sz_nommap
jnc .fault
mov [_boot_mbi-OS_BASE], ebx
xor eax, eax
cpuid
cmp eax, 0
mov ecx, sz_nopse
jbe .fault
mov eax, 1
cpuid
bt edx, 3
mov ecx, sz_nopse
jnc .fault
; ENABLE PAGING
mov ecx, 32
mov edi, _sys_pdbr+(OS_BASE shr 20)-OS_BASE
mov eax, PG_LARGE+PG_SW
@@:
stosd
add eax, 4*1024*1024
loop @B
mov dword [_sys_pdbr-OS_BASE], PG_LARGE+PG_SW
mov dword [_sys_pdbr-OS_BASE+4], PG_LARGE+PG_SW+4*1024*1024
mov dword [_sys_pdbr-OS_BASE+(page_tabs shr 20)], _sys_pdbr+PG_SW-OS_BASE
mov ebx, cr4
or ebx, CR4_PSE
and ebx, not CR4_PAE
mov cr4, ebx
mov eax, _sys_pdbr-OS_BASE
mov ebx, cr0
or ebx,CR0_PG+CR0_WP
mov cr3, eax
mov cr0, ebx
mov ebx, [_boot_mbi]
mov edx, [ebx+20]
mov esi, [ebx+24]
mov ecx, LAST_PAGE
test edx, edx
jz .no_mods
.scan_mod:
mov ecx, [esi+4]
add esi, 16
dec edx
jnz .scan_mod
.no_mods:
add ecx, 4095
and ecx, not 4095
lgdt [gdts]
jmp pword os_code:high_code
.fault:
; push ecx
; call _lcls
; call __bprintf
_hlt:
hlt
jmp _hlt
sz_invboot db 'Invalid multiboot loader magic value',0x0A
db 'Halted',0
sz_nomods db 'No modules loaded',0x0A
db 'Halted',0
sz_nommap db 'No memory table', 0x0A
db 'Halted',0
sz_nopse db 'Page size extensions not supported',0x0A
db 'Halted',0
org $-0x100000
align 4
_enter_bootscreen:
use16
mov eax, cr0
and eax, not 0x80000001
mov cr0, eax
jmp far 0x1000:start_of_code
version db 'Kolibri OS version 0.7.1.0 ',13,10,13,10,0
include "boot/bootstr.inc" ; language-independent boot messages
include "boot/preboot.inc"
if lang eq en
include "boot/booteng.inc" ; english system boot messages
else if lang eq ru
include "boot/bootru.inc" ; russian system boot messages
include "boot/ru.inc" ; Russian font
else if lang eq et
include "boot/bootet.inc" ; estonian system boot messages
include "boot/et.inc" ; Estonian font
else
include "boot/bootge.inc" ; german system boot messages
end if
include "data16.inc"
include "boot/bootcode.inc" ; 16 bit system boot code
include "bus/pci/pci16.inc"
include "detect/biosdisk.inc"
;include "boot/shutdown.inc" ; shutdown or restart
cli
mov eax, cr0
or eax, 0x80000001
mov cr0, eax
jmp pword os_code:__setvars
org $+0x100000
align 4
_leave_bootscreen:
use32 use32
@ -341,8 +192,6 @@ __DEBUG__ fix 1
__DEBUG_LEVEL__ fix 1 __DEBUG_LEVEL__ fix 1
org OS_BASE+$
MEM_WB equ 6 ;write-back memory MEM_WB equ 6 ;write-back memory
MEM_WC equ 1 ;write combined memory MEM_WC equ 1 ;write combined memory
MEM_UC equ 0 ;uncached memory MEM_UC equ 0 ;uncached memory
@ -453,7 +302,7 @@ proc test_cpu
endp endp
align 4 align 4
high_code: _high_code:
mov ax,os_stack mov ax,os_stack
mov dx,app_data mov dx,app_data
mov ss,ax mov ss,ax
@ -464,10 +313,9 @@ high_code:
mov fs, dx mov fs, dx
mov gs, dx mov gs, dx
push ecx ; push ecx
push ebx ; push ebx
; mov dword [sys_pgdir-OS_BASE+(page_tabs shr 20)], sys_pgdir+PG_SW-OS_BASE
; bt [cpu_caps], CAPS_PGE ; bt [cpu_caps], CAPS_PGE
; jnc @F ; jnc @F
@ -478,10 +326,6 @@ high_code:
; or ebx, CR4_PGE ; or ebx, CR4_PGE
; mov cr4, ebx ; mov cr4, ebx
@@: @@:
; xor eax, eax
; mov dword [sys_pgdir], eax
; mov dword [sys_pgdir+4], eax
; mov eax, cr3 ; mov eax, cr3
; mov cr3, eax ; flush TLB ; mov cr3, eax ; flush TLB
@ -528,13 +372,14 @@ high_code:
call _init_mm call _init_mm
mov [pg_data.pg_mutex], 0 mov [pg_data.pg_mutex], 0
mov esi, 0x100000 mov esi, _enter_bootscreen
mov ecx, (_leave_bootscreen-0x100000)/4 mov ecx, _leave_bootscreen
mov edi, 0x10000 shr ecx, 2
mov edi, BOOT_BASE
cld cld
rep movsd rep movsd
jmp far 0x60:_enter_bootscreen; jmp far 0x60:0x00000;
align 4 align 4
__setvars: __setvars:
@ -589,7 +434,7 @@ __setvars:
mov [dword apm_data_16 + 4], dl mov [dword apm_data_16 + 4], dl
mov dword[apm_entry], ebx mov dword[apm_entry], ebx
mov word [apm_entry + 4], apm_code_32 - gdts mov word [apm_entry + 4], apm_code_32 - _gdts
mov eax, [BOOT_VAR + 0x9044] ; version & flags mov eax, [BOOT_VAR + 0x9044] ; version & flags
mov [apm_vf], eax mov [apm_vf], eax
@ -804,6 +649,8 @@ __setvars:
include 'detect/disks.inc' include 'detect/disks.inc'
;!!!!!!!!!!!!!!!!!!!!!!!!!! ;!!!!!!!!!!!!!!!!!!!!!!!!!!
xchg bx, bx
call Parser_params call Parser_params
; READ RAMDISK IMAGE FROM HD ; READ RAMDISK IMAGE FROM HD

View File

@ -9,7 +9,14 @@ SECTIONS
. = SIZEOF_HEADERS; . = SIZEOF_HEADERS;
. = ALIGN(32); . = ALIGN(32);
.flat . + __image_base__ : .boot . + __image_base__ :
{
*(.boot)
*(.init)
. = ALIGN(4096);
}
.flat :
{ {
*(.flat) *(.flat)
} }

View File

@ -1,48 +1,37 @@
FASM=fasm
FLAGS=-m 65536 CC = gcc
languages=en|ru|ge|et FASM = fasm.exe
drivers_src=sound sis infinity ensoniq ps2mouse uart ati2d vmode
skins_src=default INCLUDE = include
.PHONY: all kernel drivers skins clean CFLAGS = -c -O2 -I $(INCLUDE) -fomit-frame-pointer -fno-builtin-printf -masm=intel
LDFLAGS = -shared -s -Map kernel.map --image-base 0x100000 --file-alignment 32
all: kernel drivers skins
kernel: check_lang KERNEL_SRC:= \
@echo "*** building kernel with language '$(lang)' ..." kernel.asm \
@mkdir -p bin boot/boot.asm \
@echo "lang fix $(lang)" > lang.inc boot/init.asm
@echo "--- building 'bin/kernel.mnt' ..."
@$(FASM) $(FLAGS) kernel.asm bin/kernel.mnt
@rm -f lang.inc KERNEL_OBJS = $(patsubst %.s, bin/%.obj, $(patsubst %.asm, bin/%.obj,\
$(patsubst %.c, bin/%.obj, $(KERNEL_SRC))))
drivers:
@echo "*** building drivers ..."
@mkdir -p bin/drivers all: kernel.gz
@cd drivers; for f in $(drivers_src); do \
echo "--- building 'bin/drivers/$${f}.obj' ..."; \ kernel.gz :kernel.mnt
$(FASM) $(FLAGS) $${f}.asm ../bin/drivers/$${f}.obj; \ 7z a -tgzip kernel.gz kernel.mnt
done
@mv bin/drivers/vmode.obj bin/drivers/vmode.mdr kernel.mnt: $(KERNEL_OBJS) Makefile ld.x
ld $(LDFLAGS) -T ld.x -o $@ $(KERNEL_OBJS)
skins:
@echo "*** building skins ..." bin/%.obj: %.asm
@mkdir -p bin/skins $(FASM) $< $@
@cd skin; for f in $(skins_src); do \
echo "--- building 'bin/skins/$${f}.skn' ..."; \ bin/%.obj : core/%.c
$(FASM) $(FLAGS) $${f}.asm ../bin/skins/$${f}.skn; \ $(CC) $(CFLAGS) -o $@ -c $<
done
all: $(SUBDIRS)
check_lang:
@case "$(lang)" in \ .PHONY: all
$(languages)) \
;; \
*) \
echo "*** error: language is incorrect or not specified"; \
exit 1; \
;; \
esac
clean:
rm -rf bin
rm -f lang.inc