一尘不染

Linux内核有主要功能吗?

linux

我正在学习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()功能吗?

阅读 223

收藏
2020-06-07

共1个答案

一尘不染

从根本上讲,例程的命名没有什么特别的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.
2020-06-07