微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在内核版本 > 5.7

如何解决在内核版本 > 5.7

一个问题,就这样吧。

我不是要求有人审查代码,我想深入了解这一点。 如果有人知道内核中的哪些更改可能导致以下情况,那将会很有帮助。

在大学里,我们的任务是在用 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?