Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -53,3 +53,4 @@ dkms.conf
*.iso
/isodir
serial.log
*.cpio
2 changes: 2 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ cis-os.iso: kernel/kernel.elf boot/grub.cfg
mkdir -p isodir/boot/grub
cp kernel/kernel.elf isodir/boot/kernel.elf
cp boot/grub.cfg isodir/boot/grub/grub.cfg
cd initrd && find . -print | cpio -o -H newc > ../initrd.cpio && cd ..
cp initrd.cpio isodir/initrd.cpio
grub-mkrescue -o cis-os.iso isodir

kernel/kernel.elf: $(OBJS)
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ make run

- `boot/`: Конфигурация GRUB.
- `kernel/`: Основной код ядра.
- `initrd/`: Файлы виртуального диска.
- `scripts/`: Скрипты для сборки и запуска.

## XD
Expand Down
12 changes: 12 additions & 0 deletions ROADMAP.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Дорожная карта проекта

- [ ] Обработка прерываний
- [ ] Трассировка стека
- [ ] Менеджер памяти
- [ ] Kernel libc
- [ ] CPIO
- [ ] [libcpuid](https://github.com/anrieff/libcpuid)
- [ ] Менеджер потоков
- [ ] VFS
- [ ] [LittleFS](https://github.com/littlefs-project/littlefs)
- [ ] [DOOM](https://github.com/Daivuk/PureDOOM)
1 change: 1 addition & 0 deletions initrd/Wellcome.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
:D
75 changes: 75 additions & 0 deletions kernel/cpio.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
#include <kstdint.h>

// We need memory manager and kernel lib first
#if 0
typedef struct {
char c_magic[6]; // "070701"
char c_ino[8];
char c_mode[8];
char c_uid[8];
char c_gid[8];
char c_nlink[8];
char c_mtime[8];
char c_filesize[8];
char c_devmajor[8];
char c_devminor[8];
char c_rdevmajor[8];
char c_rdevminor[8];
char c_namesize[8];
char c_check[8];
} cpio_header_t;

void cpio_from_memory(const char *cpio, uint64_t len) {
const char *ptr = cpio;
const char *end = cpio + len;

while (ptr + sizeof(cpio_header_t) <= end) {
const cpio_header_t *hdr = (const cpio_header_t *)ptr;

if (memcmp(hdr->c_magic, "070701", 6) != 0) {
if (memcmp(hdr->c_magic, "000000", 6) == 0) {
printf("End of archive reached.\n");
break;
} else {
printf("Invalid cpio magic number.\n");
return;
}
}

uint64_t namesize = strtoul(hdr->c_namesize, NULL, 16);
uint64_t filesize = strtoul(hdr->c_filesize, NULL, 16);

uint64_t name_padding = (namesize + 3) & ~3;
ptr += sizeof(cpio_header_t);

if (ptr + namesize > end) {
printf("Error: Not enough data for file name.\n");
return;
}
char *name = malloc(namesize + 1);
if (!name) {
printf("Memory allocation failed.\n");
return;
}
memcpy(name, ptr, namesize);
name[namesize] = '\0';
printf("File name: %s\n", name);
free(name);

ptr += name_padding;

if (ptr + filesize > end) {
printf("Error: Not enough data for file content.\n");
return;
}
printf("File size: %llu bytes\n", filesize);

ptr += (filesize + 3) & ~3;

if (ptr > end) {
printf("Error: Overran buffer.\n");
return;
}
}
}
#endif
Loading