Skip to content

Commit

Permalink
Merge pull request 'Слияние веток' (#2) from feature into master
Browse files Browse the repository at this point in the history
  • Loading branch information
Арен Елчинян committed Mar 4, 2024
2 parents ed3af8d + e7233a7 commit 82cec87
Show file tree
Hide file tree
Showing 32 changed files with 201 additions and 93 deletions.
3 changes: 3 additions & 0 deletions build.sh
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
#!/bin/sh

dos2unix *.sh

cd modlib/lib/
dos2unix build.sh
chmod +x build.sh
./build.sh
cd ../..
Expand Down
4 changes: 2 additions & 2 deletions docs/API.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@

- `-1 не удалось выделить память для буфера кадра`.

## fb_printf(char *str, ...)
## log_printf(char *str, ...)

Форматированный вывод строки на экран используя функцию ядра fb_printf.
Форматированный вывод строки на экран используя функцию ядра log_printf.

### Будет удалено в ближайших обновлениях

Expand Down
10 changes: 0 additions & 10 deletions include/arch.h
Original file line number Diff line number Diff line change
Expand Up @@ -105,16 +105,6 @@ static inline void io_wait( ) {
outb(0x80, 0);
}

static inline void print_stack_trace( ) {
uint64_t *rsp;
asm volatile("movq %%rsp, %0" : "=g"(rsp));

while (rsp) {
// fb_printf("%x\n", *rsp);
rsp = (uint64_t *)(*rsp);
}
}

#define GET_TICK_BIG arch_get_tick_b( )
#define GET_TICK_lOW arch_get_tick_l( )

Expand Down
4 changes: 2 additions & 2 deletions include/fb.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ void fb_set_text_color(uint32_t color);
uint32_t fb_get_text_color( );
void fb_init( );
void fb_print_buf(size_t x, size_t y, size_t h, size_t w, uint32_t *buf);
void fb_printf(char *str, ...);
void fb_printf_at(size_t x, size_t y, char *str, ...);
void log_printf(char *str, ...);
void log_printf_at(size_t x, size_t y, char *str, ...);
void fb_print_bits(size_t x, size_t y, uint8_t num);

#endif // fb.h
2 changes: 1 addition & 1 deletion include/sys.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ typedef struct {

typedef struct {
uint64_t offset;
void (*fb_printf)(char *str, ...); // Временная функция
void (*log_printf)(char *str, ...); // Временная функция
framebuffer_t (*alloc_framebuffer)( );
void (*free_framebuffer)(framebuffer_t *frame);
void *(*alloc)(uint64_t size);
Expand Down
2 changes: 1 addition & 1 deletion include/version.h
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
#define VERSION_MAJOR 0
#define VERSION_MINOR 2
#define VERSION_BUILD 52
#define VERSION_BUILD 57
2 changes: 2 additions & 0 deletions kernel/cpu/arch.c
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ static struct gdt_desc gdt_descs[] = { { 0 },
.base_hi = 0x00 } };

extern void load_gdt(uint64_t gdtr);
void paging_init( );

uint64_t rdtsc( ) {
unsigned int lo, hi;
Expand Down Expand Up @@ -111,4 +112,5 @@ void arch_init( ) {
pic_init( );
idt_init( );
cpu_init( );
paging_init( );
}
49 changes: 49 additions & 0 deletions kernel/cpu/paging.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,52 @@
*/

#include <arch.h>
#include <log.h>

typedef struct {
uint64_t present : 1;
uint64_t rw : 1;
uint64_t user : 1;
uint64_t pwt : 1;
uint64_t pcd : 1;
uint64_t accessed : 1;
uint64_t dirty : 1;
uint64_t pat : 1;
uint64_t global : 1;
uint64_t ignored : 3;
uint64_t addr : 40;
uint64_t reserved : 11;
uint64_t no_execute : 1;
} page_table_entry_t;

// Получение адреса CR3
static inline uint64_t get_cr3( ) {
uint64_t cr3;
asm volatile("mov %%cr3, %0" : "=r"(cr3));
return cr3;
}

// Вывод флагов
void print_flags(page_table_entry_t entry) {
LOG("\tФлаги: [%c%c%c%c%c%c%c]\n", entry.present ? 'P' : '-', entry.rw ? 'W' : 'R', entry.user ? 'U' : '-',
entry.pwt ? 'T' : '-', entry.pcd ? 'D' : '-', entry.accessed ? 'A' : '-', entry.no_execute ? 'X' : 'E');
}

// Вывод структуры таблицы страниц, начиная с CR3
void print_page_structure(uint64_t cr3) {
page_table_entry_t* pml4 = (page_table_entry_t*)(cr3 & ~0xFFF); // Получаем адрес PML4
LOG("PML4 Address: 0x%x\n", pml4);
for (uint64_t i = 0; i < 512; i++) {
if (pml4[i].present) {
LOG("PML4[%d] - present\n", i);

print_flags(pml4[i]);
LOG("Адрес: 0x%x\n", pml4[i].addr);
}
}
}

void paging_init( ) {
LOG("Paging...\n");
print_page_structure(get_cr3( ));
}
9 changes: 8 additions & 1 deletion kernel/mod.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ static env_t main_env;
void *bootpng_ptr;
uint64_t bootpng_size;

// Получение адреса точки входа
static void *elf_entry(elf64_header_t *module_bin) {
// Приводим заголовок ELF файла к типу elf64_header_t
elf64_header_t *elf_header = (elf64_header_t *)module_bin;
Expand All @@ -44,6 +45,7 @@ static void *elf_entry(elf64_header_t *module_bin) {
return (void *)((uint64_t)elf_header->e_entry + (uint64_t)module_bin);
}

// Вывод списка модулей в отладчик
void mod_list_show( ) {
for (uint64_t i = 0; i < modules_count; i++) {
LOG("Имя: %s\n", module_list[i].name);
Expand All @@ -58,6 +60,7 @@ void mod_list_show( ) {
}
}

// Запуск модулей имеющих дополнительную точку входа
void mod_after_init( ) {
for (uint64_t i = 0; i < modules_count; i++) {
if (module_list[i].after_init != 0) {
Expand All @@ -67,11 +70,13 @@ void mod_after_init( ) {
}
}

// Запуск модулей имеющих дополнительную точку входа
module_info_t *mod_list_get(uint64_t *count) {
*count = modules_count;
return module_list;
}

// Поиск модуля по тегу
module_info_t *mod_find(char *tag) {
for (uint64_t i = 0; i < modules_count; i++) {
if (tool_str_contains(module_list[i].name, tag)) { return &module_list[i]; }
Expand Down Expand Up @@ -128,7 +133,7 @@ void mod_init( ) {
continue;
}

module_info_t (*module_init)(env_t * env) =
module_info_t (*module_init)(env_t *env) =
(module_info_t(*)(env_t * env)) elf_entry((elf64_header_t *)module_ptr->address);

// LOG("\t->Точка входа: 0x%x\n", module_init);
Expand Down Expand Up @@ -168,6 +173,7 @@ void mod_init( ) {
LOG("Модулей обработано: %u\n", modules_count);
}

// Добавление модуля
void mod_add(module_info_t module) {
if (modules_count == 0) {
module_list = (module_info_t *)mem_alloc(sizeof(module_info_t));
Expand All @@ -192,6 +198,7 @@ void mod_add(module_info_t module) {
modules_count++;
}

// Удаление модуля
void mod_del(module_info_t *module) {
if (modules_count == 0) {
LOG("Модуль не найден\n");
Expand Down
2 changes: 1 addition & 1 deletion kernel/sys.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ static module_info_t *sys_get_module(char *module_id) {
}

env_t *sys_install(env_t *module) {
module->fb_printf = &log_printf;
module->log_printf = &log_printf;
module->alloc_framebuffer = &sys_alloc_framebuffer;
module->free_framebuffer = &sys_free_framebuffer;
module->alloc = &mem_alloc;
Expand Down
4 changes: 2 additions & 2 deletions modlib/lib/build.sh
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#/bin/sh
CC="gcc"
AR="ar"
CC=${CC:-gcc}
AR=${AR:-ar}
ARCH_FLAGS="-fno-stack-protector -ffreestanding -O0 -g -fPIC -static -nostdlib "

mkdir -p bin
Expand Down
4 changes: 2 additions & 2 deletions modlib/lib/system.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

void *(*alloc)(uint64_t size);
void (*free)(void *ptr);
void (*fb_printf)(char *str, ...);
void (*log_printf)(char *str, ...);
module_info_t *(*get_module)(char *module_id);
module_info_t *(*mod_list_get)(uint64_t *count);
framebuffer_t (*alloc_framebuffer)( );
Expand All @@ -26,7 +26,7 @@ uint64_t offset;

void init_env(env_t *loader_env) {
offset = loader_env->offset;
fb_printf = loader_env->fb_printf;
log_printf = loader_env->log_printf;
alloc = loader_env->alloc;
free = loader_env->free;
get_module = loader_env->get_module;
Expand Down
2 changes: 1 addition & 1 deletion modlib/system.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

extern void *(*alloc)(uint64_t size);
extern void (*free)(void *ptr);
extern void (*fb_printf)(char *str, ...);
extern void (*log_printf)(char *str, ...);
extern module_info_t *(*get_module)(char *module_id);
extern module_info_t *(*mod_list_get)(uint64_t *count);
extern framebuffer_t (*alloc_framebuffer)( );
Expand Down
2 changes: 1 addition & 1 deletion modlib/types.h
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ typedef struct {

typedef struct {
uint64_t offset;
void (*fb_printf)(char *str, ...); // Временная функция
void (*log_printf)(char *str, ...); // Временная функция
framebuffer_t (*alloc_framebuffer)( );
void (*free_framebuffer)(framebuffer_t *frame);
void *(*alloc)(uint64_t size);
Expand Down
2 changes: 1 addition & 1 deletion modules/cpubench/build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
echo "Название: CPUBENCH"
echo "Лицензия: Публичное достояние"

CC="gcc"
CC=${CC:-gcc}
ARCH_FLAGS="-fno-stack-protector -ffreestanding -O0 -g -fPIC -static -nostdlib "

if [ -d "../../sdk" ]; then
Expand Down
34 changes: 17 additions & 17 deletions modules/cpubench/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,33 +10,33 @@ static inline void L1_cache_size( ) {
uint32_t eax, ebx, ecx, edx;
cpuid(0x80000006, &eax, &ebx, &ecx, &edx);
if ((edx & 0xFF) == 0) {
fb_printf("L1 кэш недоступен\n");
log_printf("L1 кэш недоступен\n");
return;
}
fb_printf("L1: Размер строки: %u B, Тип ассоциации: %u, Размер кэша: %u КБ\n", ecx & 0xFF, (ecx >> 12) & 0x07,
(ecx >> 16) & 0xFFff);
log_printf("L1: Размер строки: %u B, Тип ассоциации: %u, Размер кэша: %u КБ\n", ecx & 0xFF, (ecx >> 12) & 0x07,
(ecx >> 16) & 0xFFff);
}

static inline void L2_cache_size( ) {
uint32_t eax, ebx, ecx, edx;
cpuid(0x80000006, &eax, &ebx, &ecx, &edx);
if ((edx & 0xFF) == 0) {
fb_printf("L2 кэш недоступен\n");
log_printf("L2 кэш недоступен\n");
return;
}
fb_printf("L2: Размер строки: %u B, Тип ассоциации: %u, Размер кэша: %u КБ\n", ecx & 0xFF, (ecx >> 12) & 0x0F,
(ecx >> 16) & 0xFFFF);
log_printf("L2: Размер строки: %u B, Тип ассоциации: %u, Размер кэша: %u КБ\n", ecx & 0xFF, (ecx >> 12) & 0x0F,
(ecx >> 16) & 0xFFFF);
}

static inline void L3_cache_size( ) {
uint32_t eax, ebx, ecx, edx;
cpuid(0x80000006, &eax, &ebx, &ecx, &edx);
if ((edx & 0xFF) == 0) {
fb_printf("L3 кэш недоступен\n");
log_printf("L3 кэш недоступен\n");
return;
}
fb_printf("L3: Размер строки: %u B, Тип ассоциации: %u, Размер кэша: %u КБ\n", edx & 0xFF, (edx >> 12) & 0x0F,
(edx >> 16) & 0xFFFF);
log_printf("L3: Размер строки: %u B, Тип ассоциации: %u, Размер кэша: %u КБ\n", edx & 0xFF, (edx >> 12) & 0x0F,
(edx >> 16) & 0xFFFF);
}

static void cpu_info( ) {
Expand All @@ -49,12 +49,12 @@ static void cpu_info( ) {
uint8_t node_id = ecx & 0xFF;
uint8_t nodes_per_processor = ((ecx >> 8) & 3) + 1;

fb_printf("Топология процессора:\n");
fb_printf(" Идентификатор APIC: %u\n", apic_id);
fb_printf(" Идентификатор вычислительной единицы: %u\n", compute_unit_id);
fb_printf(" Ядра на вычислительную единицу: %u\n", cores_per_compute_unit);
fb_printf(" Идентификатор узла: %u\n", node_id);
fb_printf(" Узлы на процессор: %u\n", nodes_per_processor);
log_printf("Топология процессора:\n");
log_printf(" Идентификатор APIC: %u\n", apic_id);
log_printf(" Идентификатор вычислительной единицы: %u\n", compute_unit_id);
log_printf(" Ядра на вычислительную единицу: %u\n", cores_per_compute_unit);
log_printf(" Идентификатор узла: %u\n", node_id);
log_printf(" Узлы на процессор: %u\n", nodes_per_processor);
}

module_info_t __attribute__((section(".minit"))) init(env_t *env) {
Expand All @@ -65,9 +65,9 @@ module_info_t __attribute__((section(".minit"))) init(env_t *env) {
cpuid(1, &eax, &ebx, &ecx, &edx);

if (ecx & (1 << 31)) {
fb_printf("Запуск на эмуляторе\n");
log_printf("Запуск на эмуляторе\n");
} else {
fb_printf("Запуск на физическом процессоре\n");
log_printf("Запуск на физическом процессоре\n");
}

L1_cache_size( );
Expand Down
2 changes: 1 addition & 1 deletion modules/helloworld/build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
echo "Название: Hello world"
echo "Лицензия: Публичное достояние"

CC="gcc"
CC=${CC:-gcc}
ARCH_FLAGS="-fno-stack-protector -ffreestanding -O0 -g -fPIC -static -nostdlib "

if [ -d "../../sdk" ]; then
Expand Down
Loading

0 comments on commit 82cec87

Please sign in to comment.