From 13a19dccebb7df5b78d984ce26f8f3225dd5130a Mon Sep 17 00:00:00 2001 From: Minep Date: Sun, 20 Aug 2023 20:59:09 +0100 Subject: [PATCH] update readme for more up-to-date information chore: housekeeping stuff --- .gitignore | 1 + README.md | 10 +++++++- docs/img/boot_sequence.jpeg | Bin 0 -> 92837 bytes lunaix-os/README.md | 26 ++++++++++----------- lunaix-os/includes/lunaix/trace.h | 37 ++++++++++++++++++++++++++++++ lunaix-os/kernel/debug/trace.c | 15 ++++++------ 6 files changed, 68 insertions(+), 21 deletions(-) create mode 100644 docs/img/boot_sequence.jpeg diff --git a/.gitignore b/.gitignore index cd7d5b3..70b7f5e 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ workspace/ **.odp drafts/ +**.drawio \ No newline at end of file diff --git a/README.md b/README.md index 30dc1a2..064c6be 100644 --- a/README.md +++ b/README.md @@ -10,9 +10,17 @@ LunaixOS - 一个简单的,详细的,POSIX兼容的(但愿!),带有浓重个人风格的操作系统。开发过程以视频教程形式在Bilibili呈现:[《从零开始自制操作系统系列》](https://space.bilibili.com/12995787/channel/collectiondetail?sid=196337)。 +## 一些实用资源 + +如果有意研读LunaixOS的内核代码和其中的设计,以下资料可能会对此有用。 + ++ [内核虚拟内存的详细布局](docs/img/lunaix-os-mem.png) ++ [LunaixOS启动流程概览](docs/img/boot_sequence.jpeg) ++ LunaixOS总体架构概览(WIP) + ## 当前进度以及支持的功能 -该操作系统支持x86架构,运行在保护模式中,采用宏内核架构,目前仅支持单核心。内存结构采用经典的3:1划分,即低3GiB为用户地址空间(0x400000 ~ 0xBFFFFFFF),内核地址空间重映射至高1GiB(0xC0000000 ~ 0xFFFFFFFF)。内存的详细布局可参考[LunaixOS内存地图](docs/img/lunaix-os-mem.png) +该操作系统支持x86架构,运行在保护模式中,采用宏内核架构,目前仅支持单核心。架构与内核的解耦合工作正在进行中。 在下述列表中,则列出目前所支持的所用功能和特性。列表项按照项目时间戳进行升序排列。 diff --git a/docs/img/boot_sequence.jpeg b/docs/img/boot_sequence.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..0d57d3186556eb91118c151d6af6a54257383eb6 GIT binary patch literal 92837 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%0DE=N*ZS2e|A9^CI5uo`F1Qe=HIO&o8 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 L{&NPHe^34ofi{$n literal 0 HcmV?d00001 diff --git a/lunaix-os/README.md b/lunaix-os/README.md index f3d24d0..95df5cb 100644 --- a/lunaix-os/README.md +++ b/lunaix-os/README.md @@ -4,23 +4,23 @@ ## 目录结构 -+ `arch` 平台相关代码,LunaixOS的内核引导就在这里。 -+ `hal` 硬件抽象层,存放主板相关的代码,提供了一些访问主板功能(比如CPU,计时器)的抽象 ++ `arch` 平台,CPU架构相关代码。 ++ `hal` 硬件抽象层,包含了平台设备基本驱动的实现。 + `includes` 所有头文件 -+ `debug` 内核调试服务器 -+ `config` makefile配置问题 ++ `makeinc` makefile配置文件 + `kernel` 这里就是内核了 - + `asm` 共内核使用的,且平台相关的代码。 + + `block` 块IO抽象层 + + `debug` 内核调试服务器 + + `device` 设备(通用)抽象层 + `ds` 提供一些基本的数据结构支持。 + + `exe` 可执行文件的解析与加载。 + + `fs` 文件系统。 + `mm` 各类内存管理器。 + `peripheral` 外部设备驱动(如键盘)。 - + `time` 为内核提供基本的时间,计时服务。 - + `tty` 提供基本的显存操作服务。 - + `fs` 文件系统。 - + `device` 设备(通用)抽象层 - + `block` 块设备抽象层 + `process` 进程相关 - + `demos` 简单的测试程序 -+ `lib` 一些内核使用的运行时库,主要提供是内核模式下的一些C标准库里的实现。 + + `time` 为内核提供基本的时间,计时服务。 + + `tty` 提供基本的,CGA服务。 ++ `libs` 一些内核使用的运行时库,主要提供是内核模式下的一些C标准库里的实现。 + `link` 链接器脚本 -+ `scripts` 其他脚本(如:用于代码生成) \ No newline at end of file ++ `scripts` 其他脚本(如:用于代码生成) ++ `usr` 用户空间代码库,包含了一些实用的用户程序,编译过程独立与内核。 diff --git a/lunaix-os/includes/lunaix/trace.h b/lunaix-os/includes/lunaix/trace.h index 4fbddd9..9edf961 100644 --- a/lunaix-os/includes/lunaix/trace.h +++ b/lunaix-os/includes/lunaix/trace.h @@ -28,24 +28,61 @@ struct trace_context struct ksyms* ksym_table; }; +/** + * @brief Init the trace service using loaded modksyms module + * + * @param bhctx + */ void trace_modksyms_init(struct boot_handoff* bhctx); +/** + * @brief Locate the symbol which is the closest to given pc. + * + * @param pc + * @return struct ksym_entry* + */ struct ksym_entry* trace_sym_lookup(ptr_t pc); +/** + * @brief Walk the stack backwards to generate stack trace + * + * @param tb_buffer + * @param fp + * @param limit + * @param last_fp + * @return int + */ int trace_walkback(struct trace_record* tb_buffer, ptr_t fp, int limit, ptr_t* last_fp); +/** + * @brief Print the stack trace starting from the given frame pointer + * + * @param fp + */ void trace_printstack_of(ptr_t fp); +/** + * @brief Print the stack trace given the current interrupt context. In addition + * to the stacktrace, this will also print all context switches happened + * beforehand, and all stack trace in each context. Recommended for verbose + * debugging. + * + * @param isrm + */ void trace_printstack_isr(const isr_param* isrm); +/** + * @brief Print the stack trace starting from caller's frame pointer. + * + */ void trace_printstack(); diff --git a/lunaix-os/kernel/debug/trace.c b/lunaix-os/kernel/debug/trace.c index a3553f1..e43d873 100644 --- a/lunaix-os/kernel/debug/trace.c +++ b/lunaix-os/kernel/debug/trace.c @@ -1,5 +1,5 @@ -#include #include +#include #include #include #include @@ -23,13 +23,14 @@ trace_modksyms_init(struct boot_handoff* bhctx) for (size_t i = 0; i < bhctx->mods.mods_num; i++) { struct boot_modent* mod = &bhctx->mods.entries[i]; if (streq(mod->str, "modksyms")) { - // In case boot loader does not place our ksyms on page boundary - ptr_t start = PG_ALIGN(mod->start); + assert(PG_ALIGNED(mod->start)); + ptr_t end = ROUNDUP(mod->end, PG_SIZE); - ptr_t ksym_va = (ptr_t)ioremap(start, (end - start)); + ptr_t ksym_va = + (ptr_t)vmm_vmap(mod->start, (end - mod->start), PG_PREM_R); - trace_ctx.ksym_table = - (struct ksyms*)(ksym_va + (mod->start - start)); + assert(ksym_va); + trace_ctx.ksym_table = (struct ksyms*)ksym_va; } } } @@ -126,7 +127,7 @@ trace_printstack() trace_printstack_of(cpu_get_fp()); } -void +static void trace_printswctx(const isr_param* p, char* direction) { -- 2.27.0