mirror of https://github.com/0Nera/BMOSP.git
Модули теперь используют статичную библиотеку
This commit is contained in:
parent
99b04b5481
commit
e0d42d991c
5
build.sh
5
build.sh
|
@ -1,5 +1,10 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
|
cd modlib/lib/
|
||||||
|
chmod +x build.sh
|
||||||
|
./build.sh
|
||||||
|
cd ../..
|
||||||
|
|
||||||
cd modules/
|
cd modules/
|
||||||
mkdir -p bin
|
mkdir -p bin
|
||||||
dos2unix */*.sh
|
dos2unix */*.sh
|
||||||
|
|
|
@ -40,4 +40,7 @@ TERM_WALLPAPER=boot:///mod/boot.jpg
|
||||||
MODULE_CMDLINE=[MOD]tga.ko
|
MODULE_CMDLINE=[MOD]tga.ko
|
||||||
|
|
||||||
MODULE_PATH=boot:///mod/imfs.ko
|
MODULE_PATH=boot:///mod/imfs.ko
|
||||||
MODULE_CMDLINE=[MOD]imfs.ko
|
MODULE_CMDLINE=[MOD]imfs.ko
|
||||||
|
|
||||||
|
MODULE_PATH=boot:///mod/hello.ko
|
||||||
|
MODULE_CMDLINE=[MOD]hello.ko
|
|
@ -0,0 +1 @@
|
||||||
|
libmod.a
|
|
@ -0,0 +1,17 @@
|
||||||
|
#/bin/sh
|
||||||
|
|
||||||
|
CC="gcc"
|
||||||
|
AR="ar"
|
||||||
|
ARCH_FLAGS="-ffreestanding -O0 -g -fPIC -static -nostdlib "
|
||||||
|
|
||||||
|
if [ -d "../../sdk" ]; then
|
||||||
|
CC="../../sdk/bin/x86_64-elf-gcc"
|
||||||
|
AR="../../sdk/bin/x86_64-elf-ar"
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p bin
|
||||||
|
|
||||||
|
$CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c system.c -o bin/system.o
|
||||||
|
$CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c tool.c -o bin/tool.o
|
||||||
|
$AR -rcs ../../modlib/lib/libmod.a ../../modlib/lib/bin/system.o ../../modlib/lib/bin/tool.o
|
||||||
|
ranlib ../../modlib/lib/libmod.a
|
|
@ -1,18 +0,0 @@
|
||||||
/**
|
|
||||||
* modstd.c
|
|
||||||
* Стандартная библиотека модулей
|
|
||||||
*
|
|
||||||
* Вспомогательные функции для работы с модулями
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <modstd.h>
|
|
||||||
|
|
||||||
int m_strcmp(const char *s1, const char *s2) {
|
|
||||||
while (*s1 == *s2) {
|
|
||||||
if (*s1 == '\0') { return 0; }
|
|
||||||
s1++;
|
|
||||||
s2++;
|
|
||||||
}
|
|
||||||
return *s1 - *s2;
|
|
||||||
}
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
/**
|
||||||
|
* system.c
|
||||||
|
* Системные вызовы модулей
|
||||||
|
*
|
||||||
|
* Основные функции для работы с функцияи системы
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <modstd.h>
|
||||||
|
#include <system.h>
|
||||||
|
|
||||||
|
void *(*alloc)(uint64_t size);
|
||||||
|
void (*free)(void *ptr);
|
||||||
|
void (*fb_printf)(char *str, ...);
|
||||||
|
module_info_t *(*get_module)(char *module_id);
|
||||||
|
framebuffer_t (*alloc_framebuffer)( );
|
||||||
|
void (*free_framebuffer)(framebuffer_t *frame);
|
||||||
|
void (*exit)(int code);
|
||||||
|
int (*get_error)( );
|
||||||
|
sys_info_t *(*get_info)( );
|
||||||
|
uint64_t (*new_thread)(uint64_t func);
|
||||||
|
int (*delete_thread)(uint64_t thread_id);
|
||||||
|
time_t (*get_time)( );
|
||||||
|
uint64_t offset;
|
||||||
|
|
||||||
|
void init_env(env_t *loader_env) {
|
||||||
|
offset = loader_env->offset;
|
||||||
|
fb_printf = loader_env->fb_printf;
|
||||||
|
alloc = loader_env->alloc;
|
||||||
|
free = loader_env->free;
|
||||||
|
get_module = loader_env->get_module;
|
||||||
|
alloc_framebuffer = loader_env->alloc_framebuffer;
|
||||||
|
free_framebuffer = loader_env->free_framebuffer;
|
||||||
|
exit = loader_env->exit;
|
||||||
|
get_error = loader_env->get_error;
|
||||||
|
get_info = loader_env->get_info;
|
||||||
|
new_thread = loader_env->new_thread;
|
||||||
|
delete_thread = loader_env->delete_thread;
|
||||||
|
get_time = loader_env->get_time;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *realloc(void *addr, size_t size) {
|
||||||
|
if (size == 0) {
|
||||||
|
free(addr);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (addr == NULL) { return alloc(size); }
|
||||||
|
|
||||||
|
void *new_addr = alloc(size);
|
||||||
|
|
||||||
|
if (new_addr == NULL) { return NULL; }
|
||||||
|
|
||||||
|
memcpy(new_addr, addr, size);
|
||||||
|
free(addr);
|
||||||
|
|
||||||
|
return new_addr;
|
||||||
|
}
|
|
@ -0,0 +1,243 @@
|
||||||
|
/**
|
||||||
|
* tool.c
|
||||||
|
* Дополнительные функции
|
||||||
|
*
|
||||||
|
* Вспомогательные функции для работы с данными
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <modstd.h>
|
||||||
|
#include <system.h>
|
||||||
|
|
||||||
|
uint64_t strlen(char *str) {
|
||||||
|
uint64_t length = 0;
|
||||||
|
while (*str) {
|
||||||
|
length++;
|
||||||
|
str++;
|
||||||
|
}
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
|
||||||
|
void strcpy(char *dest, char *src) {
|
||||||
|
size_t i = 0;
|
||||||
|
while (src[i] != '\0') {
|
||||||
|
dest[i] = src[i];
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
dest[i] = '\0'; // добавляем завершающий нулевой символ
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t strspn(char *str, char *accept) {
|
||||||
|
size_t count = 0;
|
||||||
|
char *ptr = str;
|
||||||
|
char *acc;
|
||||||
|
|
||||||
|
while (*ptr) {
|
||||||
|
acc = accept;
|
||||||
|
while (*acc) {
|
||||||
|
if (*ptr == *acc) {
|
||||||
|
count++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
acc++;
|
||||||
|
}
|
||||||
|
if (*acc == '\0') break;
|
||||||
|
ptr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t strcspn(char *str, char *reject) {
|
||||||
|
size_t count = 0;
|
||||||
|
char *ptr = str;
|
||||||
|
char *r;
|
||||||
|
|
||||||
|
while (*ptr) {
|
||||||
|
r = reject;
|
||||||
|
while (*r) {
|
||||||
|
if (*ptr == *r) { return count; }
|
||||||
|
r++;
|
||||||
|
}
|
||||||
|
count++;
|
||||||
|
ptr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *strtok(char *str, char *delim) {
|
||||||
|
char *token = NULL;
|
||||||
|
char *next_token = NULL;
|
||||||
|
|
||||||
|
if (str != NULL) {
|
||||||
|
token = str;
|
||||||
|
} else {
|
||||||
|
token = next_token;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (token == NULL) { return NULL; }
|
||||||
|
|
||||||
|
token += strspn(token, delim);
|
||||||
|
|
||||||
|
if (*token == '\0') {
|
||||||
|
next_token = NULL;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
next_token = token + strcspn(token, delim);
|
||||||
|
|
||||||
|
if (*next_token != '\0') {
|
||||||
|
*next_token = '\0';
|
||||||
|
next_token++;
|
||||||
|
} else {
|
||||||
|
next_token = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return token;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t strtol(char *str, char **endptr, int64_t base) {
|
||||||
|
size_t num = 0;
|
||||||
|
int64_t sign = 1;
|
||||||
|
|
||||||
|
// Пропускаем пробелы в начале строки
|
||||||
|
while (*str == ' ') { str++; }
|
||||||
|
|
||||||
|
// Проверяем знак числа
|
||||||
|
if (*str == '-') {
|
||||||
|
sign = -1;
|
||||||
|
str++;
|
||||||
|
} else if (*str == '+') {
|
||||||
|
str++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверяем основание системы счисления
|
||||||
|
if (base == 0) {
|
||||||
|
// Автоопределение основания
|
||||||
|
if (*str == '0') {
|
||||||
|
str++;
|
||||||
|
if (*str == 'x' || *str == 'X') {
|
||||||
|
base = 16; // Шестнадцатеричная система счисления
|
||||||
|
str++;
|
||||||
|
} else {
|
||||||
|
base = 8; // Восьмеричная система счисления
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
base = 10; // Десятичная система счисления
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Преобразование строки в число
|
||||||
|
while (*str != '\0') {
|
||||||
|
int64_t digit;
|
||||||
|
if (*str >= '0' && *str <= '9') {
|
||||||
|
digit = *str - '0';
|
||||||
|
} else if (*str >= 'A' && *str <= 'Z') {
|
||||||
|
digit = *str - 'A' + 10;
|
||||||
|
} else if (*str >= 'a' && *str <= 'z') {
|
||||||
|
digit = *str - 'a' + 10;
|
||||||
|
} else {
|
||||||
|
break; // Некорректный символ - прерываем преобразование
|
||||||
|
}
|
||||||
|
|
||||||
|
if (digit >= base) {
|
||||||
|
break; // Некорректная цифра - прерываем преобразование
|
||||||
|
}
|
||||||
|
|
||||||
|
num = num * base + digit;
|
||||||
|
str++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (endptr != NULL) {
|
||||||
|
//*endptr = (char *)str; // Указатель на символ, следующий за числом
|
||||||
|
}
|
||||||
|
|
||||||
|
return num * sign;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *strchr(char *str, char c) {
|
||||||
|
// пройти по каждому символу строки
|
||||||
|
while (*str != '\0') {
|
||||||
|
// если символ найден, вернуть указатель на него
|
||||||
|
if (*str == c) { return (char *)str; }
|
||||||
|
str++; // переход к следующему символу
|
||||||
|
}
|
||||||
|
// символ не найден, вернуть NULL
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int strcmp(const char *s1, const char *s2) {
|
||||||
|
while (*s1 == *s2) {
|
||||||
|
if (*s1 == '\0') { return 0; }
|
||||||
|
s1++;
|
||||||
|
s2++;
|
||||||
|
}
|
||||||
|
return *s1 - *s2;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *trstr(char *str, char sym) {
|
||||||
|
size_t left, size = strlen(str);
|
||||||
|
for (left = 0x00U; left < size; left++)
|
||||||
|
if (str[left] == sym) break;
|
||||||
|
|
||||||
|
size++;
|
||||||
|
left++;
|
||||||
|
|
||||||
|
if (left < size)
|
||||||
|
size -= left;
|
||||||
|
else
|
||||||
|
left = 0x00U;
|
||||||
|
|
||||||
|
char *res = alloc(size);
|
||||||
|
memcpy(res, str + left, size);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *strdup(char *str) {
|
||||||
|
size_t len = strlen(str) + 1;
|
||||||
|
char *dup = alloc(len);
|
||||||
|
|
||||||
|
if (dup != NULL) { memcpy(dup, str, len); }
|
||||||
|
|
||||||
|
return dup;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t count_chars(char *str, char c) {
|
||||||
|
size_t count = 0;
|
||||||
|
size_t len = strlen(str);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < len; i++) {
|
||||||
|
if (str[i] == c) { count++; }
|
||||||
|
}
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
void memcpy(void *dest, void *src, size_t n) {
|
||||||
|
char *d = (char *)dest;
|
||||||
|
char *s = (char *)src;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < n; i++) { d[i] = s[i]; }
|
||||||
|
}
|
||||||
|
|
||||||
|
void *memset(void *ptr, uint8_t n, size_t size) {
|
||||||
|
uint8_t *p = (uint8_t *)ptr;
|
||||||
|
for (size_t i = 0; i < size; i++) { p[i] = n; }
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *memmove(void *dest, void *src, size_t n) {
|
||||||
|
char *d = (char *)dest;
|
||||||
|
const char *s = (const char *)src;
|
||||||
|
|
||||||
|
if (d > s) {
|
||||||
|
// копирование с конца массива, чтобы предотвратить перекрытие
|
||||||
|
for (size_t i = n; i > 0; --i) { d[i - 1] = s[i - 1]; }
|
||||||
|
} else if (d < s) {
|
||||||
|
// копирование с начала массива
|
||||||
|
for (size_t i = 0; i < n; ++i) { d[i] = s[i]; }
|
||||||
|
}
|
||||||
|
|
||||||
|
return dest;
|
||||||
|
}
|
237
modlib/modstd.h
237
modlib/modstd.h
|
@ -11,228 +11,19 @@
|
||||||
#ifndef MODSTD_H
|
#ifndef MODSTD_H
|
||||||
#define MODSTD_H
|
#define MODSTD_H
|
||||||
|
|
||||||
static uint64_t strlen(char *str) {
|
uint64_t strlen(char *str);
|
||||||
uint64_t length = 0;
|
void strcpy(char *dest, char *src);
|
||||||
while (*str) {
|
size_t strspn(char *str, char *accept);
|
||||||
length++;
|
size_t strcspn(char *str, char *reject);
|
||||||
str++;
|
char *strtok(char *str, char *delim);
|
||||||
}
|
size_t strtol(char *str, char **endptr, int64_t base);
|
||||||
return length;
|
char *strchr(char *str, char c);
|
||||||
}
|
int strcmp(const char *s1, const char *s2);
|
||||||
|
char *trstr(char *str, char sym);
|
||||||
static void strcpy(char *dest, char *src) {
|
char *strdup(char *str);
|
||||||
size_t i = 0;
|
size_t count_chars(char *str, char c);
|
||||||
while (src[i] != '\0') {
|
void memcpy(void *dest, void *src, size_t n);
|
||||||
dest[i] = src[i];
|
void *memset(void *ptr, uint8_t n, size_t size);
|
||||||
i++;
|
void *memmove(void *dest, void *src, size_t n);
|
||||||
}
|
|
||||||
dest[i] = '\0'; // добавляем завершающий нулевой символ
|
|
||||||
}
|
|
||||||
|
|
||||||
static void memcpy(void *dest, void *src, size_t n) {
|
|
||||||
char *d = (char *)dest;
|
|
||||||
char *s = (char *)src;
|
|
||||||
|
|
||||||
for (size_t i = 0; i < n; i++) { d[i] = s[i]; }
|
|
||||||
}
|
|
||||||
|
|
||||||
static void *memset(void *ptr, uint8_t n, size_t size) {
|
|
||||||
uint8_t *p = (uint8_t *)ptr;
|
|
||||||
for (size_t i = 0; i < size; i++) { p[i] = n; }
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
static size_t strspn(char *str, char *accept) {
|
|
||||||
size_t count = 0;
|
|
||||||
char *ptr = str;
|
|
||||||
char *acc;
|
|
||||||
|
|
||||||
while (*ptr) {
|
|
||||||
acc = accept;
|
|
||||||
while (*acc) {
|
|
||||||
if (*ptr == *acc) {
|
|
||||||
count++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
acc++;
|
|
||||||
}
|
|
||||||
if (*acc == '\0') break;
|
|
||||||
ptr++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
|
|
||||||
static size_t strcspn(char *str, char *reject) {
|
|
||||||
size_t count = 0;
|
|
||||||
char *ptr = str;
|
|
||||||
char *r;
|
|
||||||
|
|
||||||
while (*ptr) {
|
|
||||||
r = reject;
|
|
||||||
while (*r) {
|
|
||||||
if (*ptr == *r) { return count; }
|
|
||||||
r++;
|
|
||||||
}
|
|
||||||
count++;
|
|
||||||
ptr++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *strtok(char *str, char *delim) {
|
|
||||||
static char *token = NULL;
|
|
||||||
static char *next_token = NULL;
|
|
||||||
|
|
||||||
if (str != NULL) {
|
|
||||||
token = str;
|
|
||||||
} else {
|
|
||||||
token = next_token;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (token == NULL) { return NULL; }
|
|
||||||
|
|
||||||
token += strspn(token, delim);
|
|
||||||
|
|
||||||
if (*token == '\0') {
|
|
||||||
next_token = NULL;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
next_token = token + strcspn(token, delim);
|
|
||||||
|
|
||||||
if (*next_token != '\0') {
|
|
||||||
*next_token = '\0';
|
|
||||||
next_token++;
|
|
||||||
} else {
|
|
||||||
next_token = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return token;
|
|
||||||
}
|
|
||||||
|
|
||||||
static size_t strtol(char *str, char **endptr, int64_t base) {
|
|
||||||
size_t num = 0;
|
|
||||||
int64_t sign = 1;
|
|
||||||
|
|
||||||
// Пропускаем пробелы в начале строки
|
|
||||||
while (*str == ' ') { str++; }
|
|
||||||
|
|
||||||
// Проверяем знак числа
|
|
||||||
if (*str == '-') {
|
|
||||||
sign = -1;
|
|
||||||
str++;
|
|
||||||
} else if (*str == '+') {
|
|
||||||
str++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Проверяем основание системы счисления
|
|
||||||
if (base == 0) {
|
|
||||||
// Автоопределение основания
|
|
||||||
if (*str == '0') {
|
|
||||||
str++;
|
|
||||||
if (*str == 'x' || *str == 'X') {
|
|
||||||
base = 16; // Шестнадцатеричная система счисления
|
|
||||||
str++;
|
|
||||||
} else {
|
|
||||||
base = 8; // Восьмеричная система счисления
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
base = 10; // Десятичная система счисления
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Преобразование строки в число
|
|
||||||
while (*str != '\0') {
|
|
||||||
int64_t digit;
|
|
||||||
if (*str >= '0' && *str <= '9') {
|
|
||||||
digit = *str - '0';
|
|
||||||
} else if (*str >= 'A' && *str <= 'Z') {
|
|
||||||
digit = *str - 'A' + 10;
|
|
||||||
} else if (*str >= 'a' && *str <= 'z') {
|
|
||||||
digit = *str - 'a' + 10;
|
|
||||||
} else {
|
|
||||||
break; // Некорректный символ - прерываем преобразование
|
|
||||||
}
|
|
||||||
|
|
||||||
if (digit >= base) {
|
|
||||||
break; // Некорректная цифра - прерываем преобразование
|
|
||||||
}
|
|
||||||
|
|
||||||
num = num * base + digit;
|
|
||||||
str++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (endptr != NULL) {
|
|
||||||
//*endptr = (char *)str; // Указатель на символ, следующий за числом
|
|
||||||
}
|
|
||||||
|
|
||||||
return num * sign;
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *strchr(char *str, char c) {
|
|
||||||
// пройти по каждому символу строки
|
|
||||||
while (*str != '\0') {
|
|
||||||
// если символ найден, вернуть указатель на него
|
|
||||||
if (*str == c) { return (char *)str; }
|
|
||||||
str++; // переход к следующему символу
|
|
||||||
}
|
|
||||||
// символ не найден, вернуть NULL
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void *memmove(void *dest, void *src, size_t n) {
|
|
||||||
char *d = (char *)dest;
|
|
||||||
const char *s = (const char *)src;
|
|
||||||
|
|
||||||
if (d > s) {
|
|
||||||
// копирование с конца массива, чтобы предотвратить перекрытие
|
|
||||||
for (size_t i = n; i > 0; --i) { d[i - 1] = s[i - 1]; }
|
|
||||||
} else if (d < s) {
|
|
||||||
// копирование с начала массива
|
|
||||||
for (size_t i = 0; i < n; ++i) { d[i] = s[i]; }
|
|
||||||
}
|
|
||||||
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *trstr(char *str, char sym) {
|
|
||||||
size_t left, size = strlen(str);
|
|
||||||
for (left = 0x00U; left < size; left++)
|
|
||||||
if (str[left] == sym) break;
|
|
||||||
|
|
||||||
size++;
|
|
||||||
left++;
|
|
||||||
|
|
||||||
if (left < size)
|
|
||||||
size -= left;
|
|
||||||
else
|
|
||||||
left = 0x00U;
|
|
||||||
|
|
||||||
char *res = alloc(size);
|
|
||||||
memcpy(res, str + left, size);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *strdup(char *str) {
|
|
||||||
size_t len = strlen(str) + 1;
|
|
||||||
char *dup = alloc(len);
|
|
||||||
|
|
||||||
if (dup != NULL) { memcpy(dup, str, len); }
|
|
||||||
|
|
||||||
return dup;
|
|
||||||
}
|
|
||||||
|
|
||||||
static size_t count_chars(char *str, char c) {
|
|
||||||
size_t count = 0;
|
|
||||||
size_t len = strlen(str);
|
|
||||||
|
|
||||||
for (size_t i = 0; i < len; i++) {
|
|
||||||
if (str[i] == c) { count++; }
|
|
||||||
}
|
|
||||||
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // modstd.h
|
#endif // modstd.h
|
||||||
|
|
|
@ -9,57 +9,25 @@
|
||||||
#ifndef SYSTEM_H
|
#ifndef SYSTEM_H
|
||||||
#define SYSTEM_H
|
#define SYSTEM_H
|
||||||
|
|
||||||
|
#include <modstd.h>
|
||||||
#include <types.h>
|
#include <types.h>
|
||||||
|
|
||||||
static void *(*alloc)(uint64_t size);
|
extern void *(*alloc)(uint64_t size);
|
||||||
static void (*free)(void *ptr);
|
extern void (*free)(void *ptr);
|
||||||
static void (*fb_printf)(char *str, ...);
|
extern void (*fb_printf)(char *str, ...);
|
||||||
static module_info_t *(*get_module)(char *module_id);
|
extern module_info_t *(*get_module)(char *module_id);
|
||||||
static framebuffer_t (*alloc_framebuffer)( );
|
extern framebuffer_t (*alloc_framebuffer)( );
|
||||||
static void (*free_framebuffer)(framebuffer_t *frame);
|
extern void (*free_framebuffer)(framebuffer_t *frame);
|
||||||
static void (*exit)(int code);
|
extern void (*exit)(int code);
|
||||||
static int (*get_error)( );
|
extern int (*get_error)( );
|
||||||
static sys_info_t *(*get_info)( );
|
extern sys_info_t *(*get_info)( );
|
||||||
static uint64_t (*new_thread)(uint64_t func);
|
extern uint64_t (*new_thread)(uint64_t func);
|
||||||
static int (*delete_thread)(uint64_t thread_id);
|
extern int (*delete_thread)(uint64_t thread_id);
|
||||||
static time_t (*get_time)( );
|
extern time_t (*get_time)( );
|
||||||
static uint64_t offset;
|
extern uint64_t offset;
|
||||||
|
|
||||||
#include <modstd.h>
|
void init_env(env_t *loader_env);
|
||||||
|
void *realloc(void *addr, size_t size);
|
||||||
static inline void init_env(env_t *loader_env) {
|
|
||||||
offset = loader_env->offset;
|
|
||||||
fb_printf = loader_env->fb_printf;
|
|
||||||
alloc = loader_env->alloc;
|
|
||||||
free = loader_env->free;
|
|
||||||
get_module = loader_env->get_module;
|
|
||||||
alloc_framebuffer = loader_env->alloc_framebuffer;
|
|
||||||
free_framebuffer = loader_env->free_framebuffer;
|
|
||||||
exit = loader_env->exit;
|
|
||||||
get_error = loader_env->get_error;
|
|
||||||
get_info = loader_env->get_info;
|
|
||||||
new_thread = loader_env->new_thread;
|
|
||||||
delete_thread = loader_env->delete_thread;
|
|
||||||
get_time = loader_env->get_time;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void *realloc(void *addr, size_t size) {
|
|
||||||
if (size == 0) {
|
|
||||||
free(addr);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (addr == NULL) { return alloc(size); }
|
|
||||||
|
|
||||||
void *new_addr = alloc(size);
|
|
||||||
|
|
||||||
if (new_addr == NULL) { return NULL; }
|
|
||||||
|
|
||||||
memcpy(new_addr, addr, size);
|
|
||||||
free(addr);
|
|
||||||
|
|
||||||
return new_addr;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void outb(uint16_t port, uint8_t val) {
|
static inline void outb(uint16_t port, uint8_t val) {
|
||||||
asm volatile("outb %0, %1" : : "a"(val), "Nd"(port));
|
asm volatile("outb %0, %1" : : "a"(val), "Nd"(port));
|
||||||
|
|
|
@ -11,6 +11,6 @@ fi
|
||||||
|
|
||||||
|
|
||||||
$CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c main.c -o cpubench.o
|
$CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c main.c -o cpubench.o
|
||||||
$CC $ARCH_FLAGS -T ../link.ld -Wl,--entry=init,--build-id=none cpubench.o -o cpubench.ko
|
$CC $ARCH_FLAGS -Wl,--entry=init,--build-id=none -T ../link.ld cpubench.o -L../../modlib/lib/ -lmod -o cpubench.ko
|
||||||
cp cpubench.ko ../bin/
|
cp cpubench.ko ../bin/
|
||||||
echo "Сборка завершена, файл: cpubench.ko"
|
echo "Сборка завершена, файл: cpubench.ko"
|
||||||
|
|
|
@ -11,7 +11,8 @@ fi
|
||||||
|
|
||||||
|
|
||||||
$CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c main.c -o hello.o
|
$CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c main.c -o hello.o
|
||||||
$CC $ARCH_FLAGS -T ../link.ld -Wl,--entry=init,--build-id=none hello.o -o hello.ko
|
$CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c lol.c -o lol.o
|
||||||
|
$CC $ARCH_FLAGS -Wl,--entry=init,--build-id=none -T ../link.ld lol.o hello.o -L../../modlib/lib/ -lmod -o hello.ko
|
||||||
|
|
||||||
cp hello.ko ../bin/
|
cp hello.ko ../bin/
|
||||||
echo "Сборка завершена, файл: hello.ko"
|
echo "Сборка завершена, файл: hello.ko"
|
||||||
|
|
|
@ -11,7 +11,7 @@ fi
|
||||||
|
|
||||||
|
|
||||||
$CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c main.c -o imfs.o
|
$CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c main.c -o imfs.o
|
||||||
$CC $ARCH_FLAGS -T ../link.ld -Wl,--entry=init,--build-id=none imfs.o -o imfs.ko
|
$CC $ARCH_FLAGS -Wl,--entry=init,--build-id=none -T ../link.ld imfs.o -L../../modlib/lib/ -lmod -o imfs.ko
|
||||||
|
|
||||||
cp imfs.ko ../bin/
|
cp imfs.ko ../bin/
|
||||||
echo "Сборка завершена, файл: imfs.ko"
|
echo "Сборка завершена, файл: imfs.ko"
|
||||||
|
|
|
@ -13,8 +13,8 @@ fi
|
||||||
|
|
||||||
$CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c main.c -o pci.o
|
$CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c main.c -o pci.o
|
||||||
$CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c pci_data.c -o pci_data.o
|
$CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c pci_data.c -o pci_data.o
|
||||||
$CC $ARCH_FLAGS -T ../link.ld -Wl,--entry=init,--build-id=none pci.o -o pci.ko
|
$CC $ARCH_FLAGS -Wl,--entry=init,--build-id=none -T ../link.ld pci.o -L../../modlib/lib/ -lmod -o pci.ko
|
||||||
$CC $ARCH_FLAGS -T ../link.ld -Wl,--entry=init,--build-id=none pci_data.o -o pci_data.ko
|
$CC $ARCH_FLAGS -Wl,--entry=init,--build-id=none -T ../link.ld pci_data.o -L../../modlib/lib/ -lmod -o pci_data.ko
|
||||||
|
|
||||||
cp pci.ko ../bin/
|
cp pci.ko ../bin/
|
||||||
cp pci_data.ko ../bin/
|
cp pci_data.ko ../bin/
|
||||||
|
|
|
@ -12,7 +12,7 @@ fi
|
||||||
|
|
||||||
|
|
||||||
$CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c main.c -o ps2.o
|
$CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c main.c -o ps2.o
|
||||||
$CC $ARCH_FLAGS -T ../link.ld -Wl,--entry=init,--build-id=none ps2.o -o ps2.ko
|
$CC $ARCH_FLAGS -Wl,--entry=init,--build-id=none -T ../link.ld ps2.o -L../../modlib/lib/ -lmod -o ps2.ko
|
||||||
|
|
||||||
cp ps2.ko ../bin/
|
cp ps2.ko ../bin/
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ fi
|
||||||
|
|
||||||
|
|
||||||
$CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c main.c -o simd.o
|
$CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c main.c -o simd.o
|
||||||
$CC $ARCH_FLAGS -T ../link.ld -Wl,--entry=init,--build-id=none simd.o -o simd.ko
|
$CC $ARCH_FLAGS -Wl,--entry=init,--build-id=none -T ../link.ld simd.o -L../../modlib/lib/ -lmod -o simd.ko
|
||||||
|
|
||||||
cp simd.ko ../bin/
|
cp simd.ko ../bin/
|
||||||
echo "Сборка завершена, файл: simd.ko"
|
echo "Сборка завершена, файл: simd.ko"
|
||||||
|
|
|
@ -11,7 +11,7 @@ fi
|
||||||
|
|
||||||
|
|
||||||
$CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c main.c -o tga.o
|
$CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c main.c -o tga.o
|
||||||
$CC $ARCH_FLAGS -T ../link.ld -Wl,--entry=init,--build-id=none tga.o -o tga.ko
|
$CC $ARCH_FLAGS -Wl,--entry=init,--build-id=none -T ../link.ld tga.o -L../../modlib/lib/ -lmod -o tga.ko
|
||||||
|
|
||||||
cp boot.jpg ../bin/
|
cp boot.jpg ../bin/
|
||||||
cp boot.tga ../bin/
|
cp boot.tga ../bin/
|
||||||
|
|
Loading…
Reference in New Issue