From 930a39f0672fe6b6f935674c860451b31c69f3b3 Mon Sep 17 00:00:00 2001 From: dongl <2725096176@qq.com> Date: Thu, 21 Aug 2025 22:34:32 +0800 Subject: [PATCH] =?UTF-8?q?[libk]:=20=20=20=20=20=20=20=20libk=20=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E5=9C=A8=E5=B7=A5=E7=A8=8B=E4=B8=8A=E3=80=81=E6=9E=B6?= =?UTF-8?q?=E6=9E=84=E8=AE=BE=E8=AE=A1=E5=81=9A=E5=87=BA=E9=87=8D=E5=A4=A7?= =?UTF-8?q?=E6=94=B9=E5=8F=98=EF=BC=8C=E8=84=B1=E7=A6=BBmagnitude=EF=BC=88?= =?UTF-8?q?kernel=EF=BC=89=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- arch/aarch64/asm_src/memory.S | 11 +++++++ arch/aarch64/asm_src/string.S | 0 arch/aarch64/bits/alltypes.h | 19 +++++++++++ arch/aarch64/crt_arch.h | 14 ++++++++ arch/aarch64/libkasm.h | 12 +++++++ arch/crt.h | 12 +++++++ arch/libk.h | 10 ++++++ crt/aarch64/libk_fini.S | 3 ++ crt/aarch64/libk_init.S | 3 ++ crt/crt0.c | 35 ++++++++++++++++++++ include/features.h | 25 ++++++++++++++ include/memory.h | 45 ++++++++++++++++++++++++++ include/stddef.h | 14 ++++++++ include/string.h | 51 +++++++++++++++++++++++++++++ src/include/features.h | 17 ++++++++++ src/include/memory.h | 10 ++++++ src/include/stdbool.h | 19 +++++++++++ src/include/stddef.h | 10 ++++++ src/include/string.h | 11 +++++++ src/libk_start_main.c | 21 ++++++++++++ src/memory.c | 61 +++++++++++++++++++++++++++++++++++ src/string.c | 17 ++++++++++ 22 files changed, 420 insertions(+) create mode 100644 arch/aarch64/asm_src/memory.S create mode 100644 arch/aarch64/asm_src/string.S create mode 100644 arch/aarch64/bits/alltypes.h create mode 100644 arch/aarch64/crt_arch.h create mode 100644 arch/aarch64/libkasm.h create mode 100644 arch/crt.h create mode 100644 arch/libk.h create mode 100644 crt/aarch64/libk_fini.S create mode 100644 crt/aarch64/libk_init.S create mode 100644 crt/crt0.c create mode 100644 include/features.h create mode 100644 include/memory.h create mode 100644 include/stddef.h create mode 100644 include/string.h create mode 100644 src/include/features.h create mode 100644 src/include/memory.h create mode 100644 src/include/stdbool.h create mode 100644 src/include/stddef.h create mode 100644 src/include/string.h create mode 100644 src/libk_start_main.c create mode 100644 src/memory.c create mode 100644 src/string.c diff --git a/arch/aarch64/asm_src/memory.S b/arch/aarch64/asm_src/memory.S new file mode 100644 index 0000000..f58e642 --- /dev/null +++ b/arch/aarch64/asm_src/memory.S @@ -0,0 +1,11 @@ + +/** + * 内存复制 + * void *memcpy(void *dest, const void *src, size_t n); + * x0: dest + * x1: src + * x2: len + **/ +memcpy: + ret + diff --git a/arch/aarch64/asm_src/string.S b/arch/aarch64/asm_src/string.S new file mode 100644 index 0000000..e69de29 diff --git a/arch/aarch64/bits/alltypes.h b/arch/aarch64/bits/alltypes.h new file mode 100644 index 0000000..aca6798 --- /dev/null +++ b/arch/aarch64/bits/alltypes.h @@ -0,0 +1,19 @@ + +#ifndef BITS_ALLTYPES_H +#define BITS_ALLTYPES_H + +typedef unsigned long size_t; +typedef unsigned long uintptr_t; +typedef unsigned long uint64_t; +typedef signed long ssize_t; +typedef signed long intptr_t; +typedef signed long int64_t; + +typedef unsigned int uint32_t; +typedef signed int int32_t; + +typedef unsigned short uint16_t; +typedef signed short int16_t; + +#endif + diff --git a/arch/aarch64/crt_arch.h b/arch/aarch64/crt_arch.h new file mode 100644 index 0000000..88e8bb5 --- /dev/null +++ b/arch/aarch64/crt_arch.h @@ -0,0 +1,14 @@ + +#ifndef CRT_ARCH +#define CRT_ARCH + +#define CTR_ARCH_START_ASM(START) \ +__asm__( \ +".text \n" \ +".global " START "\n" \ +".type " START ",%function\n" \ +START ":\n" \ +" b " START "_c\n" \ +); + +#endif \ No newline at end of file diff --git a/arch/aarch64/libkasm.h b/arch/aarch64/libkasm.h new file mode 100644 index 0000000..8c37f9f --- /dev/null +++ b/arch/aarch64/libkasm.h @@ -0,0 +1,12 @@ +// +// Created by dongl on 25-8-5. +// + +#ifndef LIBKASM_H +#define LIBKASM_H + +#define __asm_memcpy + +void crt0(void); + +#endif //LIBKASM_H diff --git a/arch/crt.h b/arch/crt.h new file mode 100644 index 0000000..6c7ef65 --- /dev/null +++ b/arch/crt.h @@ -0,0 +1,12 @@ +// +// Created by dongl on 25-8-12. +// + +#ifndef CRT_H +#define CRT_H + +#include + +void _start_c( long *p ); + +#endif //CRT_H diff --git a/arch/libk.h b/arch/libk.h new file mode 100644 index 0000000..17d2e5b --- /dev/null +++ b/arch/libk.h @@ -0,0 +1,10 @@ +// +// Created by dongl on 25-8-5. +// + +#ifndef LIBK_H +#define LIBK_H + +#include + +#endif //LIBK_H diff --git a/crt/aarch64/libk_fini.S b/crt/aarch64/libk_fini.S new file mode 100644 index 0000000..2c182f5 --- /dev/null +++ b/crt/aarch64/libk_fini.S @@ -0,0 +1,3 @@ + +libk_fini: + ret \ No newline at end of file diff --git a/crt/aarch64/libk_init.S b/crt/aarch64/libk_init.S new file mode 100644 index 0000000..96a74b9 --- /dev/null +++ b/crt/aarch64/libk_init.S @@ -0,0 +1,3 @@ + +libk_init: + ret \ No newline at end of file diff --git a/crt/crt0.c b/crt/crt0.c new file mode 100644 index 0000000..b444c26 --- /dev/null +++ b/crt/crt0.c @@ -0,0 +1,35 @@ +// +// Created by dongl on 25-8-11. +// +#include +#include + +#define START "_start" + +#include + +weak void libk_init(); +weak void libk_fini(); +int main( int argc, char **argv ); +int rt_main( int argc, char **argv ); + +int libk_start_main( + int (*)(), + int, + char **, + void (*)(), + void(*)(), + void(*)() +); + +void _start_c( long *p ) +{ + // main 入口参数 + const int argc = (int) p[0]; + char **argv = (void *)(p+1); + (void) argv; + + p[0] >> (sizeof(long) - 1) + ? libk_start_main(main, argc, argv, libk_init, libk_fini, 0) + : libk_start_main(rt_main, argc, argv, libk_init, libk_fini, 0); +} diff --git a/include/features.h b/include/features.h new file mode 100644 index 0000000..c108bb9 --- /dev/null +++ b/include/features.h @@ -0,0 +1,25 @@ +#ifndef _FEATURES_H +#define _FEATURES_H + +#if __STDC_VERSION__ >= 199901L +#define __restrict restrict +#elif !defined(__GNUC__) +#define __restrict +#endif + +#if __STDC_VERSION__ >= 199901L || defined(__cplusplus) +#define __inline inline +#elif !defined(__GNUC__) +#define __inline +#endif + +#if __STDC_VERSION__ >= 201112L +#elif defined(__GNUC__) +#define _Noreturn __attribute__((__noreturn__)) +#else +#define _Noreturn +#endif + +#define __REDIR(x,y) __typeof__(x) x __asm__(#y) + +#endif diff --git a/include/memory.h b/include/memory.h new file mode 100644 index 0000000..88eb8a2 --- /dev/null +++ b/include/memory.h @@ -0,0 +1,45 @@ +// +// Created by dongl on 25-7-30. +// + +#ifndef LIBK_MEMORY_H +#define LIBK_MEMORY_H + +#include "stddef.h" // for size_t + +#ifdef __cplusplus +extern "C" { +#endif + + // 复制 n 字节从 src 到 dest(不处理重叠) + void *memcpy(void *dest, const void *src, size_t n); + + // 填充 s 指向的内存块,共 n 字节为 c 值 + void *memset(void *s, const int c, size_t n); + + // 比较两个内存块 s1 和 s2 的前 n 字节 + int memcmp(const void *s1, const void *s2, size_t n); + + // 复制 n 字节从 src 到 dest,安全处理重叠区域 + void *memmove(void *dest, const void *src, size_t n); + + // 清零 n 字节内存块 + void bzero(void *s, size_t n); + + // 在内存块中查找第一次出现字符 c + void *memchr(const void *s, int c, size_t n); + + // 交换两个内存区域内容(长度为 n 字节) + void memswap(void *a, void *b, size_t n); + + // 高速 memcpy 实现(使用 uint32_t)——可选 + void *memcpy32(void *dest, const void *src, size_t n); + + // 高速 memcmp 实现(使用 uint16_t)——可选 + int memcmp16(const void *s1, const void *s2, size_t n); + +#ifdef __cplusplus +} +#endif + +#endif // LIBK_MEMORY_H diff --git a/include/stddef.h b/include/stddef.h new file mode 100644 index 0000000..b6188d9 --- /dev/null +++ b/include/stddef.h @@ -0,0 +1,14 @@ +#ifndef _STDDEF_H +#define _STDDEF_H + +#if __cplusplus >= 201103L +#define NULL nullptr +#elif defined(__cplusplus) +#define NULL 0L +#else +#define NULL ((void*)0) +#endif + +#include + +#endif diff --git a/include/string.h b/include/string.h new file mode 100644 index 0000000..7350c3b --- /dev/null +++ b/include/string.h @@ -0,0 +1,51 @@ +// +// Created by dongl on 25-7-30. +// + +#ifndef LIBK_STRING_H +#define LIBK_STRING_H + +#include "stddef.h" // for size_t + +#ifdef __cplusplus +extern "C" { +#endif + + // 计算字符串长度(不包含结尾的 '\0') + size_t strlen(const char *str); + + // 复制字符串 src 到 dest,返回 dest + char *strcpy(char *dest, const char *src); + + // 最多复制 n 个字符到 dest(不足补零),返回 dest + char *strncpy(char *dest, const char *src, size_t n); + + // 比较两个字符串,相等返回 0 + int strcmp(const char *s1, const char *s2); + + // 比较两个字符串,最多比较 n 个字符 + int strncmp(const char *s1, const char *s2, size_t n); + + // 查找字符 c 在字符串中第一次出现的位置 + char *strchr(const char *s, int c); + + // 查找字符 c 在字符串中最后一次出现的位置 + char *strrchr(const char *s, int c); + + // 拼接 src 到 dest 的末尾,返回 dest + char *strcat(char *dest, const char *src); + + // 最多拼接 n 个字符 + char *strncat(char *dest, const char *src, size_t n); + + // 查找子串 needle 在 haystack 中第一次出现的位置 + char *strstr(const char *haystack, const char *needle); + + // 可选:复制字符串(需要分配内存) + char *strdup(const char *s); // 如果你实现了 malloc() + +#ifdef __cplusplus +} +#endif + +#endif // LIBK_STRING_H diff --git a/src/include/features.h b/src/include/features.h new file mode 100644 index 0000000..5dafd6e --- /dev/null +++ b/src/include/features.h @@ -0,0 +1,17 @@ +// +// Created by dongl on 25-8-11. +// + +#ifndef FEATURES_H +#define FEATURES_H + +#include "../../include/features.h" + +#define weak __attribute__((__weak__)) +#define hidden __attribute__((__visibility__("hidden"))) +#define weak_alias(old, new) \ + extern __typeof(old) new __attribute__((__weak__, __alias__(#old))) + +#define General_API weak + +#endif diff --git a/src/include/memory.h b/src/include/memory.h new file mode 100644 index 0000000..a9b6861 --- /dev/null +++ b/src/include/memory.h @@ -0,0 +1,10 @@ +// +// Created by dongl on 25-8-11. +// + +#ifndef MEMORY_H +#define MEMORY_H + +#include "../../include/string.h" + +#endif //MEMORY_H diff --git a/src/include/stdbool.h b/src/include/stdbool.h new file mode 100644 index 0000000..4a2a2f2 --- /dev/null +++ b/src/include/stdbool.h @@ -0,0 +1,19 @@ +// +// Created by dongl on 25-8-12. +// + +#ifndef STDBOOL_H +#define STDBOOL_H + +#ifndef __cplusplus + +#define true 1 +#define false 0 +#define bool _Bool + +#endif + +#define __bool_true_false_are_defined 1 + + +#endif //STDBOOL_H diff --git a/src/include/stddef.h b/src/include/stddef.h new file mode 100644 index 0000000..3420b11 --- /dev/null +++ b/src/include/stddef.h @@ -0,0 +1,10 @@ +// +// Created by dongl on 25-8-11. +// + +#ifndef STDDEF_H +#define STDDEF_H + +#include "../../include/stddef.h" + +#endif //STDDEF_H diff --git a/src/include/string.h b/src/include/string.h new file mode 100644 index 0000000..6fd39c3 --- /dev/null +++ b/src/include/string.h @@ -0,0 +1,11 @@ +// +// Created by dongl on 25-8-11. +// + +#ifndef STRING_H +#define STRING_H + +#include "../../include/string.h" + + +#endif diff --git a/src/libk_start_main.c b/src/libk_start_main.c new file mode 100644 index 0000000..22cfc68 --- /dev/null +++ b/src/libk_start_main.c @@ -0,0 +1,21 @@ +// +// Created by dongl on 25-8-12. +// + +int exit(int code); + +int libk_start_main( + int (*main)(int,char **), + int argc, + char **argv, + void (*init_dummy)(), + void (*fini_dummy)(), + void (*ldso_dummy)() +) { + (void)(ldso_dummy); + + init_dummy(); + exit(main(argc, argv)); + fini_dummy(); + return 0; +} diff --git a/src/memory.c b/src/memory.c new file mode 100644 index 0000000..1ee1b0a --- /dev/null +++ b/src/memory.c @@ -0,0 +1,61 @@ +// +// Created by dongl on 25-7-31. +// + +#include +#include +#include + +#ifndef __asm_memcpy +// 复制 n 字节从 src 到 dest(不处理重叠) +General_API void* memcpy(void *dest, const void *src, size_t n) { + char *d = (char*)dest; + const char *s = (const char*)src; + + while (n--) { + *d++ = *s++; // 正确:对 char* 指针递增 + } + + return dest; +} +#endif + +#ifndef __asm_memset +// 填充 s 指向的内存块,共 n 字节为 c 值 +General_API void *memset(void *s, const int c, size_t n) { + char *d = (char*)s; + + while (n--) { + *d++ = (char) c; + } + + return s; +} +#endif + +#ifndef __asm_memcmp +// 比较两个内存块 s1 和 s2 的前 n 字节 +General_API int memcmp(const void *s1, const void *s2, size_t n) { + const unsigned char *p1 = s1; + const unsigned char *p2 = s2; + + for (size_t i = 0; i < n; i++) { + if (p1[i] != p2[i]) { + return p1[i] - p2[i]; // 返回有符号差值 + } + } + + return 0; +} +#endif + +#ifndef __asm_memmove +// 复制 n 字节从 src 到 dest,安全处理重叠区域 +General_API void *memmove(void *dest, const void *src, size_t n) { + (void ) dest; + (void ) src; + (void ) n; + return NULL; +} +#endif + diff --git a/src/string.c b/src/string.c new file mode 100644 index 0000000..e8d39d8 --- /dev/null +++ b/src/string.c @@ -0,0 +1,17 @@ +// +// Created by dongl on 25-7-31. +// + +#include +#include +#include + +#ifndef __asm_strlen +General_API size_t strlen(const char *str) +{ + size_t len = 0; + while (str[len] != '\0') + ++len; + return len; +} +#endif \ No newline at end of file