Skip to content

Commit aaab409

Browse files
committed
Added SYCALLS
1 parent 5b03939 commit aaab409

File tree

17 files changed

+400
-220
lines changed

17 files changed

+400
-220
lines changed

Makefile

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,18 @@ SRC_BOOTLOADER = src/bootloader
44
SRC_KERNEL = src/kernel
55
SRC_DRIVERS = src/drivers
66
SRC_LIB_DS = src/lib/ds
7+
SRC_LIB_SYSCALL = src/lib/syscall
78
SRC_LIB_UTILS = src/lib/utils
89
SRC_LIB = src/lib
10+
SRC_MEMMGR = src/memmgr
911
SRC_APP = src/app
1012
SRC_REALMODE = src/real_mode
1113

1214
BUILD_BOOTLOADER = build/bootloader
1315
BUILD_KERNEL = build/kernel
1416
BUILD_DRIVERS = build/drivers
1517
BUILD_LIB_DS = build/lib/ds
18+
BUILD_LIB_SYSCALL = build/lib/syscall
1619
BUILD_LIB_UTILS = build/lib/utils
1720
BUILD_LIB = build/lib
1821
BUILD_APP = build/app
@@ -141,7 +144,7 @@ $(bt_stage1): $(SRC_BOOTLOADER)/stage1.asm $(SRC_BOOTLOADER)/constants.asm $(SRC
141144
nasm -o $@ -f bin -i $(SRC_BOOTLOADER)/ -D SECTOR_START_BT_STAGE2=$(SECTOR_START_BT_STAGE2) -D SECTOR_COUNT_BT_STAGE2=$(SECTOR_COUNT_BT_STAGE2) $<
142145
truncate --size=%512 $@
143146

144-
$(bt_stage2): $(SRC_BOOTLOADER)/stage2.asm $(SRC_BOOTLOADER)/stage2.c $(SRC_BOOTLOADER)/io.asm $(SRC_BOOTLOADER)/constants.asm $(SRC_REALMODE)/stub.asm $(BUILD_LIB_UTILS)/libutils_16 $(BUILD_DRIVERS)/display/libtm_bios $(BUILD_DRIVERS)/disk/libdisk_16
147+
$(bt_stage2): $(SRC_BOOTLOADER)/stage2.asm $(SRC_BOOTLOADER)/stage2.c $(SRC_MEMMGR)/tables/gdt.c $(SRC_BOOTLOADER)/io.asm $(SRC_BOOTLOADER)/constants.asm $(SRC_REALMODE)/stub.asm $(BUILD_LIB_UTILS)/libutils_16 $(BUILD_DRIVERS)/display/libtm_bios $(BUILD_DRIVERS)/disk/libdisk_16
145148
mkdir -p $$(dirname $(bt_stage2))
146149
nasm -o $(BUILD_BOOTLOADER)/stage2_asm.o -f elf32 -i $(SRC_BOOTLOADER)/ -i $(SRC_REALMODE)/ $(SRC_BOOTLOADER)/stage2.asm
147150
gcc -m16 -fno-pie -c -Isrc \
@@ -161,9 +164,10 @@ $(BUILD_REALMODE)/static_library: $(SRC_REALMODE)/static_library.asm $(SRC_REALM
161164
nasm -o $@ -f bin -i $(SRC_REALMODE)/ $(SRC_REALMODE)/static_library.asm
162165
truncate --size=%512 $@
163166

164-
$(kernel_core): $(SRC_KERNEL)/core.asm $(SRC_KERNEL)/core.c $(SRC_KERNEL)/essentials.c $(SRC_REALMODE)/stub.asm $(SRC_KERNEL)/interrupts.c $(SRC_KERNEL)/interrupts.asm $(SRC_LIB_UTILS)/output.h $(SRC_DRIVERS)/keyboard/keyboard.h $(BUILD_LIB_UTILS)/libutils $(BUILD_DRIVERS)/keyboard/libkeyboard $(BUILD_DRIVERS)/display/libtm_vga $(BUILD_DRIVERS)/disk/libdisk # And other output.h dependecies -_-
167+
$(kernel_core): $(SRC_KERNEL)/core.asm $(SRC_KERNEL)/core.c $(SRC_KERNEL)/essentials.c $(SRC_KERNEL)/interrupts.c $(SRC_KERNEL)/process.asm $(SRC_KERNEL)/syscall.c $(SRC_MEMMGR)/tables/gdt.c $(SRC_REALMODE)/stub.asm $(SRC_KERNEL)/interrupts.c $(SRC_KERNEL)/interrupts.asm $(SRC_LIB_UTILS)/output.h $(SRC_DRIVERS)/keyboard/keyboard.h $(BUILD_LIB_UTILS)/libutils $(BUILD_DRIVERS)/keyboard/libkeyboard $(BUILD_DRIVERS)/display/libtm_vga $(BUILD_DRIVERS)/disk/libdisk $(BUILD_LIB_SYSCALL)/libsyscall # And other output.h dependecies -_-
165168
mkdir -p $$(dirname $(kernel_core))
166169
nasm -o $(BUILD_KERNEL)/core_asm.o -f elf32 -i $(SRC_REALMODE)/ $(SRC_KERNEL)/core.asm
170+
nasm -o $(BUILD_KERNEL)/process_asm.o -f elf32 -i $(SRC_REALMODE)/ $(SRC_KERNEL)/process.asm
167171
nasm -o $(BUILD_KERNEL)/interrupts_asm.o -f elf32 $(SRC_KERNEL)/interrupts.asm
168172
gcc -m32 -fno-pie -c -Isrc \
169173
-D SECTOR_START_APP_TTT=$(SECTOR_START_APP_TTT) \
@@ -173,7 +177,7 @@ $(kernel_core): $(SRC_KERNEL)/core.asm $(SRC_KERNEL)/core.c $(SRC_KERNEL)/essent
173177
-D SECTOR_START_APP_CALC=$(SECTOR_START_APP_CALC) \
174178
-D SECTOR_COUNT_APP_CALC=$(SECTOR_COUNT_APP_CALC) \
175179
-o $(BUILD_KERNEL)/core_c.o $(SRC_KERNEL)/core.c
176-
ld --oformat binary -m elf_i386 --trace -Ttext 0x0000 --strip-all -o $(kernel_core) $(BUILD_KERNEL)/core_asm.o $(BUILD_KERNEL)/core_c.o $(BUILD_KERNEL)/interrupts_asm.o $(BUILD_DRIVERS)/keyboard/libkeyboard $(BUILD_LIB_UTILS)/libutils $(BUILD_DRIVERS)/display/libtm_vga $(BUILD_LIB_DS)/libds $(BUILD_DRIVERS)/disk/libdisk
180+
ld --oformat binary -m elf_i386 --trace -Ttext 0x0000 --strip-all -o $(kernel_core) $(BUILD_KERNEL)/core_asm.o $(BUILD_KERNEL)/process_asm.o $(BUILD_KERNEL)/core_c.o $(BUILD_KERNEL)/interrupts_asm.o $(BUILD_DRIVERS)/keyboard/libkeyboard $(BUILD_LIB_UTILS)/libutils $(BUILD_DRIVERS)/display/libtm_vga $(BUILD_LIB_DS)/libds $(BUILD_DRIVERS)/disk/libdisk $(BUILD_LIB_SYSCALL)/libsyscall
177181
truncate --size=%512 $(kernel_core)
178182

179183
# Libraries
@@ -234,29 +238,33 @@ $(BUILD_LIB_UTILS)/libutils: $(SRC_LIB_UTILS)/basic.c $(SRC_LIB_UTILS)/basic.asm
234238
gcc -m32 -fno-pie -c -Isrc -o $(BUILD_LIB_UTILS)/logging.o $(SRC_LIB_UTILS)/logging.c
235239
gcc -m32 -fno-pie -c -Isrc -o $(BUILD_LIB_UTILS)/output.o $(SRC_LIB_UTILS)/output.c
236240
gcc -m32 -fno-pie -c -Isrc -o $(BUILD_LIB_UTILS)/input.o $(SRC_LIB_UTILS)/input.c
237-
nasm -o $(BUILD_LIB_UTILS)/input_asm.o -f elf32 $(SRC_LIB_UTILS)/input.asm
238241
gcc -m32 -fno-pie -c -Isrc -o $(BUILD_LIB_UTILS)/string.o $(SRC_LIB_UTILS)/string.c
239242
gcc -m32 -fno-pie -c -Isrc -o $(BUILD_LIB_UTILS)/color.o $(SRC_LIB_UTILS)/color.c
240243
gcc -m32 -fno-pie -c -D__SOURCE_SNAPSHOT__=$(SOURCE_SNAPSHOT) -Isrc -o $(BUILD_LIB_UTILS)/panic_c.o $(SRC_LIB_UTILS)/panic.c
241244
nasm -o $(BUILD_LIB_UTILS)/panic_asm.o -f elf32 $(SRC_LIB_UTILS)/panic.asm
242245
gcc -m32 -fno-pie -c -Isrc -o $(BUILD_LIB_UTILS)/time_c.o $(SRC_LIB_UTILS)/time.c
243246
nasm -o $(BUILD_LIB_UTILS)/time_asm.o -f elf32 $(SRC_LIB_UTILS)/time.asm
244-
ar rc $@ $(BUILD_LIB_UTILS)/basic_asm.o $(BUILD_LIB_UTILS)/basic_c.o $(BUILD_LIB_UTILS)/logging.o $(BUILD_LIB_UTILS)/output.o $(BUILD_LIB_UTILS)/input_asm.o $(BUILD_LIB_UTILS)/input.o $(BUILD_LIB_UTILS)/string.o $(BUILD_LIB_UTILS)/color.o $(BUILD_LIB_UTILS)/panic_c.o $(BUILD_LIB_UTILS)/panic_asm.o $(BUILD_LIB_UTILS)/time_c.o $(BUILD_LIB_UTILS)/time_asm.o
247+
ar rc $@ $(BUILD_LIB_UTILS)/basic_asm.o $(BUILD_LIB_UTILS)/basic_c.o $(BUILD_LIB_UTILS)/logging.o $(BUILD_LIB_UTILS)/output.o $(BUILD_LIB_UTILS)/input.o $(BUILD_LIB_UTILS)/string.o $(BUILD_LIB_UTILS)/color.o $(BUILD_LIB_UTILS)/panic_c.o $(BUILD_LIB_UTILS)/panic_asm.o $(BUILD_LIB_UTILS)/time_c.o $(BUILD_LIB_UTILS)/time_asm.o
245248

246249
$(BUILD_LIB_DS)/libds: $(SRC_LIB_DS)/queue.h $(SRC_LIB_DS)/queue.c
247250
mkdir -p $(BUILD_LIB_DS)/
248251
gcc -m32 -fno-pie -c -Isrc -o $(BUILD_LIB_DS)/queue.o $(SRC_LIB_DS)/queue.c
249252
ar rc $@ $(BUILD_LIB_DS)/queue.o
250253

254+
$(BUILD_LIB_SYSCALL)/libsyscall: $(SRC_LIB_SYSCALL)/syscall.h $(SRC_LIB_SYSCALL)/syscall.asm
255+
mkdir -p $(BUILD_LIB_SYSCALL)/
256+
nasm -o $(BUILD_LIB_SYSCALL)/syscall_asm.o -f elf32 $(SRC_LIB_SYSCALL)/syscall.asm
257+
ar rc $@ $(BUILD_LIB_SYSCALL)/syscall_asm.o
258+
251259
# User Applications
252-
$(app_calc): $(app_entry) $(SRC_APP)/calc.c $(SRC_LIB_UTILS)/output.h $(SRC_LIB_UTILS)/time.h $(BUILD_LIB_UTILS)/libutils $(BUILD_DRIVERS)/display/libtm_vga # And dependecies :/
260+
$(app_calc): $(app_entry) $(SRC_APP)/calc.c $(SRC_LIB_UTILS)/output.h $(SRC_LIB_UTILS)/time.h $(BUILD_LIB_UTILS)/libutils $(BUILD_DRIVERS)/display/libtm_vga $(BUILD_LIB_SYSCALL)/libsyscall # And dependecies :/
253261
mkdir -p $$(dirname $(app_calc))
254262
gcc -m32 -fno-pie -c -Isrc -o $(BUILD_APP)/calc.o $(SRC_APP)/calc.c
255-
ld --oformat binary -m elf_i386 -Ttext 0x0 --strip-all -o $@ $(app_entry) $(BUILD_APP)/calc.o $(BUILD_LIB_UTILS)/libutils $(BUILD_DRIVERS)/display/libtm_vga
263+
ld --oformat binary -m elf_i386 -Ttext 0x0 --strip-all -o $@ $(app_entry) $(BUILD_APP)/calc.o $(BUILD_LIB_UTILS)/libutils $(BUILD_DRIVERS)/display/libtm_vga $(BUILD_LIB_SYSCALL)/libsyscall
256264
truncate --size=%512 $@
257265

258-
$(app_tic_tac_toe): $(app_entry) $(SRC_APP)/tic_tac_toe.c $(SRC_LIB_UTILS)/output.h $(SRC_LIB_UTILS)/input.h $(SRC_LIB_UTILS)/time.h $(BUILD_LIB_UTILS)/libutils $(BUILD_DRIVERS)/display/libtm_vga # And dependecies :/
266+
$(app_tic_tac_toe): $(app_entry) $(SRC_APP)/tic_tac_toe.c $(SRC_LIB_UTILS)/output.h $(SRC_LIB_UTILS)/input.h $(SRC_LIB_UTILS)/time.h $(BUILD_LIB_UTILS)/libutils $(BUILD_DRIVERS)/display/libtm_vga $(BUILD_LIB_SYSCALL)/libsyscall # And dependecies :/
259267
mkdir -p $$(dirname $(app_tic_tac_toe))
260268
gcc -m32 -fno-pie -c -Isrc -o $(BUILD_APP)/tic_tac_toe.o $(SRC_APP)/tic_tac_toe.c
261-
ld --oformat binary -m elf_i386 -Ttext 0x0 --strip-all -o $@ $(app_entry) $(BUILD_APP)/tic_tac_toe.o $(BUILD_LIB_UTILS)/libutils $(BUILD_DRIVERS)/display/libtm_vga
269+
ld --oformat binary -m elf_i386 -Ttext 0x0 --strip-all -o $@ $(app_entry) $(BUILD_APP)/tic_tac_toe.o $(BUILD_LIB_UTILS)/libutils $(BUILD_DRIVERS)/display/libtm_vga $(BUILD_LIB_SYSCALL)/libsyscall
262270
truncate --size=%512 $@

src/bootloader/stage2.c

Lines changed: 7 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -4,105 +4,15 @@
44
#include <lib/utils/logging.h>
55
#include <lib/utils/time.h>
66

7-
#define GDT_TABLE_SIZE 7
7+
#include "memmgr/tables/gdt.c"
88

9-
#pragma pack(push, 1)
10-
struct GDTReference {
11-
unsigned short size;
12-
unsigned int base_address;
13-
};
14-
struct GDTEntry {
15-
unsigned short limit0;
16-
unsigned short base0;
17-
unsigned char base1;
18-
unsigned char access_byte;
19-
unsigned char flags_limit1;
20-
unsigned char base2;
21-
};
22-
#pragma pack(pop)
23-
24-
struct GDTReference *gdtr;
9+
#define GDT_TABLE_SIZE 5
2510
struct GDTEntry gdt_table[GDT_TABLE_SIZE];
2611

27-
void populate_gct_entry(struct GDTEntry *entry,
28-
unsigned int base,
29-
unsigned int limit, // 20 bits
30-
unsigned char flags, // 4 bits
31-
unsigned char access_byte
32-
) {
33-
entry->base0 = (base&0x0000FFFF);
34-
entry->base1 = (base&0x00FF0000)>>16;
35-
entry->base2 = (base&0xFF000000)>>24;
36-
entry->limit0 = (limit&0x0FFFF);
37-
entry->flags_limit1 = (flags<<4)|((limit&0xF0000)>>16);
38-
entry->access_byte = access_byte;
39-
}
40-
41-
extern int _low_get_gdtr_address();
12+
extern struct GDTReference* _low_get_gdtr_address();
4213
extern void enter_protected_mode();
4314
extern void label_exit();
4415

45-
void populate_gdt_table() {
46-
print_log("Populating GDT Table at 0x%d", gdt_table);
47-
48-
// NULL selector
49-
populate_gct_entry(
50-
&gdt_table[0],
51-
0,0,0,0);
52-
// Kernel Code Segment Selector
53-
populate_gct_entry(
54-
&gdt_table[1],
55-
MEMORY_LOCATION_KERNEL, MEMORY_LOCATION_KERNEL+0xFFFF,
56-
0b0100, // 32-bit protected mode
57-
0x9a);
58-
// Kernel Data Segment Selector
59-
populate_gct_entry(
60-
&gdt_table[2],
61-
MEMORY_LOCATION_KERNEL, MEMORY_LOCATION_KERNEL+0xFFFF,
62-
0b0100, // 32-bit protected mode
63-
0x92);
64-
// Absolute Code Segment Selector
65-
populate_gct_entry(
66-
&gdt_table[3],
67-
0, 0xfffff,
68-
0b0000, // 16-bit protected mode
69-
0x9a);
70-
// Absolute Data Segment Selector
71-
populate_gct_entry(
72-
&gdt_table[4],
73-
0, 0xfffff,
74-
0b0000, // 16-bit protected mode
75-
0x92);
76-
// Application Code Segment Selector
77-
populate_gct_entry(
78-
&gdt_table[5],
79-
MEMORY_LOCATION_APP, MEMORY_LOCATION_APP+0xFFFF,
80-
0b0100, // 32-bit protected mode
81-
0x9a);
82-
// Application Data Segment Selector
83-
populate_gct_entry(
84-
&gdt_table[6],
85-
MEMORY_LOCATION_APP, MEMORY_LOCATION_APP+0xFFFF,
86-
0b0100, // 32-bit protected mode
87-
0x92);
88-
89-
90-
gdtr = (struct GDTReference*)_low_get_gdtr_address();
91-
gdtr->base_address = (int)gdt_table;
92-
gdtr->size = (sizeof(gdt_table));
93-
94-
// Print the table and table addresse.
95-
print_log("GDTR: 0x%x; base address: 0x%x, size: %d",
96-
(int)gdtr, gdtr->base_address, gdtr->size);
97-
int gdt_entries = gdtr->size/sizeof(struct GDTEntry);
98-
for(int i=0;i<gdt_entries;i++) {
99-
print_log(" GDT Entry %d: %x%x",
100-
i,
101-
*(int*)(8*i+(int)gdt_table),
102-
*(int*)(8*i+4+(int)gdt_table));
103-
}
104-
}
105-
10616
void load_kernel() {
10717
print_log("Loading Kernel");
10818
int err = load_sectors(MEMORY_LOCATION_KERNEL, 0x80, SECTOR_START_KERNEL, SECTOR_COUNT_KERNEL);
@@ -135,10 +45,12 @@ void entry_stage() {
13545
print_log("");
13646
load_static_library();
13747
load_kernel();
138-
populate_gdt_table();
48+
49+
struct GDTReference* gdtr = _low_get_gdtr_address();
50+
populate_gdt_table(gdtr, gdt_table, GDT_TABLE_SIZE, 0);
13951

14052
// Enter_protected_mode never returns.
141-
print_log("Entering protected mode");
53+
print_log("Loading GDT Table and entering protected mode");
14254
enter_protected_mode();
14355
// And thus PC should never reach here :)
14456
}

src/kernel/core.asm

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
extern kernel_core_entry
66
extern reload_idt_table
7-
global call_main
87

98
[SECTION .text]
109
; protected mode real entry point.
@@ -27,47 +26,3 @@ global call_main
2726
STI
2827
pop eax
2928
jmp eax
30-
31-
32-
call_main:
33-
push ebp
34-
mov ebp, esp
35-
36-
mov eax, [ebp + 0x8] ; (argc)
37-
mov ebx, [ebp + 0xc] ; (argv)
38-
39-
mov eax, esp
40-
mov [kernel_saved_stack_top], eax
41-
42-
; Preparing for exec.
43-
44-
mov ax, 0x30
45-
mov es, ax
46-
mov ss, ax
47-
mov ds, ax
48-
mov fs, ax
49-
mov gs, ax
50-
51-
mov eax, 0xFFFF
52-
mov esp, eax
53-
call 0x28:0x0000
54-
; eax should contain the program return value.
55-
56-
; Returned from exec.
57-
58-
mov bx, 0x10
59-
mov es, bx
60-
mov ss, bx
61-
mov ds, bx
62-
mov fs, bx
63-
mov gs, bx
64-
65-
mov ebx, [kernel_saved_stack_top]
66-
mov esp, ebx
67-
68-
mov esp, ebp
69-
pop ebp
70-
ret
71-
72-
[SECTION .data]
73-
kernel_saved_stack_top db ' '

src/kernel/core.c

Lines changed: 44 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,17 @@
66
#include <lib/utils/input.h>
77
#include <lib/utils/panic.h>
88
#include <lib/utils/time.h>
9+
#include <lib/syscall/syscall.h>
910

1011
#include "kernel/essentials.c"
1112
#include "kernel/interrupts.c"
13+
#include "kernel/process.c"
1214

1315
extern void kernel_enable_interrupts();
1416

15-
extern int call_main(int argc, char *argv[]);
16-
17-
void exec(int sector_index, int sector_count){
18-
print_log("Exec is loading app in memory.");
19-
20-
int err = load_sectors(MEMORY_LOCATION_APP, 0x80, SECTOR_START_APP_TTT, SECTOR_COUNT_APP_TTT);
21-
if(err) {
22-
print_log("Failed to load app in memory, Error: ", err);
23-
} else {
24-
int relative_address = MEMORY_LOCATION_APP-MEMORY_LOCATION_KERNEL;
25-
print_log("App loaded at 0x%x, relative_address: 0x%x: %x...",
26-
MEMORY_LOCATION_APP, relative_address,
27-
*(int*)relative_address);
28-
int exit_code = call_main(0, 0);
29-
print_log("App exit_code: %d", exit_code);
30-
}
17+
char command[30];
18+
int send_int(int a,int b) {
19+
asm("int $0x61");
3120
}
3221

3322
void kernel_core_entry() {
@@ -41,15 +30,46 @@ void kernel_core_entry() {
4130
kernel_enable_interrupts();
4231
keyboard_init();
4332

44-
move_xy(0,10);
45-
print_line("Typewriter: ");
46-
set_color_bg(C_WHITE);
47-
set_color_fg(C_BLACK);
48-
print_rectangle(0, 12, TEXT_WINDOW_WIDTH-1, TEXT_WINDOW_HEIGHT-2);
49-
move_xy(0,12);
33+
process_handler_init();
34+
int need_to_clear_hack = 1;
5035
while(1) {
51-
print_char(getch());
36+
if(need_to_clear_hack) {
37+
move_xy(0,10);
38+
print_line("Typewriter: ");
39+
set_color_bg(C_WHITE);
40+
set_color_fg(C_BLACK);
41+
print_rectangle(0, 12, TEXT_WINDOW_WIDTH-1, TEXT_WINDOW_HEIGHT-2);
42+
move_xy(0,12);
43+
print_line("Suppored Commands: run ttt, run calculator, exit\n");
44+
need_to_clear_hack = 0;
45+
}
46+
read_line(command);
47+
int run = 0;
48+
int sector_start, sector_count;
49+
print_log("Command: '%s'", command);
50+
if(strcmpi(command, "run ttt")==0) {
51+
sector_start = SECTOR_START_APP_TTT;
52+
sector_count = SECTOR_COUNT_APP_TTT;
53+
run = 1;
54+
} else if(strcmpi(command, "run calculator")==0) {
55+
sector_start = SECTOR_START_APP_CALC;
56+
sector_count = SECTOR_COUNT_APP_CALC;
57+
run = 1;
58+
} else if(strcmpi(command, "exit")==0) {
59+
PANIC(0, "No Panic, it's a normal exit.");
60+
}
61+
62+
if(run) {
63+
need_to_clear_hack = 1;
64+
int exit_code = syscall(1, sector_start, sector_count, 0,0);
65+
if(exit_code<0) {
66+
print_log("Failed to execute the process.");
67+
} else {
68+
print_log("App exit_code: %d", exit_code);
69+
}
70+
} else {
71+
print_log("Invalid Command!");
72+
}
5273
}
53-
exec(0, 0);
5474
PANIC(501, "Kernel is under development!!!");
5575
}

0 commit comments

Comments
 (0)