mirror of
https://github.com/0Nera/BMOSP.git
synced 2024-11-22 08:31:23 +03:00
Merge pull request 'Слияние веток' (#2) from feature into master
Reviewed-on: #2
This commit is contained in:
commit
82cec87a36
3
build.sh
3
build.sh
@ -1,6 +1,9 @@
|
||||
#!/bin/sh
|
||||
|
||||
dos2unix *.sh
|
||||
|
||||
cd modlib/lib/
|
||||
dos2unix build.sh
|
||||
chmod +x build.sh
|
||||
./build.sh
|
||||
cd ../..
|
||||
|
@ -28,9 +28,9 @@
|
||||
|
||||
- `-1 не удалось выделить память для буфера кадра`.
|
||||
|
||||
## fb_printf(char *str, ...)
|
||||
## log_printf(char *str, ...)
|
||||
|
||||
Форматированный вывод строки на экран используя функцию ядра fb_printf.
|
||||
Форматированный вывод строки на экран используя функцию ядра log_printf.
|
||||
|
||||
### Будет удалено в ближайших обновлениях
|
||||
|
||||
|
@ -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( )
|
||||
|
||||
|
@ -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
|
@ -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);
|
||||
|
@ -1,3 +1,3 @@
|
||||
#define VERSION_MAJOR 0
|
||||
#define VERSION_MINOR 2
|
||||
#define VERSION_BUILD 52
|
||||
#define VERSION_BUILD 57
|
||||
|
@ -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;
|
||||
@ -111,4 +112,5 @@ void arch_init( ) {
|
||||
pic_init( );
|
||||
idt_init( );
|
||||
cpu_init( );
|
||||
paging_init( );
|
||||
}
|
@ -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( ));
|
||||
}
|
@ -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;
|
||||
@ -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);
|
||||
@ -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) {
|
||||
@ -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]; }
|
||||
@ -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);
|
||||
@ -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));
|
||||
@ -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");
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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)( );
|
||||
@ -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;
|
||||
|
@ -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)( );
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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( ) {
|
||||
@ -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) {
|
||||
@ -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( );
|
||||
|
@ -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
|
||||
|
@ -2,15 +2,70 @@
|
||||
|
||||
static const char name[] = "[APP]Привет мир!";
|
||||
static const char message[] = "Привет из модуля!";
|
||||
static const char logo[] = "\n\n"
|
||||
"\t ,:;;;;:, \n"
|
||||
"\t :++******++: \n"
|
||||
"\t ;****+;;+****; \n"
|
||||
"\t :****;, ,;****, \n"
|
||||
"\t :****: :****: \n"
|
||||
"\t ,;****+;;+****; \n"
|
||||
"\t ,;+********+: \n"
|
||||
"\t ,:;****;:, \n"
|
||||
"\t :****, \n"
|
||||
"\t :****, \n"
|
||||
"\t :****, \n"
|
||||
"\t :****, \n"
|
||||
"\t ,:;****;:,, \n"
|
||||
"\t :*********+;:, \n"
|
||||
"\t :++;;+++****+;, \n"
|
||||
"\t ,:;****+: \n"
|
||||
"\t ,, ,,::,, :+****: \n"
|
||||
"\t ,++;;, ,;+****+;, ,+***+, \n"
|
||||
"\t ;****: ;********; :****: \n"
|
||||
"\t ;****, ;********+ :****: \n"
|
||||
"\t ,****; ,;+*****;, ,+***+, \n"
|
||||
"\t ;****;, ,::::, ,+****; \n"
|
||||
"\t ,:;+*****+;,, ,,;+*****+;:, \n"
|
||||
"\t ,:;+****++*****+;;;;;++****+++****+;:, \n"
|
||||
"\t ,,,::,,, ,:;+****+;:, :;+***********++;, ,:;+****+;:,,:;;;;;;:,, \n"
|
||||
"\t ,:+++****++;:,,:;+****+;:, ,,:;;;;;;;::, ,:;+****++*********+:, \n"
|
||||
"\t ,;+****++++****++****+;:, ,:;+****+;;;;+****+, \n"
|
||||
"\t ,+***+;:,,,,:;+****+;:, :****;, :+***+,\n"
|
||||
"\t ;***+: :+***; ;***+, :****:\n"
|
||||
"\t,+***; ;***+, ;****: ,;***+,\n"
|
||||
"\t +***+, ,+***+ ,+***+;:,,,:+****: \n"
|
||||
"\t :+***+:, ,:+***+: ,;+***********+: \n"
|
||||
"\t :+****++;;++****+, ,:;+++++++;:, \n"
|
||||
"\t ,:++********++:, ,,,,, \n"
|
||||
"\t ,::;;;;::, "
|
||||
"\n\n";
|
||||
static const char logo_synapseos[] = "\n\n"
|
||||
"\t\t :::::::: ::: ::: :::: ::: ::: ::::::::: "
|
||||
" :::::::: :::::::::: :::::::: ::::::::\n"
|
||||
"\t\t :+: :+: :+: :+: :+:+: :+: :+: :+: :+: :+: "
|
||||
" :+: :+: :+: :+: :+: :+: :+:\n"
|
||||
"\t\t +:+ +:+ +:+ :+:+:+ +:+ +:+ +:+ +:+ +:+ "
|
||||
" +:+ +:+ +:+ +:+ +:+\n"
|
||||
"\t\t +#++:++#++ +#++: +#+ +:+ +#+ +#++:++#++: +#++:++#+ "
|
||||
" +#++:++#++ +#++:++# +#+ +:+ +#++:++#++\n"
|
||||
"\t\t +#+ +#+ +#+ +#+#+# +#+ +#+ +#+ "
|
||||
" +#+ +#+ +#+ +#+ +#+\n"
|
||||
"\t\t#+# #+# #+# #+# #+#+# #+# #+# #+# "
|
||||
"#+# #+# #+# #+# #+# #+# #+#\n"
|
||||
"\t\t######## ### ### #### ### ### ### "
|
||||
"######## ########## ######## ########\n"
|
||||
"\n\t\t\t\tМы вернулись!\n\n";
|
||||
|
||||
static int app_main( ) {
|
||||
fb_printf("[%s]\n", message);
|
||||
log_printf("[%s]\n", message);
|
||||
return 2 + 2;
|
||||
}
|
||||
|
||||
module_info_t __attribute__((section(".minit"))) init(env_t *env) {
|
||||
init_env(env);
|
||||
fb_printf("[%s]\n", message);
|
||||
log_printf("[%s]\n", message);
|
||||
log_printf("%s\n", logo);
|
||||
log_printf("%s\n", logo_synapseos);
|
||||
return (module_info_t){ .name = (char *)&name,
|
||||
.message = (char *)&message,
|
||||
.type = 0,
|
||||
|
@ -2,7 +2,7 @@
|
||||
echo "Название: IMFS"
|
||||
echo "Лицензия: CC BY-NC 4.0"
|
||||
|
||||
CC="gcc"
|
||||
CC=${CC:-gcc}
|
||||
ARCH_FLAGS="-fno-stack-protector -ffreestanding -O0 -g -fPIC -static -nostdlib "
|
||||
|
||||
if [ -d "../../sdk" ]; then
|
||||
|
@ -123,14 +123,14 @@ void delete_folder(folder_t *folder) {
|
||||
}
|
||||
|
||||
void print_folder_contents(folder_t *folder, size_t depth) {
|
||||
for (size_t i = 0; i < depth; i++) { fb_printf("\t"); }
|
||||
fb_printf("- %s/\n", folder->name);
|
||||
for (size_t i = 0; i < depth; i++) { log_printf("\t"); }
|
||||
log_printf("- %s/\n", folder->name);
|
||||
|
||||
file_t *file = folder->files;
|
||||
|
||||
while (file != NULL) {
|
||||
for (size_t i = 0; i < depth + 1; i++) { fb_printf("\t"); }
|
||||
fb_printf("- %8s %4s | %8u килобайт\n", file->name, file->type, (file->size + 1024) / 1024);
|
||||
for (size_t i = 0; i < depth + 1; i++) { log_printf("\t"); }
|
||||
log_printf("- %8s %4s | %8u килобайт\n", file->name, file->type, (file->size + 1024) / 1024);
|
||||
file = file->next;
|
||||
}
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
echo "Название: IOS"
|
||||
echo "Лицензия: CC BY-NC 4.0"
|
||||
|
||||
CC="gcc"
|
||||
CC=${CC:-gcc}
|
||||
ARCH_FLAGS="-fno-stack-protector -ffreestanding -O0 -g -fPIC -static -nostdlib "
|
||||
|
||||
if [ -d "../../sdk" ]; then
|
||||
|
@ -20,7 +20,7 @@ void ios_main( ) {
|
||||
module_info_t *kbd_mod = get_module("[KEYBOARD]");
|
||||
|
||||
if (kbd_mod == NULL) {
|
||||
fb_printf("Клавиатура не найдена!\n");
|
||||
log_printf("Клавиатура не найдена!\n");
|
||||
delete_thread( );
|
||||
for (;;) { asm volatile("hlt"); }
|
||||
}
|
||||
@ -28,47 +28,47 @@ void ios_main( ) {
|
||||
getc = kbd_mod->get_func(2);
|
||||
|
||||
while (1) {
|
||||
fb_printf("Доступные программы:\n");
|
||||
for (uint64_t i = 0; i < app_count; i++) { fb_printf(" %2u. %s\n", i, app_list[i].name); }
|
||||
fb_printf(" %2u. Выход\n", app_count + 1);
|
||||
log_printf("Доступные программы:\n");
|
||||
for (uint64_t i = 0; i < app_count; i++) { log_printf(" %2u. %s\n", i, app_list[i].name); }
|
||||
log_printf(" %2u. Выход\n", app_count + 1);
|
||||
|
||||
fb_printf("[IOS]>");
|
||||
log_printf("[IOS]>");
|
||||
|
||||
char c = '\0';
|
||||
|
||||
do { c = getc( ); } while (!is_digit(c));
|
||||
|
||||
fb_printf(" %c\n", c);
|
||||
log_printf(" %c\n", c);
|
||||
|
||||
int select = char_to_digit(c);
|
||||
|
||||
if (select == app_count + 1) {
|
||||
fb_printf("Выход\n");
|
||||
log_printf("Выход\n");
|
||||
delete_thread( );
|
||||
for (;;) { asm volatile("hlt"); }
|
||||
}
|
||||
|
||||
if (select > app_count - 1) {
|
||||
fb_printf("Ошибка! %u не входит в список\n");
|
||||
log_printf("Ошибка! %u не входит в список\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
fb_printf("Запуск %s...\n", app_list[select].name);
|
||||
log_printf("Запуск %s...\n", app_list[select].name);
|
||||
int (*app)( ) = (int (*)( ))app_list[select].data;
|
||||
int ret = (*app)( );
|
||||
fb_printf("\nПриложение %s завершилось с кодом: %d\n", app_list[select].name, ret);
|
||||
log_printf("\nПриложение %s завершилось с кодом: %d\n", app_list[select].name, ret);
|
||||
}
|
||||
}
|
||||
|
||||
static void main( ) {
|
||||
fb_printf("IOS (input-output shell) - оболочка ввода-вывода\n");
|
||||
log_printf("IOS (input-output shell) - оболочка ввода-вывода\n");
|
||||
mod_count = alloc(sizeof(uint64_t));
|
||||
mod_list = mod_list_get(mod_count);
|
||||
|
||||
app_list = alloc((*mod_count) * sizeof(module_info_t));
|
||||
|
||||
if (app_list == NULL) {
|
||||
fb_printf("Ошибка выделения памяти для app_list!\n");
|
||||
log_printf("Ошибка выделения памяти для app_list!\n");
|
||||
delete_thread( );
|
||||
for (;;) { asm volatile("hlt"); }
|
||||
}
|
||||
@ -77,7 +77,7 @@ static void main( ) {
|
||||
|
||||
for (uint64_t i = 0; i < *mod_count; i++) {
|
||||
if (str_contains(mod_list[i].name, "[APP]")) {
|
||||
// fb_printf("%u. %s\n", app_count, mod_list[i].name);
|
||||
// log_printf("%u. %s\n", app_count, mod_list[i].name);
|
||||
app_list[app_count] = mod_list[i];
|
||||
app_count++;
|
||||
}
|
||||
@ -86,7 +86,7 @@ static void main( ) {
|
||||
free(mod_count);
|
||||
|
||||
if (app_count < 1) {
|
||||
fb_printf("Модулей-программ не обнаружено!\n");
|
||||
log_printf("Модулей-программ не обнаружено!\n");
|
||||
free(app_list);
|
||||
delete_thread( );
|
||||
} else {
|
||||
|
@ -3,7 +3,7 @@ echo "Название: PCI"
|
||||
echo "Лицензия: Публичное достояние"
|
||||
|
||||
|
||||
CC="gcc"
|
||||
CC=${CC:-gcc}
|
||||
ARCH_FLAGS="-fno-stack-protector -ffreestanding -O0 -g -fPIC -static -nostdlib "
|
||||
|
||||
if [ -d "../../sdk" ]; then
|
||||
|
@ -96,18 +96,18 @@ static inline void scan( ) {
|
||||
*/
|
||||
|
||||
char *name = find_vendor(vendor);
|
||||
fb_printf("[%4u] %4x [%10s], устройство: %x, %u.%u.%u | ", devices, vendor, name, device_id, bus, slot,
|
||||
function);
|
||||
fb_printf("%32s", get_class_name(class_id));
|
||||
log_printf("[%4u] %4x [%10s], устройство: %x, %u.%u.%u | ", devices, vendor, name, device_id, bus, slot,
|
||||
function);
|
||||
log_printf("%32s", get_class_name(class_id));
|
||||
|
||||
/*
|
||||
fb_printf(" | %8x : %8x", mem_addr_0, mem_lim_0);
|
||||
fb_printf(" | %8x : %8x", mem_addr_1, mem_lim_1);
|
||||
fb_printf(" | %8x : %8x", io_addr_0, io_lim_0);
|
||||
fb_printf(" | %8x : %8x", io_addr_1, io_lim_1);
|
||||
log_printf(" | %8x : %8x", mem_addr_0, mem_lim_0);
|
||||
log_printf(" | %8x : %8x", mem_addr_1, mem_lim_1);
|
||||
log_printf(" | %8x : %8x", io_addr_0, io_lim_0);
|
||||
log_printf(" | %8x : %8x", io_addr_1, io_lim_1);
|
||||
*/
|
||||
|
||||
fb_printf(" | %4x\n", status);
|
||||
log_printf(" | %4x\n", status);
|
||||
devices++;
|
||||
}
|
||||
}
|
||||
@ -120,11 +120,11 @@ module_info_t __attribute__((section(".minit"))) init(env_t *env) {
|
||||
module_info_t *pci_data = get_module("[PCI][ADAPTER]");
|
||||
|
||||
if (pci_data == NULL) {
|
||||
fb_printf("Адаптер PCI данных не найден!\n");
|
||||
log_printf("Адаптер PCI данных не найден!\n");
|
||||
num_vendors = 0;
|
||||
} else {
|
||||
num_vendors = pci_data->data_size - 1;
|
||||
fb_printf("Записей в базе PCI: %u\n", pci_data->data_size);
|
||||
log_printf("Записей в базе PCI: %u\n", pci_data->data_size);
|
||||
vendor_list = (vendor_t **)pci_data->data;
|
||||
}
|
||||
|
||||
|
@ -55,7 +55,7 @@ static vendor_t **parse_file(char *str, uint64_t num_vendors, uint64_t size) {
|
||||
static void print_vendors(uint64_t num_vendors, vendor_t **vendor_list) {
|
||||
for (uint64_t i = 0; i < num_vendors; i++) {
|
||||
vendor_t *vendor = vendor_list[i];
|
||||
fb_printf("ID: 0x%x, Name: %s\n", vendor->id, vendor->name);
|
||||
log_printf("ID: 0x%x, Name: %s\n", vendor->id, vendor->name);
|
||||
}
|
||||
}
|
||||
|
||||
@ -64,10 +64,10 @@ module_info_t __attribute__((section(".minit"))) init(env_t *env) {
|
||||
|
||||
module_info_t *pci_data = get_module("[PCI][DATA][VENDORS]");
|
||||
|
||||
if (pci_data == NULL) { fb_printf("База PCI не найдена!\n"); }
|
||||
if (pci_data == NULL) { log_printf("База PCI не найдена!\n"); }
|
||||
|
||||
uint64_t num_vendors = count_chars(pci_data->data, ';');
|
||||
fb_printf("Количество вендоров: %u\n", num_vendors);
|
||||
log_printf("Количество вендоров: %u\n", num_vendors);
|
||||
|
||||
vendor_t **vendor_list = parse_file(pci_data->data, num_vendors, pci_data->data_size);
|
||||
// print_vendors(num_vendors, vendor_list);
|
||||
|
@ -3,7 +3,7 @@ echo "Название: PS/2"
|
||||
echo "Лицензия: Публичное достояние"
|
||||
|
||||
|
||||
CC="gcc"
|
||||
CC=${CC:-gcc}
|
||||
ARCH_FLAGS="-fno-stack-protector -ffreestanding -O0 -g -fPIC -static -nostdlib "
|
||||
|
||||
if [ -d "../../sdk" ]; then
|
||||
|
@ -80,11 +80,11 @@ static void handler( ) {
|
||||
|
||||
switch (scancode) {
|
||||
case 0x01:
|
||||
fb_printf("ВЫХОД\n");
|
||||
log_printf("ВЫХОД\n");
|
||||
virt_exit( );
|
||||
break; // Клавиша "ESCAPE"
|
||||
case 0x4F: // Клавиша "END"
|
||||
fb_printf("END?\n");
|
||||
log_printf("END?\n");
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
|
@ -2,7 +2,7 @@
|
||||
echo "Название: SIMD"
|
||||
echo "Лицензия: Публичное достояние"
|
||||
|
||||
CC="gcc"
|
||||
CC=${CC:-gcc}
|
||||
ARCH_FLAGS="-fno-stack-protector -ffreestanding -O0 -g -fPIC -static -nostdlib "
|
||||
|
||||
if [ -d "../../sdk" ]; then
|
||||
|
@ -14,20 +14,20 @@ module_info_t __attribute__((section(".minit"))) init(env_t *env) {
|
||||
|
||||
if ((edx >> 0) & 1) {
|
||||
asm volatile("finit");
|
||||
fb_printf("FPU(x87) поддерживается!\n");
|
||||
log_printf("FPU(x87) поддерживается!\n");
|
||||
}
|
||||
|
||||
if ((edx >> 23) & 1) { fb_printf("MMX поддерживается!\n"); }
|
||||
if ((edx >> 23) & 1) { log_printf("MMX поддерживается!\n"); }
|
||||
|
||||
if ((edx >> 25) & 1) {
|
||||
fb_printf("SSE2 поддерживается!\n");
|
||||
fb_printf("Адрес региона fxsave 0x%x\n", &fxsave_region);
|
||||
log_printf("SSE2 поддерживается!\n");
|
||||
log_printf("Адрес региона fxsave 0x%x\n", &fxsave_region);
|
||||
asm volatile(" fxsave %0 " ::"m"(fxsave_region));
|
||||
uint32_t sse_version = (ecx >> 25) & 0x7;
|
||||
fb_printf("SSE%u включен\n", sse_version);
|
||||
log_printf("SSE%u включен\n", sse_version);
|
||||
}
|
||||
|
||||
if ((ecx >> 28) & 1) { fb_printf("AVX поддерживается!\n"); }
|
||||
if ((ecx >> 28) & 1) { log_printf("AVX поддерживается!\n"); }
|
||||
|
||||
return (module_info_t){ .name = (char *)"SIMD",
|
||||
.message = (char *)"SIMD инструкции",
|
||||
|
@ -2,7 +2,7 @@
|
||||
echo "Название: TGA"
|
||||
echo "Лицензия: Публичное достояние"
|
||||
|
||||
CC="gcc"
|
||||
CC=${CC:-gcc}
|
||||
ARCH_FLAGS="-fno-stack-protector -ffreestanding -O0 -g -fPIC -static -nostdlib "
|
||||
|
||||
if [ -d "../../sdk" ]; then
|
||||
|
@ -1,6 +1,6 @@
|
||||
#include <system.h>
|
||||
|
||||
#define TGA_ERR( ) fb_printf("Ошибка декодирования TGA на строчке: %u\n", __LINE__);
|
||||
#define TGA_ERR( ) log_printf("Ошибка декодирования TGA на строчке: %u\n", __LINE__);
|
||||
|
||||
typedef struct {
|
||||
unsigned char magic1; // должно быть нулевым
|
||||
|
@ -117,12 +117,14 @@ def create_iso(IMAGE_NAME):
|
||||
os.system(f"rm -f {IMAGE_NAME}.iso")
|
||||
os.system(f"rm -rf iso_root")
|
||||
os.system(f"mkdir -p iso_root")
|
||||
os.system(f"cp -v kernel.elf configs/limine.cfg limine/limine-bios.sys limine/limine-bios-cd.bin limine/limine-uefi-cd.bin iso_root/")
|
||||
os.system(f"cp -v kernel.elf configs/limine.cfg limine/limine-bios.sys limine/limine-bios-cd.bin" \
|
||||
" limine/limine-uefi-cd.bin iso_root/")
|
||||
os.system(f"mkdir -p iso_root/EFI/BOOT")
|
||||
shutil.copytree("modules/bin", "iso_root/mod")
|
||||
os.system(f"cp -v limine/BOOTX64.EFI iso_root/EFI/BOOT/")
|
||||
os.system(f"cp -v limine/BOOTIA32.EFI iso_root/EFI/BOOT/")
|
||||
os.system(f"xorriso -as mkisofs -b limine-bios-cd.bin -no-emul-boot -boot-load-size 4 -boot-info-table --efi-boot limine-uefi-cd.bin -efi-boot-part --efi-boot-image --protective-msdos-label iso_root -o {IMAGE_NAME}.iso")
|
||||
os.system(f"xorriso -as mkisofs -b limine-bios-cd.bin -no-emul-boot -boot-load-size 4 -boot-info-table"\
|
||||
f" --efi-boot limine-uefi-cd.bin -efi-boot-part --efi-boot-image --protective-msdos-label iso_root -o {IMAGE_NAME}.iso")
|
||||
os.system(f"./limine/limine bios-install {IMAGE_NAME}.iso")
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
Loading…
Reference in New Issue
Block a user