内核有main()函数吗?[关闭]


52

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

所以我有两个问题:

  • 为什么我们不需要main()设备驱动程序中的功能?
  • 内核本身是否具有main()功能?

谁可以给我解释一下这个?


1
也在同一位
Keith Thompson

@KeithThompson ...是的...只是因为我没有得到想要的答案,所以我在这里问了。
某人

@Shadur ...无论如何现在它都将要关闭...而且我没有特权迁移它...
某人

应该以相反的方式将其关闭,但该视图具有更多视图:-)
Ciro Santilli新疆改造中心法轮功六四事件

Answers:


82

在用户空间程序中,是执行二进制文件时由libc初始化代码调用main()的程序的入口。内核代码没有奢侈地依赖libc,因为libc本身依赖于内核syscall接口进行内存分配,I / O,进程管理等。

就是说,main()内核代码中的等价于start_kernel(),它在加载内核映像,将其解压缩到内存并设置必要的硬件和内存分页之后由引导程序调用start_kernel()执行大多数系统设置,并最终生成init进程。

Linux内核模块的入口点是一个初始化函数,该函数通过调用module_init()宏在内核中注册。然后do_initcalls()在内核启动过程中,内核代码通过该函数调用已注册的模块init函数。


11
感谢您认识到mainC语言中方法的真正目的。(这是一种普遍的误解,认为OS会直接调用main,这不是这种情况,在C ++中更是如此。) d如果我可以的话,再给你一个支持。
CVn

1
@Thomas ...感谢这个优秀的答案....

17

内核没有main功能。 main是C语言的概念。内核是用C和汇编语言编写的。内核的入口代码是由汇编编写的。

引导顺序组织如下:

  1. BIOS通常从引导块设备加载引导加载程序。目前流行的引导加载程序是grub。
  2. Grub可以使用初始根设备(initrd)将内核映像加载到ram中。然后执行某个地址处的代码。
  3. 内核映像具有一些内核模块,例如:文件系统模块,设备驱动程序。内核映像使用文件系统模块挂载根文件系统。现在,内核可以从磁盘加载并运行所有内核模块。
  4. 内核运行初始化任务。例如:遍历PCI总线并找到所有PCI设备,初始化所有设备驱动程序。
  5. 最后,内核创建进程0和进程1(init进程),将CPU的上下文从环0切换到环3,并启动初始化进程(进程ID为1)。现在内核启动完成了!
  6. init程序将运行所有初始化脚本。所有服务启动。壳被称为。用户可以登录。

main函数是C函数。实际上,主要方法不是C程序的入口。C运行时在之前调用了许多函数main。GCC具有扩展功能:构造函数。声明为“构造函数”的函数在之前被调用main

例如:

/* This should not be used directly. Use block_init etc. instead. */ 
#define module_init(function, type) \
    static void _attribute__((constructor)) do_qemu_init ## function(void) { \
    register_module_init(function, type); \
} 

该宏来自qemu项目。


Main方法是ac方法。实际上main方法不是c程序的入口.C runtime在main方法之前调用了许多方法。
沉德华

好吧,BIOS通常会加载一个引导加载程序,而该引导加载程序会加载内核映像(可能还有一个initrd)。内核的代码是内核映像中,没有的initrd
斯特凡Chazelas

GCC具有扩展功能:构造函数。在主方法之前调用方法声明“构造函数”。例如:/ *不应直接使用。请改用block_init等。* / #define module_init(function,type)\ static void _attribute __((constructor))do_qemu_init ## function(void){\ register_module_init(function,type); \}
Edward Shen

1
initrd.img 不是内核映像。它是内核在引导时加载的一组模块。内核映像通常以“ vmlinuz”开头,但各个发行版之间的名称有所不同。
13年

3
这个答案充满了“一切都是PC / Linux / i86”,它以这种方式引导,内核是那样...为什么每个人都认为这是世界上唯一可能的方式?
詹斯

9

例如,arch / x86 / boot / main.c中有一个main()函数,用于使系统准备从实模式切换到保护模式,但其他体系结构则没有这样的代码。很好地概述了如何在x86平台上引导Linux内核2.6.x。真的值得一读。

根据文档HOWTO做Linux内核开发,Linux内核是

一个独立的C环境,不依赖于标准C库,因此不支持C标准的某些部分。

根据C标准BTW的含义是什么

由实现定义,是否需要在独立环境中的程序来定义“主要”功能。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.