当前位置: 首页 > 面试题库 >

Linux内核有主要功能吗?

邵绪
2023-03-14
问题内容

我正在学习Device DriverKernel编程。根据Jonathan Corbet的书,我们没有main()设备驱动程序中的功能。

#include <linux/init.h>
#include <linux/module.h>

static int my_init(void)
{
     return  0;
}

static void my_exit(void)
{
     return;
}

module_init(my_init);
module_exit(my_exit);

在这里我有两个问题:

  1. 为什么我们不需要main()设备驱动程序中的功能
  2. 内核有main()功能吗?

问题答案:

从根本上讲,例程的命名没有什么特别的main()。如上所述,它main()充当可执行加载模块的入口点。但是,您可以为装入模块定义不同的入口点。实际上,您可以定义多个入口点,例如,引用您喜欢的dll。

从操作系统(OS)的角度来看,它真正需要的只是充当设备驱动程序的代码的入口点的地址。当需要设备驱动程序对设备执行I /
O时,操作系统会将控制权传递给该入口点。

系统程序员定义(每个OS都有自己的方法)设备之间的连接,用作设备驱动程序的加载模块以及加载模块中入口点的名称。

每个操作系统都有其自己的内核(显然),并且某些操作系统可能/可能以它开始,main()但是我很惊讶地发现一个使用main()了非简单内核(例如UNIX)的内核!在编写内核代码时,您已经远远超出了将每个模块命名为的要求main()

希望这可以帮助?

从Unix版本6的内核中找到此代码段。您可以看到,main()这只是另一个程序,试图开始!

main()
{
     extern schar;
     register i, *p;
     /*
     * zero and free all of core
     */

     updlock = 0;
     i = *ka6 + USIZE;
     UISD->r[0] = 077406;
     for(;;) {
        if(fuibyte(0) < 0) break;
        clearsig(i);
        maxmem++;
        mfree(coremap, 1, i);
         i++;
     }
     if(cputype == 70) 
     for(i=0; i<62; i=+2) {
       UBMAP->r[i] = i<<12;
       UBMAP->r[i+1] = 0;
      }

    // etc. etc. etc.


 类似资料:
  • 问题内容: 我正在测试内核异步io函数(不是posix aio),并试图弄清楚它是如何工作的。下面的代码是一个完整的程序,其中我简单地将一个数组重复写入使用O_DIRECT打开的文件中。我在回调函数中收到一个错误“写错的字节期望1024得到0”(请参阅​​work_done()中的fprintf语句)。 对于不熟悉内核aio的用户,以下代码将执行以下操作: 初始化一些结构 准备AIO(io_pre

  • 本章节帮助用户快速了解 云联壹云 平台的主要功能. 监控 介绍监控告警的内容 多云管理 介绍标签管理、虚拟机的创建和连接的内容。 费用管理 介绍费用分析、预算、费用优化以及RI分析的内容。 认证与安全 介绍安全检查、安全告警、操作日志的内容。

  • 问题内容: 在不深入了解 为什么 的细节的情况下,我正在寻找一种干净的(尽可能)的方法来替换可加载模块中的内核函数和系统调用。我最初的想法是编写一些代码来覆盖某些功能,这些功能将采用原始功能(可能的话, 调用 该功能),然后添加一些自己的代码。关键是我编写的函数必须具有原始函数的名称,因此其他代码在尝试访问它时将改为访问我的函数。 通过将代码放入适当的函数中,我可以轻松地(相对地)直接在内核中执行

  • 很小的额外开销 NSIS 具有体积小、速度快和高效率的特点。当其它安装程序动辄需要几百 KB 或好几 MB 的安装程序数据,而一个具有完整功能的 NSIS 安装程序仅占用了 34 KB 的额外开销。 兼容所有主流的 Windows 操作系统 你可以创建兼容于 Windows 95、Windows 98、Windows ME、Windows NT、Windows 2000、Windows XP 和

  • 问题内容: 我在暑期研究中从事内核工作。我们希望在特定的RTT计算中对TCP进行修改。我想做的是将tcp_input.c中的功能之一的分辨率替换为由动态加载的内核模块提供的功能。我认为这将改善我们开发和分发修改的速度。 我感兴趣的函数被声明为静态的,但是我用非静态函数重新编译了内核,并由EXPORT_SYMBOL导出。这意味着该功能现在可供内核的其他模块/部分访问。我已经通过“ cat / pro

  • 问题内容: 该函数是goroutine吗?例如,我看到了如下的崩溃堆栈跟踪,这让我问: 问题答案: 是的,主要功能在goroutine(主要程序)中运行。 根据https://tour.golang.org/concurrency/1 goroutine是Go运行时管理的轻量级线程。 开始 运行 新的goroutine。对f,x,y和z的求值发生在 当前goroutine中 ,而执行则发生在 新的