【问题标题】:Kernel as a dynamic linker paradigm?内核作为动态链接器范例?
【发布时间】:2018-06-11 13:11:12
【问题描述】:

我正在尝试查找是否有此概念的名称,以及是否已经做过类似的事情:

您是否知道任何操作系统(或任何内核设计范例),其中用户级程序不使用通常的陷阱/中断/cpu 指令技术发出系统调用,而是内核在任何时候都表现为运行时动态链接器运行可执行文件,以便内核加载可执行文件,定位未解析的系统调用,将它们附加到内核中适当的系统调用挂钩,然后运行可执行文件?

将可执行文件想象成存储在 ROM 芯片中的程序:系统加载 ROM,插入所有未解决的钩子,然后启动进程。我不是在考虑 ROM 程序,但我认为它澄清了这个想法。

编辑: 我并不是说应用程序在内核空间中运行。内核中的函数进入时会切换到内核空间,返回应用程序时会切换回用户空间。我的意思是所有关于“调用内核”的魔法都发生在内核中,因为内核和动态加载器是同一回事。用户级库就像没有内核一样(用户级库没有任何方法可以“调用内核”,但是缺少用户级库中某些功能的实现,因为加载应用程序时,内核会将它们挂钩到内核代码)。

【问题讨论】:

  • Windows 操作系统使用类似的东西(参见informit.com/articles/article.aspx?p=22442
  • @xmojmr:很有启发性!非常感谢您指出这一点。也许我在想一个非常相似的方法,但我需要更详细地阅读这篇文章。

标签: linker operating-system kernel


【解决方案1】:

对于编写在内核空间中运行的模块,它的工作方式或多或少是相同的。像设备驱动一样可以直接调用另一个模块。

对于用户空间应用程序运行内核功能 - 这是不允许的,主要是为了保护。在像 DOS 这样的早期操作系统中,没有任何保护,实际上可以从任何应用程序调用任何一段代码。 BIOS 功能实际上存储在 EEPROM 芯片和应用程序中,知道映射的地址,就可以调用它们。不过也不是很好。

我从事内核模式模块工作已经 10 年了。从那以后情况可能会发生变化。

【讨论】:

  • 我并不是说应用程序在内核空间中运行。内核中的函数进入时会切换到内核空间,返回应用程序时会切换回用户空间。我的意思是所有关于“调用内核”的魔法都发生在内核中,因为内核和动态加载器是同一回事。用户级库就像没有内核一样。但是,当用户级库中缺少的函数被内核挂钩时。我将编辑我的问题并添加此注释以进一步澄清。
  • 我不确定我是否 100% 理解您的意思(可能是因为我在该领域长期不活跃)- 但让用户空间应用程序允许跳远的主要问题内核内存是安全的。像 Windows 这样的操作系统在虚拟内存中有单独的内核和用户空间区域,可以轻松实现您的建议。但是不通过大门可能会导致很多安全问题。当然可以节省时间。保护这个世界的东西花了多少钱!!
  • 不,应用程序不执行“长跳转到内核内存”。这样看:open() libc 函数的实现通常会发出一个系统调用。而不是这个,我要说的是 libc 中将缺少 open() 实现。当内核(也将是动态链接器)加载应用程序时,它将实现应用程序调用open()。因此内核会将open() 调用挂钩到open() 的内核实现。所以你提到的“安全门”也将存在,但在内核中完成,而不是在用户空间库中。
猜你喜欢
  • 2018-09-30
  • 1970-01-01
  • 2013-11-02
  • 2015-05-29
  • 2011-10-14
  • 2022-01-16
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多