Skip to content

Commit fd042d3

Browse files
committed
fix issues with makefile and shell.nix, fix backspace bug
1 parent 20bb0ee commit fd042d3

File tree

10 files changed

+40
-124
lines changed

10 files changed

+40
-124
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
commit 20bb0ee3f10fb3038fe786707da6aaac09273f3d
2+
Author: Alexeev Bronislav <alexeev.dev@mail.ru>
3+
Date: Sat Aug 23 05:14:12 2025 +0700
4+
5+
docs: update readme and add docs
6+
17
commit fc36ce4c4630d7468c9cc562f977fbc3bcf51146
28
Author: Alexeev Bronislav <alexeev.dev@mail.ru>
39
Date: Sat Aug 23 04:14:24 2025 +0700

Makefile

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -55,30 +55,29 @@ $(BIN_DIR)/%.o: $(SRC_DIR)/%.c
5555
@mkdir -p $(dir $@)
5656
@$(CC) $(CFLAGS) -c $< -o $@
5757

58-
diskimg: $(BIN_DIR)/kintsugios.bin
59-
@printf "$(BLUE)[DD] Make IMG %-50s -> %s$(RESET)\n" "$(BIN_DIR)/kintsugios.bin" "$(DISKIMG_DIR)/$(DISKIMG_NAME)"
58+
$(DISKIMG_DIR)/$(DISKIMG_NAME): $(BIN_DIR)/kintsugios.bin
59+
@printf "$(BLUE)[DD] Make IMG %-50s -> %s$(RESET)\n" "$(BIN_DIR)/kintsugios.bin" "$@"
6060
@mkdir -p $(DISKIMG_DIR)
61-
@dd if=/dev/zero of=$(DISKIMG_DIR)/$(DISKIMG_NAME) bs=1024 count=1440
62-
@dd if=$(BIN_DIR)/kintsugios.bin of=$(DISKIMG_DIR)/$(DISKIMG_NAME) conv=notrunc
61+
@dd if=/dev/zero of=$@.tmp bs=1024 count=1440
62+
@dd if=$< of=$@.tmp conv=notrunc
63+
@mv $@.tmp $@
64+
65+
diskimg: $(DISKIMG_DIR)/$(DISKIMG_NAME)
6366

6467
run_bin: $(BIN_DIR)/kintsugios.bin
6568
@printf "$(GREEN)[QEMU] Run bin %-50s$(RESET)\n" "$(BIN_DIR)/kintsugios.bin"
6669
@qemu-system-i386 -fda $(BIN_DIR)/kintsugios.bin
6770

68-
run: diskimg
69-
@printf "$(GREEN)[QEMU] Run img %-50s$(RESET)\n" "$(DISKIMG_DIR)/$(DISKIMG_NAME)"
70-
@qemu-system-i386 -fda $(DISKIMG_DIR)/$(DISKIMG_NAME) -boot a
71+
run: $(DISKIMG_DIR)/$(DISKIMG_NAME)
72+
@printf "$(GREEN)[QEMU] Run img %-50s$(RESET)\n" "$<"
73+
@qemu-system-i386 -fda $< -boot a
7174

72-
debug: diskimg
73-
@printf "$(GREEN)[QEMU] Debug img %-50s$(RESET)\n" "$(DISKIMG_DIR)/$(DISKIMG_NAME)"
74-
@qemu-system-i386 -fda $(DISKIMG_DIR)/$(DISKIMG_NAME) -boot a -s -S
75+
debug: $(DISKIMG_DIR)/$(DISKIMG_NAME)
76+
@printf "$(GREEN)[QEMU] Debug img %-50s$(RESET)\n" "$<"
77+
@qemu-system-i386 -fda $< -boot a -s -S
7578

7679
clean:
7780
@printf "$(RED)[RM] Clean bin %-50s$(RESET)\n" "$(BIN_DIR)"
78-
@rm -rf $(BIN_DIR)/*
79-
80-
clean_all:
81-
@printf "$(RED)[RM] Clean all %-50s$(RESET)\n" "$(BIN_DIR)"
8281
@rm -rf $(BIN_DIR)/* $(DISKIMG_DIR)/*
8382

84-
.PHONY: all diskimg run run_bin clean clean_all
83+
.PHONY: all diskimg run run_bin debug clean clean_all

README.md

Lines changed: 6 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
# KintsugiOS
2-
32
Минималистичная x86 операционная система на (N)ASM и C, созданная в образовательных целях для глубокого понимания принципов работы операционных систем.
43

4+
> Также я занимаюсь [переводом OSDEV-Notes](https://github.com/alexeev-prog/Osdev-Notes-RU)
5+
56
<div align="center">
67
<img src=https://img.shields.io/github/languages/top/alexeev-prog/KintsugiOS>
78
<img src=https://img.shields.io/github/license/alexeev-prog/KintsugiOS>
@@ -50,52 +51,17 @@
5051
Для сборки и запуска KintsugiOS необходим следующий инструментарий:
5152

5253
- [Кросс-компилятор i386 ELF GCC](http://newos.org/toolchains/i386-elf-15.1.0-Linux-x86_64.tar.xz)
53-
- FASM 1.73.31 или новее
54-
- NASM 2.16 или новее
54+
- FASM
55+
- NASM
5556
- GDB для отладки
56-
- MTools и Xorriso для создания образов дисков
57-
- QEMU или Bochs для эмуляции
57+
- MTools и Xorriso
58+
- QEMU или Bochs
5859

5960
Проверить готовность окружения можно скриптом:
6061
```bash
6162
./check-env.sh
6263
```
6364

64-
## Структура проекта
65-
66-
```
67-
src/
68-
├── bootloader/ # Код загрузчика
69-
│ ├── bootsector.asm # Главная загрузочная запись
70-
│ ├── diskload.asm # Чтение с диска
71-
│ ├── gdt.asm # Глобальная таблица дескрипторов
72-
│ ├── kernel_entry.asm # Точка входа в ядро
73-
│ ├── puts_chars.asm # Вывод текста (16-бит)
74-
│ ├── puts_chars32.asm # Вывод текста (32-бит)
75-
│ ├── puts_hex.asm # Вывод hex-чисел
76-
│ └── switch_to32.asm # Переход в защищённый режим
77-
└── kernel/ # Ядро ОС
78-
├── cpu/ # Центральные модули процессора
79-
│ ├── idt.[ch] # Таблица дескрипторов прерываний
80-
│ ├── interrupt.asm # Обработчики прерываний
81-
│ ├── isr.[ch] # Службы прерываний
82-
│ ├── ports.[ch] # Работа с портами ввода-вывода
83-
│ ├── timer.[ch] # Системный таймер
84-
│ └── type.h # Общие типы данных
85-
├── drivers/ # Драйверы устройств
86-
│ ├── keyboard.[ch] # Драйвер клавиатуры
87-
│ ├── lowlevel_io.[ch] # Низкоуровневый ввод-вывод
88-
│ └── screen.[ch] # Драйвер экрана
89-
├── kernel/ # Основное ядро
90-
│ ├── kernel.[ch] # Главные функции ядра
91-
│ ├── utils.[ch] # Вспомогательные утилиты
92-
└── libc/ # Стандартная библиотека C - KKLIBC (Kintsugi Kernel LibC)
93-
├── function.h # Вспомогательные макросы
94-
├── mem.[ch] # Управление памятью
95-
├── stdio.[ch] # Стандартный ввод-вывод
96-
└── string.[ch] # Работа со строками
97-
```
98-
9965
## Сборка и запуск
10066

10167
### Базовая сборка

shell.nix

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,6 @@ pkgs.mkShell {
1818

1919
shellHook = ''
2020
export PATH="${customToolchainPath}:$PATH"
21-
# Опционально: устанавливаем переменные окружения для удобства
22-
export CC="i386-elf-gcc"
23-
export AS="i386-elf-as"
2421
echo "Environment ready for KintsugiOS development!"
2522
echo "Using cross-compiler from: ${customToolchainPath}"
2623
echo "Type 'make run' to build and launch in QEMU (if your Makefile supports it)"

src/kernel/drivers/keyboard.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "../libc/string.h"
1414
#include "../libc/function.h"
1515
#include "../kernel/kernel.h"
16+
#include "../libc/stdio.h"
1617

1718
#define BACKSPACE 0x0E
1819
#define ENTER 0x1C
@@ -29,6 +30,7 @@ const char *sc_name[] = { "ERROR", "Esc", "1", "2", "3", "4", "5", "6",
2930
"A", "S", "D", "F", "G", "H", "J", "K", "L", ";", "'", "`",
3031
"LShift", "\\", "Z", "X", "C", "V", "B", "N", "M", ",", ".",
3132
"/", "RShift", "Keypad *", "LAlt", "Spacebar"};
33+
3234
const char sc_ascii[] = { '?', '?', '1', '2', '3', '4', '5', '6',
3335
'7', '8', '9', '0', '-', '=', '?', '?', 'Q', 'W', 'E', 'R', 'T', 'Y',
3436
'U', 'I', 'O', 'P', '[', ']', '?', '?', 'A', 'S', 'D', 'F', 'G',
@@ -38,20 +40,18 @@ const char sc_ascii[] = { '?', '?', '1', '2', '3', '4', '5', '6',
3840
static void keyboard_callback(registers_t regs) {
3941
/* PIC выходы сканкодов в порту 0x60 */
4042
u8 scancode = port_byte_in(0x60);
43+
int current_offset = get_cursor_offset();
4144

4245
if (scancode > SC_MAX) return;
4346
if (scancode == BACKSPACE) {
44-
if (shell_cursor_offset <= shell_prompt_offset) {
47+
// kprintf("%d %d\n", current_offset, shell_prompt_offset);
48+
// return;
49+
if (current_offset <= shell_prompt_offset) {
4550
return;
4651
}
4752

4853
backspace(key_buffer);
4954
kprint_backspace();
50-
51-
backspace(key_buffer);
52-
kprint_backspace();
53-
54-
shell_cursor_offset = get_cursor_offset();
5555
} else if (scancode == ENTER) {
5656
kprint("\n");
5757
user_input(key_buffer); /* функция под управлением ядра */
@@ -63,7 +63,7 @@ static void keyboard_callback(registers_t regs) {
6363
if(strlen(key_buffer) < sizeof(key_buffer) - 1) {
6464
append(key_buffer, letter);
6565
kprint(str);
66-
shell_cursor_offset += 2;
66+
shell_cursor_offset = get_cursor_offset();
6767
} else {
6868
kprint("Keyboard buffer is overflow.");
6969
}

src/kernel/kernel/kernel.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@ void user_input(char *input) {
6262
// Команда Подсказка для команды Указатель до функции
6363
{.text="END", .hint="HALT CPU", .command=&halt_cpu},
6464
{.text="CLEAR", .hint="Clear screen", .command=&clear_screen_command},
65-
{.text="AMALLOC", .hint="Kernel Arena Malloc. Usage: AMALLOC <size>", .command=&arena_malloc_command_shell},
6665
{.text="QEMUSHUTDOWN", .hint="Shutdown QEMU", .command=&shutdown_qemu},
6766
{.text="INFO", .hint="Get info", .command=&info_command_shell},
6867
{.text="FREEMEMADDR", .hint="Get free mem addr", .command=&print_freememaddr},
@@ -102,6 +101,6 @@ void user_input(char *input) {
102101
// Вывод строки шелла
103102
kprint("\n!#> ");
104103

105-
shell_cursor_offset = get_cursor_offset(); // get_cursor_offset из screen.c
104+
shell_cursor_offset = get_cursor_offset();
106105
shell_prompt_offset = shell_cursor_offset;
107106
}

src/kernel/kernel/utils.c

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -52,23 +52,6 @@ void info_command_shell(char** args) {
5252
kprintf("Block count: %d\n", meminfo.block_count);
5353
}
5454

55-
void arena_malloc_command_shell(char** args) {
56-
if (args[0] == NULL) {
57-
kprint("AMALLOC usage: AMALLOC <page size>");
58-
return;
59-
}
60-
61-
u32 phys_addr;
62-
u32 page = kmalloc(strtoint(args[0]), 1, &phys_addr);
63-
char page_str[16] = "";
64-
hex_to_ascii(page, page_str);
65-
char phys_str[16] = "";
66-
hex_to_ascii(phys_addr, phys_str);
67-
68-
kprintf("ARENA MALLOC %d bytes\n", strtoint(args[0]));
69-
kprintf("Page address: %s\nPhysical address: %s\n", page_str, phys_str);
70-
}
71-
7255
void mem_dump(char** args) {
7356
kmemdump();
7457
}
@@ -103,7 +86,7 @@ void kmalloc_command(char** args) {
10386
}
10487

10588
int size = strtoint(args[0]);
106-
void* ptr = kmalloc_new(size);
89+
void* ptr = kmalloc(size);
10790

10891
char buf1[32] = "";
10992
hex_to_ascii((int)ptr, buf1);
@@ -112,9 +95,9 @@ void kmalloc_command(char** args) {
11295
}
11396

11497
void test_mem_command(char** args) {
115-
void* ptr1 = kmalloc_new(64);
116-
void* ptr2 = kmalloc_new(128);
117-
void* ptr3 = kmalloc_new(256);
98+
void* ptr1 = kmalloc(64);
99+
void* ptr2 = kmalloc(128);
100+
void* ptr3 = kmalloc(256);
118101

119102
char buf1[32] = "";
120103
char buf2[32] = "";

src/kernel/kernel/utils.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ void shutdown_qemu(char** args);
77
void halt_cpu(char** args);
88
void help_command_shell(char** args);
99
void info_command_shell(char** args);
10-
void arena_malloc_command_shell(char** args);
1110
void test_mem_command(char** args);
1211
void mem_dump(char** args);
1312
void clear_screen_command(char** args);

src/kernel/libc/mem.c

Lines changed: 1 addition & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ void *get_physaddr(void *virtualaddr) {
5757
return (void *)((pt[ptindex] & ~0xFFF) + ((unsigned long)virtualaddr & 0xFFF));
5858
}
5959

60-
void* kmalloc_new(u32 size) {
60+
void* kmalloc(u32 size) {
6161
// Выравниваем размер до границы BLOCK_SIZE
6262
if (size % BLOCK_SIZE != 0) {
6363
size += BLOCK_SIZE - (size % BLOCK_SIZE);
@@ -165,38 +165,6 @@ void kmemdump() {
165165
}
166166
}
167167

168-
// LEGACY Arena
169-
/* Реализация - это просто указатель на некоторую свободную память, которая продолжает расти */
170-
u32 kmalloc(u32 size, int align, u32 *phys_addr) {
171-
172-
if(free_mem_addr_guard1 != 0xDEADBEEF || free_mem_addr_guard2 != 0xCAFEBABE) {
173-
kprint("PANIC: Memory corruption detected around free_mem_addr!\n");
174-
// Зависаем или перезагружаемся
175-
// asm volatile("hlt");
176-
return -1;
177-
}
178-
179-
/* Страницы выровнены по 4K, или 0x1000 */
180-
if (align == 1 && (free_mem_addr & 0xFFFFF000)) {
181-
free_mem_addr &= 0xFFFFF000;
182-
free_mem_addr += 0x1000;
183-
}
184-
/* Сохранить также физический адрес */
185-
if (phys_addr) *phys_addr = free_mem_addr;
186-
187-
kprint("kmalloc legacy: allocating ");
188-
char size_str[16] = "";
189-
hex_to_ascii(size, size_str);
190-
kprint(size_str);
191-
kprint(" bytes at ");
192-
get_freememaddr();
193-
kprint("\n");
194-
195-
u32 ret = free_mem_addr;
196-
free_mem_addr += size;
197-
return ret;
198-
}
199-
200168
void get_freememaddr() {
201169
char free_mem_addr_str[32] = "";
202170
hex_to_ascii(free_mem_addr, free_mem_addr_str);

src/kernel/libc/mem.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,10 @@ meminfo_t get_meminfo();
3535
void memory_copy(u8 *source, u8 *dest, int nbytes);
3636
void memory_set(u8 *dest, u8 val, u32 len);
3737
void get_freememaddr();
38-
u32 kmalloc(u32 size, int align, u32 *phys_addr);
3938

4039
// Новые функции
4140
void heap_init();
42-
void* kmalloc_new(u32 size);
41+
void* kmalloc(u32 size);
4342
void kfree(void* ptr);
4443
void kmemdump();
4544

0 commit comments

Comments
 (0)