问题描述
第一个问题,就这样吧。
我不是要求有人审查代码,我想深入了解这一点。 如果有人知道内核中的哪些更改可能导致以下情况,那将会很有帮助。
在大学里,我们的任务是在用 C 编写的建模操作系统(由我的教授编写)中实现扩展功能,该操作系统使用 pthread 对每个内核进行建模。
项目 github 由我分叉。
我们必须通过实现所需的系统调用来实现必要的功能。 (多线程、套接字、管道、mlfq 等)。
在实现每项功能后,我们必须使用 validate_api 程序确认它是否正常工作。
问题时间:
validate_api.c 包含大量用于检查操作系统功能的测试。
BOOT_TEST:裸启动机器并测试一些东西。
在进程内创建新线程的简单测试:
BOOT_TEST(test_create_join_thread,"Test that a process thread can be created and joined. Also,that "
"the argument of the thread is passed correctly."
)
{
int flag = 0;
int task(int argl,void* args) {
ASSERT(args == &flag);
*(int*)args = 1;
return 2;
}
Tid_t t = CreateThread(task,sizeof(flag),&flag);
/* Success in creating thread */
ASSERT(t!=NOTHREAD);
int exitval;
/* Join should succeed */
ASSERT(ThreadJoin(t,&exitval)==0);
/* Exit status should be correct */
ASSERT(exitval==2);
/* Shared variable should be updates */
ASSERT(flag==1);
/* A second Join should fail! */
ASSERT(ThreadJoin(t,NULL)==-1);
return 0;
}
如您所见,有一个名为 task() 的嵌套函数,它是将使用 createThread() 系统调用创建的线程的起点我们实施了。
问题是,虽然线程创建正确,但在调度运行时,程序以分段错误退出,无法访问任务函数的内存,gdb甚至无法识别作为变量(在指向它的 thread struct field 中)。 奇怪的是,只有在使用高于 5.7 的内核版本时才会发生这种情况。我在原始项目的存储库中打开了一个 issue。
运行实际的操作系统及其程序没有任何问题,只有 validate_api 由于该嵌套函数而失败。如果我将任务函数移动到全局范围内,则测试成功完成。其他所有包含嵌套函数的测试也是如此。
注意:项目已经完成(现在 1 个月),我降级到 5.4 只是为了测试我的实现。
注意2:我不需要任何功能的实现帮助(项目以任何方式完成),我只想弄清楚为什么它在内核> 5.7上不起作用
注3:我来这里是因为我的教授。不回复我重复发送的有关该问题的电子邮件
我尝试使用 -fno-stack-protector 和 -z execstack 进行编译,但没有成功。还有简单的嵌套函数,例如:
int main(){
int foo(){
puts("Hello there");
}
foo();
}
使用任何内核
机器详细信息:
Arch Linux - 5.10 / 5.4 LTS
海湾合作委员会 10.2
谢谢
更新: 测试加入线程,所以它永远不会超出范围。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)