Обновление системных функций
This commit is contained in:
parent
11cece913a
commit
d7d41481b8
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||||
|
|
|
@ -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') {
|
||||||
|
|
82
kernel/mod.c
82
kernel/mod.c
|
@ -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++;
|
||||||
}
|
}
|
||||||
|
|
37
kernel/sys.c
37
kernel/sys.c
|
@ -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) {}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
|
||||||
};
|
};
|
||||||
}
|
}
|
|
@ -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,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 };
|
||||||
|
|
|
@ -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,
|
||||||
|
};
|
||||||
}
|
}
|
|
@ -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,
|
||||||
|
};
|
||||||
}
|
}
|
Loading…
Reference in New Issue