跳转至

Starry 运行基本应用

基本应用结构

基本应用位于项目的 apps目录下,每个应用都是一个文件夹,文件夹名即为应用名。每个应用文件夹下应当包含至少以下内容:

  • Makefile:编译应用的 Makefile 文件,需要提供 buildclean两个目标,分别用于编译和清理应用。
  • testcase_list:应用的测试用例列表,每行一个测试用例名,其中测例名对应的文件应当在执行 make build后生成。

项目默认提供了 juniorlibcnimbos三个基本应用,分别对应了 apps/juniorapps/libcapps/nimbos三个文件夹。

运行基本应用

运行基本应用前需要先获取依赖仓库:

1
./scripts/get_deps.sh

然后执行以下命令,来在特定平台上测试指定的应用:

1
2
3
4
5
6
# 为指定平台编译指定应用
make ARCH={arch} AX_TESTCASE={app_name} user_apps
# 切换到指定平台时需要重新生成配置
make ARCH={arch} defconfig
# 编译内核并运行指定应用
make ARCH={arch} LOG={log} AX_TESTCASE={app_name} BLK=y NET=y ACCEL=n run

其中:

  • {arch}为平台名,取值可以是 riscv64, x86_64, aarch64, loongarch64之一;
  • {app_name}为应用名,应该为前述 apps目录下的应用文件夹名,例如 junior, libc, nimbos等。
  • {log}为日志等级,取值可以是 off, error, warn, info, debug, trace之一。

特别地,对于 libc应用,运行时应当启用 fp_simd特性:

1
make ARCH={arch} AX_TESTCASE=libc BLK=y NET=y FEATURES=fp_simd ACCEL=n run

如果只想编译内核而不运行,可以将上述的 run 命令替换为 build,例如:

1
make ARCH={arch} LOG={log} AX_TESTCASE={app_name} BLK=y NET=y ACCEL=n build

编写自己的应用

添加简单的c程序

libc这个应用提供了编译单个源文件的c程序的功能,如果你想添加一个简单的c程序,可以直接在apps/libc/c目录下新建一个c文件,然后在testcase_list文件中添加该文件的名字即可。

添加预编译的二进制程序

bin这个应用提供了添加预编译的二进制程序的功能,如果你想添加一个预编译的二进制程序,可以直接在apps/bin/{arch}目录下添加你的二进制程序,然后在testcase_list文件中添加该文件的名字即可。

完全自定义应用

上面我们已经介绍了两种简单的添加测试用例的方法,如果你希望更进一步了解其中的原理,或者有添加复杂应用的需求,可以参考如下指引:

  1. apps目录下新建一个文件夹,文件夹名即为应用名,例如 myapp:
1
mkdir apps/myapp && cd apps/myapp
  1. 在该文件夹下新建 Makefile文件,需要包括 buildclean两个目标,内容如下:
1
2
3
4
5
6
7
all: build

build:
    @echo "Building myapp with arch $(ARCH)"

clean:
    @echo "Cleaning myapp"
  1. 在该文件夹下新建 testcase_list文件,列出所有测试用例的名字,每行一个,例如:
1
hello
  1. 编写应用程序,例如在该文件夹下新建 hello.c文件,内容如下:
1
2
3
4
5
6
7
8
#include "syscall.h"

int main()
{
    char msg[] = "Hello, World!\n";
    write(1, msg, sizeof(msg));
    return 0;
}
  1. Makefile中添加编译 hello的目标,例如:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
 CC = $(ARCH)-linux-musl-gcc
 CFLAGS = -static

 TARGET_DIR = build/$(ARCH)
 TARGET = $(TARGET_DIR)/hello

 all: build

 prepare:
     mkdir -p $(TARGET_DIR)

 build: prepare $(TARGET)

 $(TARGET): hello.c
     $(CC) $(CFLAGS) -o $@ $^

 clean:
     rm -f $(TARGET)

 .PHONY: all prepare build clean

关于Makefile的几点提示:

  • 编译用户程序时,会指定ARCH变量,需要以此考虑交叉编译工具链的选择;
  • 需要提供build目标,编译生成的文件需要放在build/$(ARCH)目录下;
  • 需要提供clean目标,用于清理编译生成的文件。
  • 如果你希望拷贝上面的Makefile示例,需要注意Makefile中的缩进是用制表符而不是空格。

  • 尝试编译和运行该应用,在项目根目录下执行:

1
2
3
make ARCH=x86_64 AX_TESTCASE=myapp user_apps
make ARCH=x86_64 defconfig
make ARCH=x86_64 LOG=error AX_TESTCASE=myapp BLK=y NET=y ACCEL=n run

评论

作者: Youjie Zheng (3.62%), dragon (96.38%)