Skip to content

Commit 40e3beb

Browse files
committed
Major update
* Implemented VFS * Implemented SORFS * Implemented tree structure * Implemented slow ata driver * Implemented mbr partition probing * Implemented ramdisk * Implemented devfs * Implemented kernelfs * Implemented filesystem detection function * Created tools for making and extracting sorfs disk image * Can access sorfs disk image loaded using module command in grub * Implemented PCI driver * Fixed some bugs in vga_text driver * Fixed a bug in strstr function in string.c * Implemented random motd printing * Implemented zalloc to allocate memory initialized with 0 * Updated Makefile * Updated kernelmain.c * Incremented kernel version
1 parent 3a9accc commit 40e3beb

38 files changed

+3096
-35
lines changed

.gitignore

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,7 @@
55
**/*.o
66
src/kernel/kernel.o
77
*.sym
8-
*.log
8+
*.log
9+
*.img
10+
sorfs
11+
sorhd

Makefile

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ INCLUDEDIR=$(SRCDIR)/include/
44
BACKUPDIR=$(SRCDIR)/../../BACKUP/
55
GRUBDIR=
66
SCRIPTSDIR=$(SRCDIR)/scripts/
7+
FILESDIR=files
78

89
CC=$(TOOLDIR)/i686-elf-gcc
910
CFLAGS= -I$(INCLUDEDIR) -I/usr/include -nostdlib -lgcc -fno-builtin -fno-exceptions -fno-leading-underscore -Wall -m32 -g
@@ -27,17 +28,19 @@ OBJDUMP = i686-elf-objdump
2728
OBJCOPYFLAGS = --strip-debug --strip-unneeded
2829

2930
QEMU=qemu-system-i386
30-
QEMUFLAGS=-cdrom SEOS.iso -m 1024M
31-
QEMUDFLAGS=-serial file:serial.log -s -S -daemonize -m 32M
31+
QEMUFLAGS=-cdrom $(ISOFILE) -m 1024M -boot d
32+
QEMUDFLAGS=-serial file:serial.log -s -S -daemonize -m 64M
3233

33-
PROJECT=SEOS
34+
PROJECT=SectorOS-RW4
3435

3536
EXECUTABLE=$(PROJECT).elf
3637
ISOFILE=$(PROJECT).iso
38+
IMAGEFILE=sorhd
3739

3840
OBJECTS= $(SRCDIR)/boot/multiboot.o \
3941
$(SRCDIR)/boot/boot.o \
4042
$(SRCDIR)/drivers/io/ports.o \
43+
$(SRCDIR)/drivers/io/pci.o \
4144
$(SRCDIR)/drivers/power/reboot.o \
4245
$(SRCDIR)/drivers/cpu/gdt.o \
4346
$(SRCDIR)/drivers/cpu/gdt_helper.o \
@@ -47,6 +50,9 @@ OBJECTS= $(SRCDIR)/boot/multiboot.o \
4750
$(SRCDIR)/drivers/cpu/pit.o \
4851
$(SRCDIR)/drivers/cpu/rdtsc.o \
4952
$(SRCDIR)/drivers/cpu/cpuinfo.o \
53+
$(SRCDIR)/drivers/storage/atapio.o \
54+
$(SRCDIR)/drivers/storage/mbr.o \
55+
$(SRCDIR)/drivers/storage/ramdisk.o \
5056
$(SRCDIR)/interrupts/interrupt.o \
5157
$(SRCDIR)/interrupts/interrupt_helper.o \
5258
$(SRCDIR)/interrupts/exception.o \
@@ -58,6 +64,12 @@ OBJECTS= $(SRCDIR)/boot/multiboot.o \
5864
$(SRCDIR)/common/libs/math.o \
5965
$(SRCDIR)/common/libs/rng.o \
6066
$(SRCDIR)/common/libs/list.o \
67+
$(SRCDIR)/common/libs/tree.o \
68+
$(SRCDIR)/fs/vfs.o \
69+
$(SRCDIR)/fs/devfs.o \
70+
$(SRCDIR)/fs/mount.o \
71+
$(SRCDIR)/fs/sorfs.o \
72+
$(SRCDIR)/fs/kernelfs.o \
6173
$(SRCDIR)/drivers/video/vga_text.o \
6274
$(SRCDIR)/drivers/io/serial.o \
6375
$(SRCDIR)/drivers/input/keyboard.o \
@@ -78,19 +90,21 @@ $(EXECUTABLE): $(OBJECTS)
7890

7991
compile_objs: $(OBJECTS)
8092

81-
$(ISOFILE): $(EXECUTABLE)
93+
$(ISOFILE): $(IMAGEFILE) $(EXECUTABLE)
8294
@echo '[GRUB] $@'
8395
@mkdir -p $(PROJECT)/boot/grub
8496
@cp $(EXECUTABLE) $(PROJECT)/boot/
97+
@cp sorhd $(PROJECT)/boot/
8598
@echo 'set timeout=3' >> $(PROJECT)/boot/grub/grub.cfg
8699
@echo 'set default=0' >> $(PROJECT)/boot/grub/grub.cfg
87100
@echo 'set root=(cd)' >> $(PROJECT)/boot/grub/grub.cfg
88101
@echo '' >> $(PROJECT)/boot/grub/grub.cfg
89102
@echo 'menuentry "$(PROJECT)" { '>> $(PROJECT)/boot/grub/grub.cfg
90103
@echo 'multiboot /boot/$(EXECUTABLE)' >> $(PROJECT)/boot/grub/grub.cfg
104+
@echo 'module /boot/sorhd' >> $(PROJECT)/boot/grub/grub.cfg
91105
@echo 'boot' >> $(PROJECT)/boot/grub/grub.cfg
92106
@echo '}' >> $(PROJECT)/boot/grub/grub.cfg
93-
@$(GRUBDIR)grub-mkrescue -o $(ISOFILE) $(PROJECT)
107+
@$(GRUBDIR)grub-mkrescue -o $(ISOFILE) $(PROJECT) --product-name=$(PROJECT)
94108
@rm -rf $(PROJECT)/
95109

96110

@@ -106,8 +120,16 @@ $(ISOFILE): $(EXECUTABLE)
106120
@echo '[NASM] $@'
107121
@$(NASM) $(NASMFLAGS) -o $@ $<
108122

123+
sorfs_compile:
124+
@echo '[CC] $(SRCDIR)/tools/sorfs.c => sorfs'
125+
@gcc $(SRCDIR)/tools/sorfs.c -o sorfs
126+
127+
$(IMAGEFILE): sorfs_compile
128+
@echo '[SORFS] $@'
129+
./sorfs -c $@ $(wildcard $(FILESDIR)/*)
130+
109131
run: $(ISOFILE)
110-
$(QEMU) $(QEMUFLAGS)
132+
$(QEMU) $(QEMUFLAGS) -enable-kvm -cpu host
111133

112134
rund: $(ISOFILE)
113135
$(QEMU) $(QEMUFLAGS) $(QEMUDFLAGS)
@@ -122,7 +144,7 @@ forcerund: clean iso rund
122144
PHONY: clean kernel
123145
clean:
124146
@echo 'Cleaning the source directory...'
125-
@rm -f $(OBJECTS) $(EXECUTABLE) $(ISOFILE)
147+
@rm -f $(OBJECTS) $(EXECUTABLE) $(ISOFILE) sorfs $(IMAGEFILE)
126148

127149
clean_objs:
128150
@rm -f $(OBJECTS)

docs/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ Kernel Version
1414

1515

1616
## 🧱 Kernel
17-
The current kernel version for SectorOS-RW4 is v3.23.03.8NR.<br>
17+
The current kernel version for SectorOS-RW4 is v4.23.04.2NR.<br>
1818

1919
## ⚙️ Build Steps
2020

docs/changelog.txt

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@
8383
* Incremented kernel version
8484
* Updated README.md
8585

86-
03-04-2023: 02:23 PM IST v3.23.03.8NR
86+
03-04-2023: 02:23 PM IST v3.23.04.1NR
8787
* Major update
8888
* Fixed a bug in PMM
8989
* Implemented function to retrieve cpuinfo
@@ -100,4 +100,26 @@
100100
* Updated textmode driver
101101
* Updated Makefile
102102
* Incremented kernel version
103-
* Implemented a function to dump contents of a memory address to screen or serial port
103+
* Implemented a function to dump contents of a memory address to screen or serial port
104+
105+
08-04-2023: 09:30 PM IST v4.23.04.2NR
106+
* Major update
107+
* Implemented VFS
108+
* Implemented SORFS
109+
* Implemented tree structure
110+
* Implemented slow ata driver
111+
* Implemented mbr partition probing
112+
* Implemented ramdisk
113+
* Implemented devfs
114+
* Implemented kernelfs
115+
* Implemented filesystem detection function
116+
* Created tools for making and extracting sorfs disk image
117+
* Can access sorfs disk image loaded using module command in grub
118+
* Implemented PCI driver
119+
* Fixed some bugs in vga_text driver
120+
* Fixed a bug in strstr function in string.c
121+
* Implemented random motd printing
122+
* Implemented zalloc to allocate memory initialized with 0
123+
* Updated Makefile
124+
* Updated kernelmain.c
125+
* Incremented kernel version

files/test.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Hello World!

src/common/libs/debug.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ void stack_trace(uint32_t maxframes)
1616
for(uint32_t frame = 0; stk && frame < maxframes; frame++)
1717
{
1818
printf("\t[0x%06x]: 0x%06x\n", ((uint32_t)stk), stk->eip);
19+
serialprintf("\t[0x%06x]: 0x%06x\n", ((uint32_t)stk), stk->eip);
1920
stk = stk->ebp;
2021
}
2122
}

src/common/libs/string.c

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,18 @@ int memcmp(uint8_t* data1, uint8_t* data2, int n)
2222
return 1;
2323
}
2424

25+
int memzero(uint8_t* data, size_t size)
26+
{
27+
for(int i = 0; i < size; i++)
28+
{
29+
if(data[i] != 0)
30+
{
31+
return 1;
32+
}
33+
}
34+
return 0;
35+
}
36+
2537
void* memcpy(void* dst, const void* src, int n)
2638
{
2739
char* ret = (char*)dst;
@@ -126,17 +138,17 @@ int strncmp(const char *s1, const char *s2, int c)
126138
char* strstr(const char* in, const char* str)
127139
{
128140
char c;
129-
size_t len;
141+
uint32_t len;
130142

131-
c = *str;
132-
if(!c)
133-
return (char*)in;
143+
c = *str++;
144+
if (!c)
145+
return (char *)in;
134146

135147
len = strlen(str);
136-
137148
do
138149
{
139150
char sc;
151+
140152
do
141153
{
142154
sc = *in++;
@@ -226,7 +238,28 @@ int atoi(char *string)
226238

227239
char* itoa_r(unsigned long int n, int base)
228240
{
229-
return NULL;
241+
unsigned long int tmp;
242+
int i, j;
243+
char* buf = (char*)kmalloc(sizeof(char) * 32);
244+
245+
tmp = n;
246+
i = 0;
247+
248+
do
249+
{
250+
tmp = n % base;
251+
buf[i++] = (tmp < 10) ? (tmp + '0') : (tmp + 'a' - 10);
252+
} while (n /= base);
253+
buf[i--] = 0;
254+
255+
for (j = 0; j < i; j++, i--)
256+
{
257+
tmp = buf[j];
258+
buf[j] = buf[i];
259+
buf[i] = tmp;
260+
}
261+
262+
return buf;
230263
}
231264

232265
int isspace(char c)

src/common/libs/tree.c

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
#include "tree.h"
2+
3+
4+
tree_t* tree_create()
5+
{
6+
return (tree_t *)kcalloc(sizeof(tree_t), 1);
7+
}
8+
9+
treenode_t *tree_node_create(void *data)
10+
{
11+
treenode_t *n = (treenode_t*)kcalloc(sizeof(treenode_t), 1);
12+
n->data = data;
13+
n->children = list_create();
14+
return n;
15+
}
16+
17+
treenode_t *tree_insert(tree_t *tree, treenode_t *subroot, void *data)
18+
{
19+
treenode_t *treenode = (treenode_t*)kcalloc(sizeof(treenode_t), 1);
20+
treenode->children = list_create();
21+
treenode->data = data;
22+
23+
if (!tree->root)
24+
{
25+
tree->root = treenode;
26+
return treenode;
27+
}
28+
list_insert_front(subroot->children, treenode);
29+
return treenode;
30+
}
31+
32+
treenode_t *tree_findParent(tree_t *tree, treenode_t *remove_node, int *child_index)
33+
{
34+
if (remove_node == tree->root)
35+
return NULL;
36+
return tree_findParent_recur(tree, remove_node, tree->root, child_index);
37+
}
38+
39+
treenode_t *tree_findParent_recur(tree_t *tree, treenode_t *remove_node, treenode_t *subroot, int *child_index)
40+
{
41+
int idx;
42+
if ((idx = list_contain(subroot->children, remove_node)) != -1)
43+
{
44+
*child_index = idx;
45+
return subroot;
46+
}
47+
foreach (child, subroot->children)
48+
{
49+
treenode_t *ret = tree_findParent_recur(tree, remove_node, (treenode_t*)child->val, child_index);
50+
if (ret != NULL)
51+
{
52+
return ret;
53+
}
54+
}
55+
return NULL;
56+
}
57+
58+
void tree_remove(tree_t *tree, treenode_t *remove_node)
59+
{
60+
int child_index = -1;
61+
treenode_t *parent = tree_findParent(tree, remove_node, &child_index);
62+
if (parent != NULL)
63+
{
64+
treenode_t *freethis = (treenode_t*)list_remove_by_index(parent->children, child_index);
65+
kfree(freethis);
66+
}
67+
}
68+
69+
void tree2list_recur(treenode_t *subroot, list_t *list)
70+
{
71+
if (subroot == NULL)
72+
return;
73+
foreach (child, subroot->children)
74+
{
75+
treenode_t *curr_treenode = (treenode_t *)child->val;
76+
void *curr_val = curr_treenode->data;
77+
list_insert_back(list, curr_val);
78+
tree2list_recur((treenode_t*)child->val, list);
79+
}
80+
}
81+
82+
void tree2list(tree_t *tree, list_t *list)
83+
{
84+
tree2list_recur(tree->root, list);
85+
}
86+
87+
void tree2array(tree_t *tree, void **array, int *size)
88+
{
89+
tree2array_recur(tree->root, array, size);
90+
}
91+
92+
void tree2array_recur(treenode_t *subroot, void **array, int *size)
93+
{
94+
if (subroot == NULL)
95+
return;
96+
void *curr_val = (void *)subroot->data;
97+
array[*size] = curr_val;
98+
*size = *size + 1;
99+
foreach (child, subroot->children)
100+
{
101+
tree2array_recur((treenode_t*)child->val, array, size);
102+
}
103+
}

src/drivers/input/keyboard.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,5 +389,13 @@ char kcodeTochar(uint8_t scancode)
389389
break;
390390
}
391391
}
392+
else if(scancode == 0xaa || scancode == 0xb6)
393+
{
394+
isShift = 0;
395+
}
396+
else
397+
{
398+
serialprintf("[KBD] GOT KEYPRESS: 0x%02x\n", scancode);
399+
}
392400
return key;
393401
}

0 commit comments

Comments
 (0)