Обновление системных функций

This commit is contained in:
Aren Elchinyan 2023-11-07 22:34:26 +03:00
parent 11cece913a
commit d7d41481b8
12 changed files with 151 additions and 80 deletions

View File

@ -7,6 +7,8 @@
* *
*/ */
#include <sys.h>
#ifndef MOD_H #ifndef MOD_H
#define MOD_H #define MOD_H
@ -14,8 +16,26 @@
// сейчас для прототипа это не так важно // сейчас для прототипа это не так важно
#define MOD_MAX 16 #define MOD_MAX 16
// Структуры соответствующие ELF заголовкам
typedef struct {
unsigned char e_ident[16];
uint16_t e_type;
uint16_t e_machine;
uint32_t e_version;
uint64_t e_entry;
uint64_t e_phoff;
uint64_t e_shoff;
uint32_t e_flags;
uint16_t e_ehsize;
uint16_t e_phentsize;
uint16_t e_phnum;
uint16_t e_shentsize;
uint16_t e_shnum;
uint16_t e_shstrndx;
} elf64_header_t;
void mod_init( ); void mod_init( );
void mod_list_show( ); void mod_list_show( );
void mod_find(char *name); module_info_t *mod_find(char *tag);
#endif // mod.h #endif // mod.h

View File

@ -34,6 +34,8 @@ typedef struct {
char *name; char *name;
char *message; char *message;
uint64_t type; uint64_t type;
uint64_t data_size;
void *data;
int64_t err_code; int64_t err_code;
uint64_t module_id; uint64_t module_id;
} module_info_t; } module_info_t;
@ -59,7 +61,18 @@ typedef struct {
typedef struct { typedef struct {
uint64_t offset; uint64_t offset;
module_info_t *info; module_info_t *info;
void (*fb_printf)(char *str, ...); void (*fb_printf)(char *str, ...); // Временная функция
framebuffer_t *(*alloc_framebuffer)( );
void (*free_framebuffer)(framebuffer_t *frame);
void (*exit)(int code);
int (*get_error)( );
sys_info_t *(*get_info)( );
module_info_t *(*get_module)(char *module_id);
uint64_t (*new_thread)(uint64_t func);
int (*delete_thread)(uint64_t thread_id);
time_t (*get_time)( );
} env_t; } env_t;
env_t sys_install(env_t module);
#endif // sys.h #endif // sys.h

View File

@ -1,3 +1,3 @@
#define VERSION_MAJOR 0 #define VERSION_MAJOR 0
#define VERSION_MINOR 1 #define VERSION_MINOR 1
#define VERSION_BUILD 438 #define VERSION_BUILD 502

View File

@ -123,7 +123,6 @@ void scroll_fb( ) {
// Вывод одного символа // Вывод одного символа
static void fb_putchar(char c) { static void fb_putchar(char c) {
pause( );
if (c == '\t') { if (c == '\t') {
pos_x += FONT_6X8_SLIM_CHAR_WIDTH * 4; pos_x += FONT_6X8_SLIM_CHAR_WIDTH * 4;
} else if (c == '\n') { } else if (c == '\n') {

View File

@ -13,47 +13,6 @@
#include <sys.h> #include <sys.h>
#include <tool.h> #include <tool.h>
// Структуры соответствующие ELF заголовкам
typedef struct {
unsigned char e_ident[16];
uint16_t e_type;
uint16_t e_machine;
uint32_t e_version;
uint64_t e_entry;
uint64_t e_phoff;
uint64_t e_shoff;
uint32_t e_flags;
uint16_t e_ehsize;
uint16_t e_phentsize;
uint16_t e_phnum;
uint16_t e_shentsize;
uint16_t e_shnum;
uint16_t e_shstrndx;
} elf64_header_t;
static env_t main_env;
void *bootpng_ptr;
uint64_t bootpng_size;
static void *elf_entry(void *module_bin) {
// Приводим заголовок ELF файла к типу elf64_header_t
elf64_header_t *elf_header = (elf64_header_t *)module_bin;
#if 0
LOG(" Класс: ELF64\n");
LOG(" Версия: %u\n", elf_header->e_ident[6]);
LOG(" ОС/ABI: %u\n", elf_header->e_ident[7]);
LOG(" Тип: %u\n", elf_header->e_type);
LOG(" Машина: %u\n", elf_header->e_machine);
LOG(" Версия: %u\n", elf_header->e_version);
LOG(" Точка входа: 0x%x\n", elf_header->e_entry);
#endif
// Возвращаем указатель на точку входа
return (void *)((uint64_t)elf_header->e_entry + (uint64_t)module_bin);
}
static volatile struct limine_module_request module_request = { static volatile struct limine_module_request module_request = {
.id = LIMINE_MODULE_REQUEST, .id = LIMINE_MODULE_REQUEST,
.revision = 0, .revision = 0,
@ -66,15 +25,39 @@ module_info_t module_list[MOD_MAX];
static char *graphics_module_message = "Графический модуль-объект"; static char *graphics_module_message = "Графический модуль-объект";
static char *other_module_message = "Неизвестный тип модуля"; static char *other_module_message = "Неизвестный тип модуля";
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;
// Возвращаем указатель на точку входа
return (void *)((uint64_t)elf_header->e_entry + (uint64_t)module_bin);
}
void mod_list_show( ) { void mod_list_show( ) {
for (uint64_t i = 0; i < modules_count; i++) { for (uint64_t i = 0; i < modules_count; i++) {
fb_printf("Имя: %s\n", module_list[i].name); fb_printf("Имя: %s\n", module_list[i].name);
fb_printf("Описание модуля: %s\n", module_list[i].message); fb_printf("Описание модуля: %s\n", module_list[i].message);
fb_printf("Тип модуля: %u\n", module_list[i].type); fb_printf("Тип модуля: %u\n", module_list[i].type);
fb_printf("Код ошибки модуля: %u\n", module_list[i].err_code); fb_printf("Код ошибки модуля: %u\n", module_list[i].err_code);
fb_printf("Размер данных: %u\n", module_list[i].data_size);
fb_printf("Адрес данных: 0x%x\n", module_list[i].data);
} }
} }
module_info_t *mod_find(char *tag) {
for (uint64_t i = 0; i < modules_count; i++) {
if (!tool_starts_with(module_list[i].name, tag)) {
return &module_list[i];
}
}
return (module_info_t *)NULL;
}
void mod_init( ) { void mod_init( ) {
module_response = module_request.response; module_response = module_request.response;
uint64_t module_count = module_response->module_count; uint64_t module_count = module_response->module_count;
@ -95,6 +78,8 @@ void mod_init( ) {
module_list[modules_count].message = other_module_message; module_list[modules_count].message = other_module_message;
if (tool_starts_with(module_ptr->cmdline, "[BOOTIMG]")) { if (tool_starts_with(module_ptr->cmdline, "[BOOTIMG]")) {
module_list[modules_count].data_size = module_ptr->size;
module_list[modules_count].data = module_ptr->address;
bootpng_ptr = module_ptr->address; bootpng_ptr = module_ptr->address;
bootpng_size = module_ptr->size; bootpng_size = module_ptr->size;
module_list[modules_count].type = 1; // Графика module_list[modules_count].type = 1; // Графика
@ -108,16 +93,29 @@ void mod_init( ) {
modules_count++; modules_count++;
continue; 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(module_ptr->address); (module_info_t(*)(env_t * env))
elf_entry((elf64_header_t *)module_ptr->address);
LOG("\t->Точка входа: 0x%x\n", module_init); LOG("\t->Точка входа: 0x%x\n", module_init);
main_env.offset = (uint64_t)module_ptr->address; main_env.offset = (uint64_t)module_ptr->address;
main_env.info = (module_info_t *)0; main_env.info = (module_info_t *)0;
sys_install(main_env);
main_env.fb_printf = &fb_printf; main_env.fb_printf = &fb_printf;
module_info_t ret = module_init(&main_env); module_info_t ret = module_init(&main_env);
module_list[modules_count].message = ret.message; module_list[modules_count].message = ret.message;
module_list[modules_count].data_size = ret.data_size;
if (ret.data_size != 0) {
module_list[modules_count].data =
(&(ret.data) + (uint64_t)module_ptr->address);
}
modules_count++; modules_count++;
} }

View File

@ -5,6 +5,8 @@
* Этот файл содержит имплементацию функций для управления системой * Этот файл содержит имплементацию функций для управления системой
*/ */
#include <fb.h>
#include <mod.h>
#include <stdint.h> #include <stdint.h>
#include <sys.h> #include <sys.h>
@ -12,40 +14,55 @@ module_info_t *current_module;
void sys_init( ) {} void sys_init( ) {}
framebuffer_t *sys_alloc_framebuffer( ) { static framebuffer_t *sys_alloc_framebuffer( ) {
return (framebuffer_t *)0; return (framebuffer_t *)0;
} }
void sys_free_framebuffer(framebuffer_t *frame) { static void sys_free_framebuffer(framebuffer_t *frame) {
frame->reserved = 0; frame->reserved = 0;
} }
void sys_exit(int code) { static void sys_exit(int code) {
current_module->err_code = code; current_module->err_code = code;
} }
int sys_get_error( ) { static int sys_get_error( ) {
return current_module->err_code; return current_module->err_code;
} }
sys_info_t *sys_get_info( ) { static sys_info_t *sys_get_info( ) {
return &(sys_info_t){ .reserved = 0 }; return &(sys_info_t){ .reserved = 0 };
} }
module_info_t *sys_get_module(uint64_t module_id) { static module_info_t *sys_get_module(char *module_id) {
return (module_info_t *)module_id; return (module_info_t *)mod_find(module_id);
} }
uint64_t sys_new_thread(uint64_t func) { static uint64_t sys_new_thread(uint64_t func) {
return func; return func;
} }
int sys_delete_thread(uint64_t thread_id) { static int sys_delete_thread(uint64_t thread_id) {
return thread_id; return thread_id;
} }
time_t sys_get_time( ) { static time_t sys_get_time( ) {
return (time_t){ .year = 2023, .month = 10, .day = 31, .second = 1 }; return (time_t){ .year = 2023, .month = 10, .day = 31, .second = 1 };
} }
env_t sys_install(env_t module) {
module.fb_printf = &fb_printf;
module.alloc_framebuffer = &sys_alloc_framebuffer;
module.free_framebuffer = &sys_free_framebuffer;
module.exit = &sys_exit;
module.get_error = &sys_get_error;
module.get_info = &sys_get_info;
module.get_module = &sys_get_module;
module.new_thread = &sys_new_thread;
module.delete_thread = &sys_delete_thread;
module.get_time = &sys_get_time;
return module;
}
// void sys_set_alarm(time_t time, func_t func) {} // void sys_set_alarm(time_t time, func_t func) {}

View File

@ -31,8 +31,11 @@ typedef struct {
typedef struct { typedef struct {
char *name; char *name;
char *message; char *message;
int err_code; uint64_t type;
uint64_t func_count; uint64_t data_size;
void *data;
int64_t err_code;
uint64_t module_id;
} module_info_t; } module_info_t;
typedef struct { typedef struct {
@ -56,14 +59,25 @@ typedef struct {
typedef struct { typedef struct {
uint64_t offset; uint64_t offset;
module_info_t *info; module_info_t *info;
void (*fb_printf)(char *str, ...); void (*fb_printf)(char *str, ...); // Временная функция
framebuffer_t *(*alloc_framebuffer)( );
void (*free_framebuffer)(framebuffer_t *frame);
void (*exit)(int code);
void (*get_error)( );
sys_info_t *(*get_info)( );
module_info_t *(*get_module)(char *module_id);
uint64_t (*new_thread)(uint64_t func);
int (*delete_thread)(uint64_t thread_id);
time_t (*get_time)( );
} env_t; } env_t;
extern module_info_t static_info; extern module_info_t static_info;
static void (*fb_printf)(char *str, ...); static void (*fb_printf)(char *str, ...);
static uint64_t offset;
static inline void init_env(env_t *loader_env) { static inline void init_env(env_t *loader_env) {
loader_env->info = (module_info_t *)&static_info + loader_env->offset; offset = loader_env->offset;
loader_env->info = (module_info_t *)&static_info + offset;
fb_printf = loader_env->fb_printf; fb_printf = loader_env->fb_printf;
} }

View File

@ -56,6 +56,5 @@ module_info_t init(env_t *env) {
.name = (char *)"CPUBENCH", .name = (char *)"CPUBENCH",
.message = (char *)"Дополнительная информация о процессоре", .message = (char *)"Дополнительная информация о процессоре",
.err_code = 0, .err_code = 0,
.func_count = 1
}; };
} }

View File

@ -6,8 +6,9 @@ static const char message[] = "Привет из модуля!";
module_info_t init(env_t *env) { module_info_t init(env_t *env) {
init_env(env); init_env(env);
fb_printf("[%s]\n", message); fb_printf("[%s]\n", message);
return (module_info_t){ .name = (char *)&name, return (module_info_t){
.message = (char *)&message, .name = (char *)&name,
.err_code = 2023, .message = (char *)&message,
.func_count = 1 }; .err_code = 2023,
};
} }

View File

@ -38,11 +38,11 @@ static void nosound( ) {
module_info_t init(env_t *env) { module_info_t init(env_t *env) {
init_env(env); init_env(env);
fb_printf("Программа инициализирована!\n"); fb_printf("Программа инициализирована!\n");
return (module_info_t){ .name = (char *)"Мелодия", return (module_info_t){
.message = .name = (char *)"Мелодия",
(char *)"Надеюсь скоро тут будет тетрис!", .message = (char *)"Надеюсь скоро тут будет тетрис!",
.err_code = 404, .err_code = 404,
.func_count = 1 }; };
// Массив с нотами // Массив с нотами
unsigned int tetris_notes[] = { 0 }; unsigned int tetris_notes[] = { 0 };

View File

@ -1,5 +1,10 @@
#include <system.h> #include <system.h>
typedef struct {
char *name;
uint16_t id;
} vendor_t;
static inline uint32_t inl(uint16_t port) { static inline uint32_t inl(uint16_t port) {
uint32_t data; uint32_t data;
asm volatile("inl %1, %0" : "=a"(data) : "Nd"(port)); asm volatile("inl %1, %0" : "=a"(data) : "Nd"(port));
@ -53,12 +58,15 @@ static void scan( ) {
for (uint32_t slot = 0; slot < 32; slot++) { for (uint32_t slot = 0; slot < 32; slot++) {
for (uint32_t function = 0; function < 8; function++) { for (uint32_t function = 0; function < 8; function++) {
uint16_t vendor = get_vendor_id(bus, slot, function); uint16_t vendor = get_vendor_id(bus, slot, function);
if (vendor == 0xFFFF) { continue; } if (vendor == 0xFFFF) { continue; }
uint16_t device_id = get_device_id(bus, slot, function); uint16_t device_id = get_device_id(bus, slot, function);
uint16_t class_id = get_class_id(bus, slot, function); uint16_t class_id = get_class_id(bus, slot, function);
fb_printf("[%u] vendor: %x, device: %x, class: %u\n", devices, fb_printf("[%u] vendor: 0x%x, device: 0x%x, class: %u\n",
vendor, device_id, class_id); devices, vendor, device_id, class_id);
devices++; devices++;
} }
} }
@ -68,8 +76,9 @@ static void scan( ) {
module_info_t init(env_t *env) { module_info_t init(env_t *env) {
init_env(env); init_env(env);
scan( ); scan( );
return (module_info_t){ .name = (char *)"[PCI]", return (module_info_t){
.message = (char *)"PCI драйвер", .name = (char *)"[PCI]",
.err_code = 0, .message = (char *)"PCI драйвер",
.func_count = 1 }; .err_code = 0,
};
} }

View File

@ -27,8 +27,9 @@ module_info_t init(env_t *env) {
if ((ecx >> 28) & 1) { env->fb_printf("AVX поддерживается!\n"); } if ((ecx >> 28) & 1) { env->fb_printf("AVX поддерживается!\n"); }
return (module_info_t){ .name = (char *)"SIMD", return (module_info_t){
.message = (char *)"SIMD инструкции", .name = (char *)"SIMD",
.err_code = 0, .message = (char *)"SIMD инструкции",
.func_count = 1 }; .err_code = 0,
};
} }