# fzOS-kernel
**Repository Path**: fzos-dev/fzOS-kernel
## Basic Information
- **Project Name**: fzOS-kernel
- **Description**: 如题所示,一个简单的UEFI OS内核。
- **Primary Language**: C
- **License**: WTFPL
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2022-03-04
- **Last Updated**: 2024-03-05
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README

# fzOS-kernel
#### Kernel source code for fzOS.
#### fzOS内核源码,
#### 这是一个充满了神奇实现的 AMD64/X86-64 内核
#### 目前fzOS只支持也只打算支持UEFI启动
#### 也不打算支持32位(毕竟谁2202年了谁还用32位)
## External Libraries
LAI(https://github.com/managarm/lai/) for ACPI Parsing
## Note for compiler 关于编译器版本可能对当前版本kernel导致的编译失败
+ lower/equal than gcc-10 is not suitable due to the asm goto support
+ 请使用高于 gcc-10 的 GNU-GCC编译器进行编译 (由于random部分使用了asm汇编的goto,其中的部分方法在gcc<=10不被支持)
+ link (https://gcc.gnu.org/onlinedocs/gcc-10.2.0/gcc/Extended-Asm.html#Goto-Labels)
+ 链接 (https://gcc.gnu.org/onlinedocs/gcc-10.2.0/gcc/Extended-Asm.html#Goto-Labels)
+ Before GCC-11, an asm goto statement cannot have outputs.
+ 在 gcc-11 之前,asm goto 声明不支持 output 参数。
+ further link (https://github.com/gcc-mirror/gcc/blob/releases/gcc-10/gcc/c/c-parser.c)
+ 链接 (https://github.com/gcc-mirror/gcc/blob/releases/gcc-10/gcc/c/c-parser.c)
+ In GCC-10, For asm goto, we don't allow output operands, but reserve the slot for a future extension that does allow them.
+ 在 gcc-10 中,对于 asm goto 指令,暂时不支持输出操作,但是这个指令位置被保留,作为对未来可能更新的预留
## Install/Compile Guidence 安装/编译说明
#### 编译环境
+ 操作系统
+ 请使用 linux 作为编译环境 (其中 debian 和 arch linux 分别是我们的开发环境)
+ macOS下有许多奇怪的问题,反正我是没成功编译,而且结果需要是elf而不是mach-O
+ 没人用 windows, 所以就不讨论这个系统了
+ docker 使用 build 的 gcc11 会有一些奇怪的问题
+ 软件和编译器
+ 需要:GCC, build-essential, gnu-efi
+ GCC需要高于版本11, 目前开发使用的是 GCC-11.2.0
+ clang 由于asm语法上的问题,可能需要一些小小的改动
+ 内联 ASM 用的是 AT&T 语法
+ 编译
+ 在文件夹里 make 就行了
+ 结果是 build/kernel 这个可执行文件
+ 运行/测试
+ 去隔壁 fzBurg 找一下 efi 引导文件
+ 直接用vso文件,
+ 需要另一个linux虚拟机设置磁盘系统
+ 然后去虚拟机
## 命名规范
#### 请尤其注意下列保留区段.jpg
+ 变量
+ 常规变量使用 小写下划线命名 ( 例如: bss_info )
+ 全局变量使用 g_小写下划线命名( 例如: g_gui_service_window_list )
+ 宏定义
+ 全大写下划线命名 ( 例如: GUI_DEFAULT_WINDOW_SIZE )
+ 下划线开头结尾的全大写( 例如: _GUI_DEFAULT_WINDOW_SIZE_ )
+ 结构体
+ 驼峰命名 ( 例如: TestVariableType )
+ 函数
+ 小写下划线
## 开发路线
### 这块现在理清了
#### 领袖说过:自己动手,丰衣足食。
#### burg引导器同步开发中
+ [x]Step1: 用图形模式实现一个字符显示输出;(helloworld)这个完成了,kernel log 支持字符串输出;
+ [x]Step2: 基本实现了U64的16进制和10进制输出;
+ [x]Step3: 实现CPU段表的设置, 接管内存分配;
+ [x]Step4: 实现基础的中断程序和TSS任务表设置;
+ [x]Step5: 实现基础的键盘驱动程序;
+ [x]Step6: 实现完整的ACPI支持,完成“高级电源管理”;
+ [x]Step7: 实现文件系统;
+ [x]Step8: 实现设备树;
+ [x]Step9: 实现JVM的类加载器;
+ [x]Step10: 实现JVM的基础指令;
+ [ ]Step11: 实现JVM的堆机制;
+ [ ]Step12: 实现System类,与Kernel ABI交互;
+ [ ]Step13: 与JVM并行线,GUI开发
+ [x]Step14: 与JVM并行线,实现HDA声卡驱动;
+ [x]Step15: 实现WAV格式的音频播放;
# File Structure
### 定义用的头文件
+ 定义了基础整型单位;
+ 定义了与UEFI相关的代码需要包含的头文件;
+ 定义了当前系统的一些限制;
---
## common
### cpuid.c;
+ 实现cpu信息的获取;
### file.c;
+ 基本文件结构体的实现;
### halt.c;
+ 基本CPU状态管理(停机+死机);
### io.c;
+ I/O操作的简单包装;
### kstring.c;
+ 简单的内存/字符串操作;
### linkedlist.c;
+ 数据结构(链表)的实现:双向链表;
### popcount.c;
+ 实现POPCNT指令;
### power_control.c;
+ 高级电源管理(关机/重启)的实现;
### printk.c;
+ 实现变量的10进制和16进制显示;
### queue.c;
+ 实现队列数据结构;
### registers.c;
+ msr寄存器的操作;
### semaphore.c & spinlock.c;
+ 两种进程同步的结构体(信号量/自旋锁);
---
## drivers
### devicetree.c;
+ 设备树的结构;
### graphics.c;
+ 初始化屏幕;
+ 实现清屏;
+ 刷写像素;
+ 计算字符相对位置;
+ 屏幕内容整体上移;
### fbcon.c;
+ 实现ASCII字符输出;
+ 实现换行和满屏后向上刷新;
### gpt.c;
+ GUID分区图的识别;
### keyboard.c;
+ 基础键盘的处理;
### pci_bus.c;
+ PCI总线驱动;
### rtc.c;
+ 实时时钟驱动;
### sata_ahci.c;
+ AHCI模式的Serial ATA设备驱动;
---
## filesystem
### filesystem.c
+ 通用文件系统操作;
### fhhfs.c
+ fhhfs文件系统驱动;
---
## interrupt
### interrupt.c;
+ 异常以及irq的声明;
### irq.c;
+ 外部中断芯片的初始化;
---
## memory
### gdt.c;
+ 设置cpu段表;
### memory.c;
+ 内存的分配与回收;
### memorysetup.c;
+ 内存空闲空间的接管;