Skip to content

Commit

Permalink
merge boot
Browse files Browse the repository at this point in the history
Signed-off-by: Zone.N <[email protected]>
  • Loading branch information
MRNIU committed Jan 9, 2025
2 parents 531dde4 + 4aa5f92 commit 124e6c5
Show file tree
Hide file tree
Showing 36 changed files with 1,178 additions and 242 deletions.
3 changes: 2 additions & 1 deletion .clang-tidy
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ Checks: >
-readability-braces-around-statements,
-readability-magic-numbers,
-performance-no-int-to-ptr,
-modernize-use-std-print
-modernize-use-std-print,
-bugprone-reserved-identifier
FormatStyle: google
...
18 changes: 9 additions & 9 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,27 +25,27 @@ repos:
- id: clang-tidy
args:
- --checks=.clang-tidy
- -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/compiler_commands.json
- -p=/root/SimpleKernel/build_x86_64/compiler_commands.json
- -extra-arg=--std=c++2b
- --fix
- --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/).*
# - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/x86_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/aarch64).*
- --header-filter=^(/root/SimpleKernel/build_x86_64/src/).*
# - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/x86_64|/root/SimpleKernel/build_x86_64/src/arch/aarch64).*
# - id: clang-tidy
# args:
# - --checks=.clang-tidy
# - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/build_x86_64/compiler_commands.json
# - -p=/root/SimpleKernel/build_x86_64/build_x86_64/compiler_commands.json
# - -extra-arg=--std=c++2b
# - --fix
# - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/).*
# - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/riscv_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/aarch64).*
# - --header-filter=^(?/root/SimpleKernel/build_x86_64/src/).*
# - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/riscv_64|/root/SimpleKernel/build_x86_64/src/arch/aarch64).*
# - id: clang-tidy
# args:
# - --checks=.clang-tidy
# - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/build_aarch64/compiler_commands.json
# - -p=/root/SimpleKernel/build_x86_64/build_aarch64/compiler_commands.json
# - -extra-arg=--std=c++2b
# - --fix
# - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/).*
# - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/riscv64|/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/x86_64).*
# - --header-filter=^(?/root/SimpleKernel/build_x86_64/src/).*
# - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/riscv64|/root/SimpleKernel/build_x86_64/src/arch/x86_64).*

- repo: https://github.com/koalaman/shellcheck-precommit
rev: v0.10.0
Expand Down
2 changes: 1 addition & 1 deletion 3rd/cpu_io
6 changes: 6 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ IF(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
QEMU_FLAGS
-m
128M
-smp
4
-net
none
-bios
Expand All @@ -64,6 +66,8 @@ ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "riscv64")
QEMU_FLAGS
-machine
virt
-smp
4
# 可选项,qemu7.0 自带了 opensbi1.0
-bios
${opensbi_BINARY_DIR}/platform/generic/firmware/fw_jump.elf
Expand All @@ -84,6 +88,8 @@ ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64")
cortex-a72
-m
128M
-smp
4
-net
none
-kernel
Expand Down
67 changes: 42 additions & 25 deletions cmake/3rd.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -129,18 +129,27 @@ SET (dtc_BINARY_DIR ${CMAKE_BINARY_DIR}/3rd/dtc)
SET (dtc_CC ${CMAKE_C_COMPILER})
SET (dtc_AR ${CMAKE_AR})
# 编译 libfdt
ADD_CUSTOM_TARGET (
dtc
COMMENT "build libdtc..."
# make 时编译
ALL
WORKING_DIRECTORY ${dtc_SOURCE_DIR}
COMMAND ${CMAKE_COMMAND} -E make_directory ${dtc_BINARY_DIR}/libfdt
COMMAND CC=${dtc_CC} AR=${dtc_AR} HOME=${dtc_BINARY_DIR} make
libfdt/libfdt.a
COMMAND ${CMAKE_COMMAND} -E copy ${dtc_SOURCE_DIR}/libfdt/*.a
${dtc_SOURCE_DIR}/libfdt/*.h ${dtc_BINARY_DIR}/libfdt
COMMAND make clean)
IF(NOT EXISTS ${dtc_BINARY_DIR}/libfdt/libfdt.a)
ADD_CUSTOM_TARGET (
dtc
COMMENT "build libdtc..."
# make 时编译
ALL
WORKING_DIRECTORY ${dtc_SOURCE_DIR}
COMMAND ${CMAKE_COMMAND} -E make_directory ${dtc_BINARY_DIR}/libfdt
COMMAND CC=${dtc_CC} AR=${dtc_AR} HOME=${dtc_BINARY_DIR} make
libfdt/libfdt.a
COMMAND ${CMAKE_COMMAND} -E copy ${dtc_SOURCE_DIR}/libfdt/*.a
${dtc_SOURCE_DIR}/libfdt/*.h ${dtc_BINARY_DIR}/libfdt
COMMAND make clean)
ELSE()
ADD_CUSTOM_TARGET (
dtc
COMMENT "libdtc already exists, skipping..."
# make 时编译
ALL
WORKING_DIRECTORY ${dtc_SOURCE_DIR})
ENDIF()
ADD_LIBRARY (dtc-lib INTERFACE)
ADD_DEPENDENCIES (dtc-lib dtc)
TARGET_INCLUDE_DIRECTORIES (dtc-lib INTERFACE ${dtc_BINARY_DIR}/libfdt)
Expand All @@ -165,19 +174,27 @@ ELSEIF(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "x86_64" AND CMAKE_SYSTEM_PROCESSOR
MATCHES "aarch64")
SET (CROSS_COMPILE_ aarch64-linux-gnu-)
ENDIF()
# 编译 gnu-efi
ADD_CUSTOM_TARGET (
gnu-efi
COMMENT "build gnu-efi..."
# make 时编译
ALL
WORKING_DIRECTORY ${gnu-efi_SOURCE_DIR}
COMMAND ${CMAKE_COMMAND} -E make_directory ${gnu-efi_BINARY_DIR}
COMMAND # @note 仅支持 gcc
make lib gnuefi inc CROSS_COMPILE=${CROSS_COMPILE_}
ARCH=${CMAKE_SYSTEM_PROCESSOR} OBJDIR=${gnu-efi_BINARY_DIR} V=1
COMMAND ${CMAKE_COMMAND} -E copy_directory ${gnu-efi_SOURCE_DIR}/inc
${gnu-efi_BINARY_DIR}/inc)
IF(NOT EXISTS ${gnu-efi_BINARY_DIR}/lib/libefi.a)
# 编译 gnu-efi
ADD_CUSTOM_TARGET (
gnu-efi
COMMENT "build gnu-efi..."
# make 时编译
ALL
WORKING_DIRECTORY ${gnu-efi_SOURCE_DIR}
COMMAND ${CMAKE_COMMAND} -E make_directory ${gnu-efi_BINARY_DIR}
COMMAND # @note 仅支持 gcc
make lib gnuefi inc CROSS_COMPILE=${CROSS_COMPILE_}
ARCH=${CMAKE_SYSTEM_PROCESSOR} OBJDIR=${gnu-efi_BINARY_DIR} V=1
COMMAND ${CMAKE_COMMAND} -E copy_directory ${gnu-efi_SOURCE_DIR}/inc
${gnu-efi_BINARY_DIR}/inc)
ELSE()
ADD_CUSTOM_TARGET (
gnu-efi
COMMENT "gnu-efi already exists, skipping..."
ALL
WORKING_DIRECTORY ${gnu-efi_SOURCE_DIR})
ENDIF()
ADD_LIBRARY (gnu-efi-lib INTERFACE)
ADD_DEPENDENCIES (gnu-efi-lib gnu-efi)
TARGET_INCLUDE_DIRECTORIES (
Expand Down
1 change: 1 addition & 0 deletions cmake/compile_config.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ TARGET_COMPILE_OPTIONS (
-march=armv8-a
# 针对 cortex-a72 优化代码
-mtune=cortex-a72
-mno-outline-atomics
>
# gcc 特定选项
$<$<CXX_COMPILER_ID:GNU>:
Expand Down
44 changes: 16 additions & 28 deletions src/kernel/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,44 +1,32 @@

# This file is a part of Simple-XX/SimpleKernel
# (https://github.com/Simple-XX/SimpleKernel).
#
# CMakeLists.txt for Simple-XX/SimpleKernel.

# 设置项目名与版本
project(
kernel
VERSION 0.0.1
)
PROJECT (kernel VERSION 0.0.1)

enable_language(ASM)
enable_language(C)
enable_language(CXX)
ENABLE_LANGUAGE (ASM)
ENABLE_LANGUAGE (C)
ENABLE_LANGUAGE (CXX)

add_subdirectory(${PROJECT_SOURCE_DIR}/libc)
add_subdirectory(${PROJECT_SOURCE_DIR}/libcxx)
add_subdirectory(${PROJECT_SOURCE_DIR}/arch)
add_subdirectory(${PROJECT_SOURCE_DIR}/driver)
ADD_SUBDIRECTORY (${PROJECT_SOURCE_DIR}/libc)
ADD_SUBDIRECTORY (${PROJECT_SOURCE_DIR}/libcxx)
ADD_SUBDIRECTORY (${PROJECT_SOURCE_DIR}/arch)
ADD_SUBDIRECTORY (${PROJECT_SOURCE_DIR}/driver)

add_executable(${PROJECT_NAME}
main.cpp
)
ADD_EXECUTABLE (${PROJECT_NAME} main.cpp)

# 添加头文件
target_include_directories(kernel PRIVATE
include
)
TARGET_INCLUDE_DIRECTORIES (kernel PRIVATE include)

# 添加要链接的库
target_link_libraries(${PROJECT_NAME} PRIVATE
kernel_link_libraries
libc
libcxx
arch
driver
)
TARGET_LINK_LIBRARIES (${PROJECT_NAME} PRIVATE kernel_link_libraries libc
libcxx arch driver)

set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "")
set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME ${KERNEL_ELF_OUTPUT_NAME})
SET_TARGET_PROPERTIES (${PROJECT_NAME} PROPERTIES PREFIX "")
SET_TARGET_PROPERTIES (${PROJECT_NAME} PROPERTIES OUTPUT_NAME
${KERNEL_ELF_OUTPUT_NAME})

# 获取目标文件信息
objdump_readelf_nm(${PROJECT_NAME})
OBJDUMP_READELF_NM (${PROJECT_NAME})
5 changes: 1 addition & 4 deletions src/kernel/arch/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,9 @@ TARGET_SOURCES (
arch
INTERFACE
$<$<STREQUAL:${CMAKE_SYSTEM_PROCESSOR},riscv64>:
${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_SYSTEM_PROCESSOR}/boot.S
${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_SYSTEM_PROCESSOR}/macro.S
>
$<$<STREQUAL:${CMAKE_SYSTEM_PROCESSOR},aarch64>:
${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_SYSTEM_PROCESSOR}/boot.S
>
${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_SYSTEM_PROCESSOR}/macro.S
${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_SYSTEM_PROCESSOR}/arch_main.cpp
${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_SYSTEM_PROCESSOR}/backtrace.cpp
${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_SYSTEM_PROCESSOR}/interrupt.cpp)
63 changes: 60 additions & 3 deletions src/kernel/arch/aarch64/arch_main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,20 +17,77 @@
#include <cpu_io.h>

#include "arch.h"
#include "basic_info.hpp"
#include "kernel_elf.hpp"
#include "kernel_fdt.hpp"
#include "per_cpu.hpp"
#include "pl011.h"
#include "sk_cstdio"

// printf_bare_metal 基本输出实现
namespace {
Pl011* pl011 = nullptr;
}
extern "C" void _putchar(char character) {
static auto* kUartAddr = (uint8_t*)0x09000000;
*kUartAddr = character;
if (pl011) {
pl011->PutChar(character);
}
}

auto ArchInit(uint32_t argc, const uint8_t* argv) -> uint32_t {
BasicInfo::BasicInfo(uint32_t argc, const uint8_t* argv) {
(void)argc;
(void)argv;

auto [memory_base, memory_size] =
Singleton<KernelFdt>::GetInstance().GetMemory();
physical_memory_addr = memory_base;
physical_memory_size = memory_size;

kernel_addr = reinterpret_cast<uint64_t>(__executable_start);
kernel_size = reinterpret_cast<uint64_t>(end) -
reinterpret_cast<uint64_t>(__executable_start);
elf_addr = 0;
elf_size = 0;

fdt_addr = 0x40000000;
}

auto ArchInit(uint32_t argc, const uint8_t* argv) -> uint32_t {
// 初始化 FPU
cpu_io::SetupFpu();

Singleton<KernelFdt>::GetInstance() = KernelFdt(0x40000000);

Singleton<BasicInfo>::GetInstance() = BasicInfo(argc, argv);
Singleton<BasicInfo>::GetInstance().core_count++;

auto [serial_base, serial_size] =
Singleton<KernelFdt>::GetInstance().GetSerial();

static auto uart = Pl011(serial_base);
pl011 = &uart;
sk_std::cout << Singleton<BasicInfo>::GetInstance();

uart.PutChar('H');
uart.PutChar('e');
uart.PutChar('l');
uart.PutChar('l');
uart.PutChar('o');
uart.PutChar(' ');
uart.PutChar('u');
uart.PutChar('a');
uart.PutChar('r');
uart.PutChar('t');
uart.PutChar('!');
uart.PutChar('\n');

// __asm__ volatile("sev");

return 0;
}

auto ArchInitSMP(uint32_t argc, const uint8_t* argv) -> uint32_t {
(void)argc;
(void)argv;
return 0;
}
47 changes: 45 additions & 2 deletions src/kernel/arch/aarch64/boot.S
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,56 @@

// clang-format off

#define ASM_FILE
#include "multiboot2.h"

// multiboot2 文件头
// 计算头长度
.SET HEADER_LENGTH, multiboot_header_end - multiboot_header
// 计算校验和
.SET CHECKSUM, -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT2_ARCHITECTURE_I386 + HEADER_LENGTH)
// 8 字节对齐
.align MULTIBOOT_HEADER_ALIGN
// 声明所属段
.section .text.boot
multiboot_header:
// 魔数
.long MULTIBOOT2_HEADER_MAGIC
// 架构
.long MULTIBOOT2_ARCHITECTURE_I386
// 头长度
.long HEADER_LENGTH
// 校验和
.long CHECKSUM
// 添加其它内容在此,详细信息见 Multiboot2 Specification version 2.0.pdf
.short MULTIBOOT_HEADER_TAG_END
// 结束标记
.short 0
.long 8
multiboot_header_end:

.section .text.boot
.global _boot
.type _boot, @function
.extern _start
_boot:
ldr x30, =stack_top
mov sp, x30
// 获取启动核 ID
mrs x10, mpidr_el1
and x10, x10, #0xFF
add x10, x10, #1

// 按照每个 core 设置栈地址
lsl x10, x10, #12

// 按照每个 core 设置栈地址
ldr x11, =stack_top
add x11, x11, x10
mov sp, x11

// 保存传递的参数(假设传递的参数在 x0 和 x1 中)
// 开辟栈空间
stp x0, x1, [sp, #-16]! // 保存 x0 和 x1 到栈中

bl _start
b .

Expand Down
1 change: 1 addition & 0 deletions src/kernel/arch/arch.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
* @param argv 在不同体系结构有不同含义,同 _start
*/
auto ArchInit(uint32_t argc, const uint8_t *argv) -> uint32_t;
auto ArchInitSMP(uint32_t argc, const uint8_t *argv) -> uint32_t;

/// 最多回溯 128 层调用栈
static constexpr const size_t kMaxFrameCount = 128;
Expand Down
Loading

0 comments on commit 124e6c5

Please sign in to comment.