Arceos-monolithic / Starry

An experimental modular OS written in Rust.
http://rcore-os.cn/arceos/
Apache License 2.0
12 stars 15 forks source link

cyclictest问题(无效的系统调用) #15

Closed apengaaa closed 7 months ago

apengaaa commented 7 months ago

cyclictest:

[ 41.573276 0:8 axruntime::lang_items:5] panicked at ulib/axstarry/syscall_task/src/lib.rs:132:13:
Invalid Syscall Id: SCHED_GETAFFINITY!

进行了一个无效的系统调用ID,是用来检索CPU亲和性的

scPointer commented 7 months ago

这个系统调用在 riscv 那边给了,忘记放到 x86_64 这边。最迟本周内可以修复。

这应该不影响 CI 测试,就直接先输出“cyclictest 执行错误”之类的信息就好了,没过就是没过

scPointer commented 7 months ago

@apengaaa 添加 FEATURES=schedule 运行可以跑完整个测试。具体来说,将测例改为 busybox sh ./cyclictest_testcode.sh 之后,在 x86_64 下运行类似命令:

./build_img
make run FEATURES=schedule

可以得到这样的输出:

====== cyclictest NO_STRESS_P1 begin ======
unable to get scheduler parameters
Hangup
====== cyclictest NO_STRESS_P1 end: fail ======
====== cyclictest NO_STRESS_P8 begin ======
unable to get scheduler parameters
Hangup
====== cyclictest NO_STRESS_P8 end: fail ======
====== start hackbench ======
Running in process mode with 10 groups using 40 file descriptors each (== 400 tasks)
Each sender will pass 100000000 messages of 100 bytes
Creating fdpair (error: Address family not supported by protocol)
====== cyclictest STRESS_P1 begin ======
unable to get scheduler parameters
Hangup
====== cyclictest STRESS_P1 end: fail ======
====== cyclictest STRESS_P8 begin ======
unable to get scheduler parameters
Hangup
====== cyclictest STRESS_P8 end: fail ======
====== kill hackbench: success ======

你可能会注意到大部分测例都有 unable to get scheduler parameters 报错。我们已经定位到,作为二进制文件的测例本身存在问题,目前大致分为以下三种情况:

我们正在研究如何编出正确的 musl 版本测例,或是在 Starry 中改进 glibc 支持。不过即使之后可能替换掉测例仓库的 cyclictest 这个文件,但测试接口不变,所以这应该不影响 CI 那边的工作。

elliott10 commented 7 months ago

cyclictest 运行问题修复

当使用基于musl libc的编译器去编译cyclictest时,生成的程序在Linux及Starry上运行时,都会报错 unable to get scheduler parameters.

跟踪该问题发现在musl libc库中,sched_setscheduler的实现直接返回-ENOSYS错误码,并未实现函数体及系统调用应有的功能,如下代码段。

类似sched功能的函数, 未实现直接返回错误码的函数还包括:sched_getparam, sched_getscheduler, sched_setparam, sched_setscheduler

int sched_setscheduler(pid_t pid, int sched, const struct sched_param *param)
{
        return __syscall_ret(-ENOSYS);
}

找到问题原因后,补齐修复这些函数即可。。。

修改的代码请见:https://github.com/oscomp/testsuits-for-oskernel/commit/ff6e2c51c5b9c365d1813e8ed37b6b8b8c3977fa

修复后生成的多个架构测试用例请见:https://github.com/rcore-os/testsuits-for-oskernel/releases/tag/pre-20240309