something

This commit is contained in:
2025-05-10 15:48:10 +03:00
parent b836a37264
commit d4a14633ce
4 changed files with 89 additions and 90 deletions
+9 -8
View File
@@ -5,15 +5,18 @@ OBJS = bin/boot.o bin/kernel.o bin/idt.o bin/isr.o bin/screen.o \
bin/fat.o bin/task.o bin/switch.o bin/sys_exit.o bin/gdt.o bin/fat.o bin/task.o bin/switch.o bin/sys_exit.o bin/gdt.o
# Define the compiler and assembler # Define the compiler and assembler
#CC = i686-elf-gcc -D__is_katauos
CC = gcc -D__is_katauos CC = gcc -D__is_katauos
AS = nasm AS = nasm
#LD = i686-elf-ld
LD = ld
# Define the compiler flags # Define the compiler flags
CFLAGS = -I./include/ -std=gnu99 -ffreestanding -O0 -Wall -Wextra -m32 -g CFLAGS = -I./include/ -std=gnu99 -ffreestanding -O0 -Wall -Wextra -m32 -fno-pie -fno-common -g
ASFLAGS = -f elf32 ASFLAGS = -f elf32
# Define the linker flags # Define the linker flags
LDFLAGS = -ffreestanding -O0 -nostdlib -m32 -g -lgcc LDFLAGS = -m elf_i386 -L$(shell $(CC) -print-libgcc-file-name | xargs dirname)
LDSCRIPT = link.ld LDSCRIPT = link.ld
# Define the output file # Define the output file
@@ -28,10 +31,9 @@ create-image:
parted boot.iso --script mkpart primary fat32 1MiB 100% parted boot.iso --script mkpart primary fat32 1MiB 100%
sudo losetup /dev/loop0 boot.iso sudo losetup /dev/loop0 boot.iso
sudo losetup /dev/loop1 boot.iso -o 1048576 sudo losetup /dev/loop1 boot.iso -o 1048576
#sudo mkdosfs -F32 -f 2 /dev/loop1
sudo mkfs.vfat -F32 -f 2 /dev/loop1 sudo mkfs.vfat -F32 -f 2 /dev/loop1
sudo mount /dev/loop1 /mnt sudo mount /dev/loop1 /mnt
sudo grub-install --root-directory=/mnt --no-floppy --modules="normal part_msdos ext2 multiboot biosdisk" /dev/loop0 #there was biosdev also sudo grub-install --root-directory=/mnt --no-floppy --modules="normal part_msdos ext2 multiboot biosdisk" /dev/loop0
sudo cp -r grubshit/* /mnt/ sudo cp -r grubshit/* /mnt/
sync sync
sudo umount /mnt sudo umount /mnt
@@ -49,16 +51,15 @@ image:
test: test:
qemu-system-i386 -drive file=boot.iso,media=disk,format=raw -m 4096M -d int qemu-system-i386 -drive file=boot.iso,media=disk,format=raw -m 4096M -d int
#qemu-system-i386 -s -S -kernel myos.bin
debug: debug:
qemu-system-i386 -s -S -kernel myos.bin qemu-system-i386 -s -S -kernel myos.bin -monitor stdio
test-bochs: test-bochs:
bochs -f bochsrc bochs -f bochsrc
$(OUTPUT): $(OBJS) $(OUTPUT): $(OBJS)
$(CC) -T $(LDSCRIPT) -o $@ $(OBJS) $(LDFLAGS) $(LD) -N -T $(LDSCRIPT) -nostdlib -o $@ $(OBJS) $(LDFLAGS)
bin/boot.o: src/boot.asm bin/boot.o: src/boot.asm
$(AS) $(ASFLAGS) $< -o $@ $(AS) $(ASFLAGS) $< -o $@
@@ -126,6 +127,6 @@ bin/gdt.o: src/kernel/gdt.c
clean: clean:
rm -rf bin/ rm -rf bin/
rm -f $(OUTPUT) rm -f $(OUTPUT)
rm boot.iso rm -f boot.iso
.PHONY: all clean .PHONY: all clean
+4 -3
View File
@@ -1,5 +1,6 @@
OUTPUT_FORMAT(elf32-i386) OUTPUT_FORMAT("elf32-i386")
ENTRY(start) OUTPUT_ARCH("i386")
ENTRY(_start)
vaddr = 0xC0000000; /* virtual start address */ vaddr = 0xC0000000; /* virtual start address */
paddr = 0x100000; /* physical address at 1MB */ paddr = 0x100000; /* physical address at 1MB */
@@ -15,7 +16,7 @@ SECTIONS
. += vaddr; . += vaddr;
.text BLOCK(4K) : ALIGN(4K) { .text : AT(ADDR(.text)-vaddr) {
*(.text) *(.text)
} }
_etext = .; _etext = .;
+56 -59
View File
@@ -1,5 +1,10 @@
bits 32 bits 32
%define MULTIBOOT_PAGE_ALIGN 0x00000001
%define MULTIBOOT_MEMORY_INFO 0x00000002
%define MULTIBOOT_HEADER_MAGIC 0x1BADB002
%define MULTIBOOT_HEADER_FLAGS (MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO)
%define CR0_MP 0x00000002 /* bit 01 -> enable monitor coprocessor */ %define CR0_MP 0x00000002 /* bit 01 -> enable monitor coprocessor */
%define CR0_NE 0x00000020 /* bit 05 -> enable native x87 FPU mode */ %define CR0_NE 0x00000020 /* bit 05 -> enable native x87 FPU mode */
%define CR0_WP 0x00010000 /* bit 16 -> enable write protect (for CoW) */ %define CR0_WP 0x00010000 /* bit 16 -> enable write protect (for CoW) */
@@ -9,7 +14,11 @@ bits 32
%define PAGE_OFFSET 0xC0000000 %define PAGE_OFFSET 0xC0000000
%define GDT_BASE (0xFFFFFFFF - (PAGE_OFFSET - 1)) %define GDT_BASE (0xFFFFFFFF - (PAGE_OFFSET - 1))
%define KERNEL_CS 0x8
%define KERNEL_DS 0x10
section .setup section .setup
align 4 align 4
tmp_gdtr: tmp_gdtr:
dw ((3 * 8) - 1) dw ((3 * 8) - 1)
@@ -18,80 +27,72 @@ tmp_gdta:
align 4 align 4
tmp_gdt: tmp_gdt:
; null entry ; NULL DESCRIPTOR
dw 0x0000 dw 0x0000
dw 0x0000 dw 0x0000
dw 0x0000 dw 0x0000
dw 0x0000 dw 0x0000
; /* KERNEL CODE */ ; KERNEL CODE
dw 0xFFFF ; /* segment limit 15-00 */ dw 0xFFFF ; segment limit 15-00
dw 0x0000 ; /* base address 15-00 */ dw 0x0000 ; base address 15-00
db 0x00 ; /* base address 23-16 */ db 0x00 ; base address 23-16
db 0x9A ; /* P=1 DPL=00 S=1 TYPE=1010 (exec/read) */ db 0x9A ; P=1 DPL=00 S=1 TYPE=1010 (exec/read)
db 0xCF ; /* G=1 DB=1 0=0 AVL=0 SEGLIM=1111 */ db 0xCF ; G=1 DB=1 0=0 AVL=0 SEGLIM=1111
db GDT_BASE >> 24 ; /* base address 31-24 */ db (GDT_BASE >> 24) ; base address 31-24 (0x40)
; /* KERNEL DATA */ ; KERNEL DATA
dw 0xFFFF ; /* segment limit 15-00 */ dw 0xFFFF ; segment limit 15-00
dw 0x0000 ; /* base address 15-00 */ dw 0x0000 ; base address 15-00
db 0x00 ; /* base address 23-16 */ db 0x00 ; base address 23-16
db 0x92 ; /* P=1 DPL=00 S=1 TYPE=0010 (read/write) */ db 0x92 ; P=1 DPL=00 S=1 TYPE=0010 (read/write)
db 0xCF ; /* G=1 DB=1 0=0 AVL=0 SEGLIM=1111 */ db 0xCF ; G=1 DB=1 0=0 AVL=0 SEGLIM=1111
db GDT_BASE >> 24 ; /* base address 31-24 */ db (GDT_BASE >> 24) ; base address 31-24 (0x40)
align 4 align 4
multiboot_header: multiboot_header:
dd 0x1BADB002 dd MULTIBOOT_HEADER_MAGIC
dd 0x00 dd MULTIBOOT_HEADER_FLAGS
dd - (0x1BADB002 + 0x00) dd -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
dd 0 ; header_addr
dd 0 ; load_addr
dd 0 ; load_end_addr
dd 0 ; bss_end_addr
dd 0 ; entry_addr
dd 0 ; mode_type
dd 0 ; width
dd 0 ; height
dd 0 ; depth
dd 0 section .text
dd 0 global _start
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
; section .text
global start:function (start.end - start)
extern kmain ; this function is gonna be located in our c code(kernel.c)
extern get_last_boot_addr
extern gdt_init
extern bss_init
extern setup_tmp_pgdir extern setup_tmp_pgdir
extern bss_init
extern gdt_init
extern get_last_boot_addr
extern kmain
align 4 _start:
start:
; mov esp, stack_top
cli cli
; push ebx ; Сохраняем оригинальный ebx (указатель Multiboot) lgdt [tmp_gdtr] ; load GDTR with the temporary GDT
mov cx, KERNEL_DS
;lgdt [gdt]
lgdt [tmp_gdtr]
mov cx, 0x10 ; data segment
mov ds, cx mov ds, cx
mov es, cx mov es, cx
mov fs, cx mov fs, cx
mov gs, cx mov gs, cx
mov ss, cx mov ss, cx
jmp 0x8:.huita ; 0x8 - code segment jmp KERNEL_CS:setup_kernel
.text
align 4 align 4
.huita: global setup_kernel
mov esp, PAGE_OFFSET + 0x10000 ; default stack address setup_kernel:
push 0 mov esp, PAGE_OFFSET + 0x10000 ; default stack address (0xC0000000 + 0x10000)
popf ; reset EFLAGS push 0 ; reset EFLAGS
popf
push ebx ; save Multiboot info structure push ebx ; save Multiboot info structure
push eax ; save Multiboot magic value push eax ; save Multiboot magic value
call setup_tmp_pgdir call setup_tmp_pgdir
mov cr3, eax mov cr3, eax
@@ -101,22 +102,18 @@ align 4
or eax, 0x40000 ; CR0_AM ; enable AM or eax, 0x40000 ; CR0_AM ; enable AM
or eax, 0x10000 ; CR0_WP ; enable WP or eax, 0x10000 ; CR0_WP ; enable WP
or eax, 0x20 ; CR0_NE ; enable NE or eax, 0x20 ; CR0_NE ; enable NE
or eax, 0x2 ; CR0_MP ; enable MP or eax, 0x02 ; CR0_MP ; enable MP
mov cr0, eax mov cr0, eax
call bss_init ; initialize BSS segment call bss_init ; initialize BSS segment
call gdt_init ; setup and load definitive GDT call gdt_init ; setup and load the definitive GDT
call get_last_boot_addr call get_last_boot_addr
pop ecx ; restore Multiboot magic value pop ecx ; restore Multiboot magic value
pop ebx ; restore Multiboot info structure pop ebx ; restore Multiboot info structure
push eax ; save last boot address push eax ; save the last boot address
push ebx ; save Multiboot info structure push ebx ; save Multiboot info structure
push ecx ; save Multiboot magic value push ecx ; save Multiboot magic value
pop ebx ; Восстанавливаем оригинальный ebx
push ebx ; Передаем его в kmain
call kmain call kmain
hlt
.end: jmp $
+3 -3
View File
@@ -149,9 +149,9 @@ static void fmt_put(char** buf, char* end, char c)
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
static void fmt_put_num(long long val, int flags, int width, char** buf, char* end) static void fmt_put_num(long val, int flags, int width, char** buf, char* end)
{ {
unsigned long long uval = (unsigned long long)val; unsigned long uval = (unsigned long)val;
int size = 0; int size = 0;
char tmp[65]; // Binary digits in uint64_t plus sign char tmp[65]; // Binary digits in uint64_t plus sign
@@ -162,7 +162,7 @@ static void fmt_put_num(long long val, int flags, int width, char** buf, char* e
if (!(flags & FMT_UNSIGNED) && val < 0) if (!(flags & FMT_UNSIGNED) && val < 0)
{ {
uval = (unsigned long long)-val; uval = (unsigned long)-val;
if (!(flags & FMT_NO_SIGN)) if (!(flags & FMT_NO_SIGN))
sign = '-'; sign = '-';
} }