我正在学习Device Driver和Kernel编程。根据Jonathan Corbet的书,我们没有main()设备驱动程序中的功能。
Device Driver
Kernel
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);
在这里我有两个问题:
从根本上讲,例程的命名没有什么特别的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.