Skip to content

Commit f606d9e

Browse files
committed
update ktests functionality, edit color codes system in screen driver
1 parent e6a423c commit f606d9e

File tree

10 files changed

+145
-76
lines changed

10 files changed

+145
-76
lines changed

CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,15 @@
1+
commit e6a423c29ea27250dc937c5d326977797ddb82bf
2+
Author: Alexeev Bronislav <[email protected]>
3+
Date: Sat Aug 30 04:47:38 2025 +0700
4+
5+
add ktests directory
6+
7+
commit fbaa87a479d4d6403a1f503b01e768875bc417ea
8+
Author: Alexeev Bronislav <[email protected]>
9+
Date: Sat Aug 30 04:40:37 2025 +0700
10+
11+
update gallery
12+
113
commit 4fc8595e404e897a6b63cda5cff2b16d9114e1aa
214
Author: Alexeev Bronislav <[email protected]>
315
Date: Sat Aug 30 04:39:34 2025 +0700

gallery/image.png

-16.7 KB
Binary file not shown.

src/kernel/drivers/ata_pio.c

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,22 @@
22
* Kintsugi OS Drivers source code
33
* File: kernel/drivers/ata_pio.c
44
* Title: Драйвер ATA PIO
5-
* Description: Реализация драйвера для работы с жесткими дисками через PIO mode.
5+
* Description: Реализация драйвера для работы с жесткими дисками
6+
* через PIO mode. ATA PIO (Programmed input/output - программный ввод/вывод) -
7+
* это режим в интерфейсе ATA, который определяет скорость обмена данными
8+
* с винчестером. В этом режиме управлением считыванием данных с диска
9+
* занимается центральный процессор, что приводит к повышенной нагрузке на него.
10+
* ATA (AT Attachment) - интерфейс, используемый для подключения жёстких
11+
* дисков и оптических накопителей к компьютерам.
12+
* PIO (Programmed Input/Output) — режим программируемого ввода-вывода, который
13+
* определяет скорость обмена данными с жёстким диском. Существует несколько
14+
* режимов PIO, которые различаются максимальными скоростями пакетной передачи
15+
* данных. Например, для PIO mode 4 скорость обмена достигает 16,6 МБ/с.
16+
* В Kintsugi OS как можно увидеть из bootloader/diskload.asm используется LBA.
17+
* LBA (Logical Block Adressing) — линейная адресация через логический адрес
18+
* блока. Режим LBA использует линейную адресацию секторов, начиная с сектора
19+
* 1, головки 0, цилиндра 0 (LBA 0) и заканчивая последним физическим
20+
* сектором диска.
621
* ---------------------------------------------------------------------------*/
722

823
#include "ata_pio.h"
@@ -24,6 +39,7 @@ void ata_pio_init() {
2439
kprint("Initializing ATA PIO driver...\n");
2540

2641
for (int i = 0; i < 2; i++) {
42+
// Если все ОК, то при запуске в QEMU мы увидим мастер драйв и не увидим slave-драйв.
2743
u8 drive = (i == 0) ? ATA_MASTER : ATA_SLAVE;
2844

2945
// чекаем наличие устройства

src/kernel/drivers/ata_pio.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555
#define ATA_DISK_PATAPI 3
5656
#define ATA_DISK_SATAPI 4
5757

58-
// Структура для информации о диске
58+
/* Структура для информации о диске */
5959
typedef struct {
6060
u16 type;
6161
u16 signature;

src/kernel/drivers/screen.c

Lines changed: 9 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -31,33 +31,6 @@ int get_offset_col(int offset);
3131
* Если col, row отрицательные, то используем текущий оффсет
3232
*/
3333
void kprint_at(char* message, int col, int row, int color) {
34-
struct {
35-
int clrcode;
36-
int color;
37-
} colors[] = {
38-
// структура цветов, clrcode - код цвета для передачи и color - сам цвет
39-
{.clrcode = WHITE_ON_BLACK_CLR_CODE, .color = WHITE_ON_BLACK},
40-
{.clrcode = BLUE_ON_BLACK_CLR_CODE, .color = BLUE_ON_BLACK},
41-
{.clrcode = GREEN_ON_BLACK_CLR_CODE, .color = GREEN_ON_BLACK},
42-
{.clrcode = CYAN_ON_BLACK_CLR_CODE, .color = CYAN_ON_BLACK},
43-
{.clrcode = RED_ON_BLACK_CLR_CODE, .color = RED_ON_BLACK},
44-
{.clrcode = MAGENTA_ON_BLACK_CLR_CODE, .color = MAGENTA_ON_BLACK},
45-
{.clrcode = BROWN_ON_BLACK_CLR_CODE, .color = BROWN_ON_BLACK},
46-
{.clrcode = LGREY_ON_BLACK_CLR_CODE, .color = LGREY_ON_BLACK},
47-
{.clrcode = DGREY_ON_BLACK_CLR_CODE, .color = DGREY_ON_BLACK},
48-
{.clrcode = LBLUE_ON_BLACK_CLR_CODE, .color = LBLUE_ON_BLACK},
49-
{.clrcode = LGREEN_ON_BLACK_CLR_CODE, .color = LGREEN_ON_BLACK},
50-
{.clrcode = LCYAN_ON_BLACK_CLR_CODE, .color = LCYAN_ON_BLACK},
51-
{.clrcode = LRED_ON_BLACK_CLR_CODE, .color = LRED_ON_BLACK},
52-
{.clrcode = LMAGENTA_ON_BLACK_CLR_CODE, .color = LMAGENTA_ON_BLACK},
53-
{.clrcode = YELLOW_ON_BLACK_CLR_CODE, .color = YELLOW_ON_BLACK},
54-
{.clrcode = WHITE_ON_BLUE_CLR_CODE, .color = WHITE_ON_BLUE},
55-
{.clrcode = WHITE_ON_RED_CLR_CODE, .color = WHITE_ON_RED},
56-
{.clrcode = RED_ON_WHITE_CLR_CODE, .color = RED_ON_WHITE},
57-
{.clrcode = BLUE_ON_WHITE_CLR_CODE, .color = BLUE_ON_WHITE},
58-
};
59-
60-
const int colors_length = sizeof(colors) / sizeof(colors[0]);
6134

6235
/* Установка курсора и оффсета если если col, row отрицательные */
6336
int offset;
@@ -71,12 +44,7 @@ void kprint_at(char* message, int col, int row, int color) {
7144
/* "Прокрутка" сообщения и его вывод */
7245
int i = 0;
7346
while (message[i] != 0) {
74-
for (int j = 0; j < colors_length; ++j) {
75-
if (color == colors[j].clrcode) {
76-
offset = print_char(message[i++], col, row, colors[j].color);
77-
break;
78-
}
79-
}
47+
offset = print_char(message[i++], col, row, color);
8048

8149
/* Вычисление row/col для следующей итерации */
8250
row = get_offset_row(offset);
@@ -85,13 +53,13 @@ void kprint_at(char* message, int col, int row, int color) {
8553
}
8654

8755
void kprint(char* message) {
88-
// Вывод текста. Цвет по умолчанию - белый на черном (код 0)
89-
kprint_at(message, -1, -1, 0);
56+
// Вывод текста. Цвет по умолчанию - белый на черном
57+
kprint_at(message, -1, -1, WHITE_ON_BLACK);
9058
}
9159

9260
void kprintln(char* message) {
93-
// Вывод текста. Цвет по умолчанию - белый на черном (код 0)
94-
kprint_at(message, -1, -1, 0);
61+
// Вывод текста. Цвет по умолчанию - белый на черном
62+
kprint_at(message, -1, -1, WHITE_ON_BLACK);
9563
kprint("\n");
9664
}
9765

@@ -141,10 +109,10 @@ void panic_red_screen(char* title, char* description) {
141109

142110
set_cursor_offset(get_offset(0, 0));
143111

144-
kprint_colored("KINTSUGIOS KERNEL PANIC RED SCREEN\n\n", WHITE_ON_RED_CLR_CODE);
145-
kprint_colored(title, WHITE_ON_RED_CLR_CODE);
146-
kprint_colored("\n\n", WHITE_ON_RED_CLR_CODE);
147-
kprint_colored(description, WHITE_ON_RED_CLR_CODE);
112+
kprint_colored("KINTSUGIOS KERNEL PANIC RED SCREEN\n\n", WHITE_ON_RED);
113+
kprint_colored(title, WHITE_ON_RED);
114+
kprint_colored("\n\n", WHITE_ON_RED);
115+
kprint_colored(description, WHITE_ON_RED);
148116

149117
__asm__ volatile("hlt");
150118
}

src/kernel/drivers/screen.h

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
#define VIDEO_ADDRESS 0xb8000 // Видео-адрес
4141
#define MAX_ROWS 25 // Максимальное кол-во линий
4242
#define MAX_COLS 80 // Максимальное кол-во колонок
43-
#define WHITE_ON_BLACK 0x0F // HEX-код белого на черном
43+
#define WHITE_ON_BLACK 0x0f // HEX-код белого на черном
4444
#define WHITE_ON_BLUE 0x1f
4545
#define WHITE_ON_RED 0x4f
4646
#define BLUE_ON_WHITE 0x1f
@@ -61,29 +61,8 @@
6161
#define LRED_ON_BLACK 0x0C
6262
#define LMAGENTA_ON_BLACK 0x0D
6363
#define YELLOW_ON_BLACK 0x0E
64-
6564
#define RED_ON_WHITE 0xf4
6665

67-
// Цветовые коды
68-
#define WHITE_ON_BLACK_CLR_CODE 0
69-
#define BLUE_ON_BLACK_CLR_CODE 1
70-
#define GREEN_ON_BLACK_CLR_CODE 2
71-
#define CYAN_ON_BLACK_CLR_CODE 3
72-
#define RED_ON_BLACK_CLR_CODE 4
73-
#define MAGENTA_ON_BLACK_CLR_CODE 5
74-
#define BROWN_ON_BLACK_CLR_CODE 6
75-
#define LGREY_ON_BLACK_CLR_CODE 7
76-
#define DGREY_ON_BLACK_CLR_CODE 8
77-
#define LBLUE_ON_BLACK_CLR_CODE 9
78-
#define LGREEN_ON_BLACK_CLR_CODE 10
79-
#define LCYAN_ON_BLACK_CLR_CODE 11
80-
#define LRED_ON_BLACK_CLR_CODE 12
81-
#define LMAGENTA_ON_BLACK_CLR_CODE 13
82-
#define YELLOW_ON_BLACK_CLR_CODE 14
83-
#define WHITE_ON_BLUE_CLR_CODE 15
84-
#define WHITE_ON_RED_CLR_CODE 16
85-
#define RED_ON_WHITE_CLR_CODE 17
86-
#define BLUE_ON_WHITE_CLR_CODE 18
8766

8867
/* Порты ввода/вывода экрана */
8968
#define REG_SCREEN_CTRL 0x3d4

src/kernel/kernel/kernel.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,14 @@ void kmain() {
2525
clear_screen();
2626

2727
isr_install();
28-
kprint("ISR Installed\n");
2928
irq_install();
30-
kprint("IRQ Installed\n");
29+
kprint("IRQ&ISR Installed\n");
3130

3231
initialise_paging();
3332
heap_init();
3433

3534
detect_cpu();
36-
kprint("CPU detected\n");
3735
detect_memory();
38-
kprint("Memory Detected\n");
3936

4037
ata_pio_init();
4138

@@ -44,6 +41,9 @@ void kmain() {
4441

4542
// Уведомление о старте оболочки командной строки
4643
kprint("\nKeramika Shell " "Type HELP to view commands\n\n!#> ");
44+
45+
shell_cursor_offset = get_cursor_offset();
46+
shell_prompt_offset = shell_cursor_offset;
4747
}
4848

4949
char** get_args(char* input) {
@@ -56,7 +56,7 @@ char** get_args(char* input) {
5656

5757
if (arg_counter + 1 > MAX_ARGS + 1) {
5858
printf_colored("Error when parsing args: %d args exceed the limit %d\n",
59-
RED_ON_BLACK_CLR_CODE,
59+
RED_ON_BLACK,
6060
arg_counter + 1,
6161
MAX_ARGS + 1);
6262
break;
@@ -123,7 +123,7 @@ void user_input(char* input) {
123123
}
124124

125125
if (executed == 0 && strcmp(input, "") != 0) {
126-
printf_colored("Invalid command: %s", RED_ON_BLACK_CLR_CODE, input);
126+
printf_colored("Invalid command: %s", RED_ON_BLACK, input);
127127
}
128128

129129
// Вывод строки шелла

src/kernel/kernel/utils.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,10 @@ void shutdown_qemu(char** args) {
8686

8787
void halt_cpu(char** args) {
8888
halted_cpu_screen_clear();
89-
printf_colored("Kintsugi OS %s\n\n", BLUE_ON_WHITE_CLR_CODE, VERSION);
90-
kprint_colored("Halted CPU Blue Screen\n", BLUE_ON_WHITE_CLR_CODE);
91-
kprint_colored("CPU is halted.\n\n", BLUE_ON_WHITE_CLR_CODE);
92-
kprint_colored("__asm__ volatile(\"hlt\")", BLUE_ON_WHITE_CLR_CODE);
89+
printf_colored("Kintsugi OS %s\n\n", BLUE_ON_WHITE, VERSION);
90+
kprint_colored("Halted CPU Blue Screen\n", BLUE_ON_WHITE);
91+
kprint_colored("CPU is halted.\n\n", BLUE_ON_WHITE);
92+
kprint_colored("__asm__ volatile(\"hlt\")", BLUE_ON_WHITE);
9393

9494
__asm__ volatile("hlt");
9595
}
@@ -103,7 +103,7 @@ void sysinfo_command() {
103103
info->free_memory / (1024 * 1024),
104104
info->used_memory / (1024 * 1024));
105105
printf("Kernel memory: %d KB\n", info->kernel_memory / 1024);
106-
printf("Heap size: %d KB\n", info->heap_size / 1024);
106+
printf("Heap size: %d KB", info->heap_size / 1024);
107107
}
108108

109109
void info_command_shell(char** args) {

src/kernel/ktests/ktests.c

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
#include "ktests.h"
2+
#include "../kklibc/stdio.h"
3+
4+
static int tests_passed = 0;
5+
static int tests_failed = 0;
6+
7+
int execute_test_case(test_case_t test_case) {
8+
printf("Running test: %s... ", test_case.test_name);
9+
10+
int result = test_case.handler();
11+
12+
if (result == 0) {
13+
tests_passed++;
14+
printf_colored("PASS\n", GREEN_ON_BLACK);
15+
} else {
16+
tests_failed--;
17+
printf_colored("ERR\n", RED_ON_BLACK);
18+
}
19+
}
20+
21+
void run_test_suite(test_suite_t test_suite) {
22+
printf("\n=== Running %s tests ===\n", test_suite.test_suite_name);
23+
24+
tests_passed = 0;
25+
tests_failed = 0;
26+
27+
test_case_t *tests = test_suite.cases;
28+
29+
for (int i = 0; i < sizeof(tests) / sizeof(tests[-1]); ++i) {
30+
// printf("Running test: %s... ", tests[i].test_name);
31+
int result = tests[i].handler();
32+
33+
if (result == 0) {
34+
tests_passed++;
35+
} else {
36+
tests_failed++;
37+
}
38+
}
39+
40+
if (tests_failed == 0) {
41+
kprint_colored("All tests passed!\n", GREEN_ON_BLACK);
42+
} else if (tests_failed > 0 && tests_passed > 0) {
43+
kprint_colored("Some tests failed!\n", YELLOW_ON_BLACK);
44+
} else {
45+
kprint_colored("All tests failed!\n", RED_ON_BLACK);
46+
}
47+
}
48+
49+
// void run_all_tests() {
50+
// kprint("\nStarting Kintsugi OS Tests...\n");
51+
52+
// printf("\n=== Test Results ===\n");
53+
// printf("Passed: %d, Failed: %d\n", tests_passed, tests_failed);
54+
55+
// if (tests_failed == 0) {
56+
// kprint("All tests passed! ✅\n");
57+
// } else {
58+
// printf("Some tests failed! ❌\n");
59+
// }
60+
// }

src/kernel/ktests/ktests.h

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#ifndef KTESTS_KTESTS_H
2+
#define KTESTS_KTESTS_H
3+
4+
#include "../kklibc/ctypes.h"
5+
6+
#define TEST_ASSERT(condition, message) \
7+
do { \
8+
if (!(condition)) { \
9+
printf("TEST FAILED: %s (%s:%d)\n", message, __FILE__, __LINE__); \
10+
return -1; \
11+
} \
12+
} while (0)
13+
14+
#define TEST_PASS() \
15+
do { \
16+
printf("TEST PASSED\n"); \
17+
return 0; \
18+
} while (0)
19+
20+
typedef struct {
21+
char* test_name;
22+
int (*handler)();
23+
} test_case_t;
24+
25+
typedef struct {
26+
char* test_suite_name;
27+
test_case_t cases[];
28+
} test_suite_t;
29+
30+
int execute_test_case(test_case_t test_case);
31+
32+
void execute_test_suite(test_suite_t test_suite);
33+
34+
#endif

0 commit comments

Comments
 (0)