diff --git a/.gitignore b/.gitignore index e40d53c..afb7f5e 100644 --- a/.gitignore +++ b/.gitignore @@ -53,3 +53,4 @@ dkms.conf *.iso /isodir serial.log +*.cpio diff --git a/Makefile b/Makefile index a3a7357..67561d9 100644 --- a/Makefile +++ b/Makefile @@ -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) diff --git a/README.md b/README.md index c962541..5a7c655 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,7 @@ make run - `boot/`: Конфигурация GRUB. - `kernel/`: Основной код ядра. +- `initrd/`: Файлы виртуального диска. - `scripts/`: Скрипты для сборки и запуска. ## XD diff --git a/ROADMAP.md b/ROADMAP.md new file mode 100644 index 0000000..011c780 --- /dev/null +++ b/ROADMAP.md @@ -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) diff --git a/initrd/Wellcome.txt b/initrd/Wellcome.txt new file mode 100644 index 0000000..93c710d --- /dev/null +++ b/initrd/Wellcome.txt @@ -0,0 +1 @@ +:D \ No newline at end of file diff --git a/kernel/cpio.c b/kernel/cpio.c new file mode 100644 index 0000000..f967fe6 --- /dev/null +++ b/kernel/cpio.c @@ -0,0 +1,75 @@ +#include + +// 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 \ No newline at end of file