我正在学习Device Driver
和Kernel
编程。根据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);
这里我有两个问题:
main()
功能?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.
start_kernel
几种查看方式:
对于main()
,您可能是指main()
对程序而言,即其“入口点”。
是的,Linux内核具有主要功能,它位于arch / x86 / boot / main.c文件中。但是内核执行是从arch / x86 / boot / header.S汇编文件开始的,并且main()函数是通过“ calll main”指令从那里调用的。这是主要功能:
虽然函数名main()只是一个常规约定(没有真正的理由在内核模式下使用它),但Linux内核确实对许多体系结构都有main()函数,当然usermode linux具有main函数。