This commit is contained in:
Linehu
2026-08-09 22:20:01 +08:00
parent 8717ea8f20
commit 2a50fa58c7
185 changed files with 19890 additions and 710 deletions
+35
View File
@@ -0,0 +1,35 @@
# Deshab SDK 应用 MAKEFILE 模板
#
# 由 scaffold/new-module.ps1 生成时自动替换:
# {{MODULE_NAME}} -> 模块名 (如 myapp)
# {{SDK_INC}} -> SDK include 目录相对路径 (如 ../../sdk/include)
# {{OUT_DIR}} -> 输出目录相对路径 (如 $(ROOT)/SYSTEM/system/deshab64/tools)
# {{BITMAPS}} -> ascii_bitmaps.c 相对路径 (如 ../../firstInit/ascii_bitmaps.c)
#
# 手动使用时替换上述占位符。
CC := clang
LD := ld.lld
ROOT := ../../..
OUT := {{OUT_DIR}}/{{MODULE_NAME}}.elf
CFLAGS := -target x86_64-unknown-none -std=c11 -ffreestanding -fno-builtin -fno-stack-protector -fpie -mno-red-zone -mno-sse -mno-sse2 -mno-mmx -msoft-float -m64 -Wall -Wextra -I{{SDK_INC}} -O2
LDFLAGS := -nostdlib -static -pie -z max-page-size=0x1000 -T linker.ld
C_SOURCES := main.c
OBJECTS := $(C_SOURCES:.c=.o)
.PHONY: all clean
all: $(OUT)
$(OUT): $(OBJECTS) linker.ld
@mkdir -p "$(dir $(OUT))"
$(LD) $(LDFLAGS) -o $@ $(OBJECTS)
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
powershell -NoProfile -Command "Get-ChildItem -Path . -Recurse -Filter *.o | Remove-Item -Force; if (Test-Path '$(OUT)') { Remove-Item '$(OUT)' -Force }"
+32
View File
@@ -0,0 +1,32 @@
/* Deshab SDK 应用 linker.ld 模板
*
* PIE ELF 布局,ENTRY(dsk_entry)。
* BSS 分离为独立 NOBITS 段,避免占文件空间。
* 与现有应用 (ping/editor/...) linker.ld 一致。
*/
ENTRY(dsk_entry)
PHDRS
{
text PT_LOAD FLAGS(5);
rodata PT_LOAD FLAGS(4);
data PT_LOAD FLAGS(6);
dynamic PT_DYNAMIC FLAGS(4);
}
SECTIONS
{
. = 0x1000;
.text : ALIGN(4K) { *(.text*) } :text
.rodata : ALIGN(4K) { *(.rodata*) } :rodata
.data : ALIGN(4K) {
*(.data*)
*(.data.rel.ro*)
*(COMMON)
} :data
.rela.dyn : ALIGN(8) { *(.rela.dyn*) } :data
.dynamic : ALIGN(8) { *(.dynamic*) } :data :dynamic
.bss : ALIGN(4K) {
*(.bss*)
} :data
}
+42
View File
@@ -0,0 +1,42 @@
/* Deshab SDK 应用入口模板
*
* 由 scaffold/new-module.ps1 生成时自动替换:
* {{MODULE_NAME}} -> 模块名
* {{BITMAPS}} -> ascii_bitmaps.c 相对路径
*
* 展示最小应用框架: 初始化上下文 -> 清屏 -> 标题栏 -> Esc 退出。
*/
#include "{{BITMAPS}}"
#include "deshab/deshab.h"
#include "deshab/font.h"
static dsb_app_context g_ac;
void dsk_entry(const dsk_boot_context *ctx) {
if (ctx->magic != DSK_BOOT_MAGIC) return;
dsb_app_init(&g_ac, ctx);
/* 清屏 */
dsb_fill_bg(&g_ac, DSB_BG_PRIMARY);
/* 标题栏 + 状态栏 */
dsb_draw_titlebar(&g_ac, "{{MODULE_NAME}}", (i64)g_ac.fb_w);
dsb_draw_statusbar(&g_ac, "Esc to exit", (i64)g_ac.fb_w, (i64)g_ac.fb_h);
/* 居中欢迎文字 */
const char *msg = "Hello from {{MODULE_NAME}}!";
i64 msg_w = (i64)dsb_strlen(msg) * 12;
i64 x = ((i64)g_ac.fb_w - msg_w) / 2;
i64 y = ((i64)g_ac.fb_h) / 2;
dsb_draw_string(&g_ac, msg, x, y, DSB_TEXT_PRIMARY, DSB_BG_PRIMARY, 12);
/* 等待 Esc 键退出 */
for (;;) {
u8 st = dsb_inb(0x64);
if (st & 1) {
u8 sc = dsb_inb(0x60);
if (sc == 1) break; /* Esc make code */
}
__asm__ volatile("pause");
}
}
+56
View File
@@ -0,0 +1,56 @@
/* Deshab SDK 驱动入口模板
*
* 由 scaffold/new-module.ps1 生成时自动替换:
* {{MODULE_NAME}} -> 驱动名 (如 mydriver)
* {{CLASS}} -> DKM_CLASS_* 类别 (如 DKM_CLASS_MISC)
* {{STAGE}} -> 加载阶段 0-3
*
* 展示最小 DKM 驱动框架: driver_desc + driver_init + driver_exit。
* 构建方式: clang -c main.c -> ld.lld -r -o {{MODULE_NAME}}.drv main.o
* (见 scaffold/driver/build.ps1 片段或 build.ps1 的 Build-DkmDriver)
*/
#include "deshab/driver.h"
#include "deshab/serial.h"
static const dkm_log_api *g_log = 0;
static const char *const g_depends[] = { 0 };
static const char *const g_provides[] = { "{{MODULE_NAME}}" };
__attribute__((visibility("default")))
const dkm_driver_desc driver_desc = {
.magic = DKM_DRIVER_MAGIC,
.abi_version = DKM_ABI_VERSION,
.desc_size = sizeof(dkm_driver_desc),
.name = "{{MODULE_NAME}}",
.version = "1.0",
.vendor = "Deshab",
.driver_class = {{CLASS}},
.stage = {{STAGE}},
.flags = 0,
.priority = 100,
.depends = g_depends,
.depends_count = 0,
.provides = g_provides,
.provides_count = 1,
.min_kernel_abi = DKM_KERNEL_API_VERSION,
.feature_bits = 0,
};
__attribute__((visibility("default")))
int driver_init(const dkm_kernel_api *api, dkm_driver_handle *handle) {
(void)handle;
if (!api || !api->log) return -1;
g_log = api->log;
g_log->info("[{{MODULE_NAME}}] init begin");
/* TODO: 驱动初始化逻辑 */
g_log->info("[{{MODULE_NAME}}] driver ready");
return 0;
}
__attribute__((visibility("default")))
int driver_exit(dkm_driver_handle *handle) {
(void)handle;
if (g_log) g_log->info("[{{MODULE_NAME}}] exit");
return 0;
}
+94
View File
@@ -0,0 +1,94 @@
<#
.SYNOPSIS
Deshab SDK 一键创建新应用/驱动模块脚手架。
.DESCRIPTION
从 CODE/sdk/scaffold/ 模板生成新模块,自动替换占位符并计算相对路径。
.PARAMETER Name
模块名(如 myapp、mydriver)。
.PARAMETER Type
模块类型:app(应用 .elf)或 driver(驱动 .drv)。默认 app。
.PARAMETER OutDir
输出目录。默认 app -> CODE/tools/$Name,driver -> CODE/DKM/$Name。
.PARAMETER Class
驱动类别(DKM_CLASS_*)。仅 Type=driver 时使用。默认 DKM_CLASS_MISC。
.PARAMETER Stage
驱动加载阶段 0-3。仅 Type=driver 时使用。默认 3。
.EXAMPLE
.\new-module.ps1 -Name myapp
.\new-module.ps1 -Name mydriver -Type driver -Class DKM_CLASS_NET -Stage 3
#>
param(
[Parameter(Mandatory=$true)][string]$Name,
[ValidateSet('app','driver')][string]$Type = 'app',
[string]$OutDir,
[string]$Class = 'DKM_CLASS_MISC',
[int]$Stage = 3
)
$ErrorActionPreference = 'Stop'
$SdkDir = [System.IO.Path]::GetFullPath((Join-Path $PSScriptRoot '..'))
$CodeDir = [System.IO.Path]::GetFullPath((Join-Path $SdkDir '..'))
$RootDir = [System.IO.Path]::GetFullPath((Join-Path $CodeDir '..'))
if (-not $OutDir) {
if ($Type -eq 'app') {
$OutDir = Join-Path $CodeDir "tools\$Name"
} else {
$OutDir = Join-Path $CodeDir "DKM\$Name"
}
}
$OutDir = [System.IO.Path]::GetFullPath($OutDir)
if (Test-Path $OutDir) { throw "目录已存在: $OutDir" }
New-Item -ItemType Directory -Force -Path $OutDir | Out-Null
# 计算从 $from 到 $to 的相对路径(反斜杠)
function Get-RelPath($from, $to) {
$fromUri = [System.Uri]::new($from.TrimEnd('\') + '\')
$toUri = [System.Uri]::new($to.TrimEnd('\') + '\')
if (Test-Path $to -PathType Leaf) {
$toUri = [System.Uri]::new($to)
}
return $fromUri.MakeRelativeUri($toUri).ToString().Replace('/', '\')
}
if ($Type -eq 'app') {
$SdkInc = Get-RelPath $OutDir (Join-Path $SdkDir 'include')
$Bitmaps = Get-RelPath $OutDir (Join-Path $CodeDir 'firstInit\ascii_bitmaps.c')
$OutPath = Join-Path $RootDir "SYSTEM\system\deshab64\tools\$Name.elf"
$OutDirR = Get-RelPath $OutDir (Split-Path $OutPath -Parent)
# MAKEFILE
$mf = Get-Content (Join-Path $SdkDir 'scaffold\app\MAKEFILE.tmpl') -Raw
$mf = $mf.Replace('{{MODULE_NAME}}', $Name).Replace('{{SDK_INC}}', $SdkInc).Replace('{{OUT_DIR}}', $OutDirR)
Set-Content (Join-Path $OutDir 'MAKEFILE') $mf -NoNewline
# linker.ld
Copy-Item (Join-Path $SdkDir 'scaffold\app\linker.ld.tmpl') (Join-Path $OutDir 'linker.ld')
# main.c
$mc = Get-Content (Join-Path $SdkDir 'scaffold\app\main.c.tmpl') -Raw
$mc = $mc.Replace('{{MODULE_NAME}}', $Name).Replace('{{BITMAPS}}', $Bitmaps)
Set-Content (Join-Path $OutDir 'main.c') $mc -NoNewline
Write-Host "[sdk] 应用 '$Name' 已创建: $OutDir" -ForegroundColor Green
Write-Host "[sdk] 构建: cd $OutDir ; make" -ForegroundColor Cyan
Write-Host "[sdk] 输出: $OutPath" -ForegroundColor Cyan
} else {
# main.c
$mc = Get-Content (Join-Path $SdkDir 'scaffold\driver\main.c.tmpl') -Raw
$mc = $mc.Replace('{{MODULE_NAME}}', $Name).Replace('{{CLASS}}', $Class).Replace('{{STAGE}}', [string]$Stage)
Set-Content (Join-Path $OutDir 'main.c') $mc -NoNewline
Write-Host "[sdk] 驱动 '$Name' 已创建: $OutDir" -ForegroundColor Green
Write-Host "[sdk] 构建: clang -target x86_64-unknown-none -std=c11 -ffreestanding -fno-builtin -fno-stack-protector -fno-pic -fno-pie -mcmodel=kernel -mno-red-zone -mno-sse -mno-sse2 -mno-mmx -msoft-float -m64 -Wall -Wextra -I$(Join-Path $SdkDir 'include') -O2 -c main.c -o $Name.o" -ForegroundColor Cyan
Write-Host " ld.lld -r -o $Name.drv $Name.o" -ForegroundColor Cyan
Write-Host "[sdk] 注册: 在 SYSTEM/driver/manifest.json 添加条目" -ForegroundColor Yellow
Write-Host "[sdk] 预加载: 在 SYSTEM/boot/limine.conf 添加 module_path" -ForegroundColor Yellow
}