我正在学习设备驱动程序和内核编程。根据Jonathan Corbet的书,main()
设备驱动程序中没有功能。
所以我有两个问题:
- 为什么我们不需要
main()
设备驱动程序中的功能? - 内核本身是否具有
main()
功能?
谁可以给我解释一下这个?
我正在学习设备驱动程序和内核编程。根据Jonathan Corbet的书,main()
设备驱动程序中没有功能。
所以我有两个问题:
main()
设备驱动程序中的功能?main()
功能?谁可以给我解释一下这个?
Answers:
在用户空间程序中,是执行二进制文件时由libc初始化代码调用main()
的程序的入口。内核代码没有奢侈地依赖libc,因为libc本身依赖于内核syscall接口进行内存分配,I / O,进程管理等。
就是说,main()
内核代码中的等价于start_kernel()
,它在加载内核映像,将其解压缩到内存并设置必要的硬件和内存分页之后由引导程序调用。start_kernel()
执行大多数系统设置,并最终生成init进程。
Linux内核模块的入口点是一个初始化函数,该函数通过调用module_init()
宏在内核中注册。然后,do_initcalls()
在内核启动过程中,内核代码通过该函数调用已注册的模块init函数。
main
C语言中方法的真正目的。(这是一种普遍的误解,认为OS会直接调用main
,这不是这种情况,在C ++中更是如此。) d如果我可以的话,再给你一个支持。
内核没有main
功能。 main
是C语言的概念。内核是用C和汇编语言编写的。内核的入口代码是由汇编编写的。
引导顺序组织如下:
initrd
)将内核映像加载到ram中。然后执行某个地址处的代码。init
进程),将CPU的上下文从环0切换到环3,并启动初始化进程(进程ID为1)。现在内核启动完成了!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项目。
initrd.img
不是内核映像。它是内核在引导时加载的一组模块。内核映像通常以“ vmlinuz”开头,但各个发行版之间的名称有所不同。
例如,arch / x86 / boot / main.c中有一个main()函数,用于使系统准备从实模式切换到保护模式,但其他体系结构则没有这样的代码。很好地概述了如何在x86平台上引导Linux内核2.6.x。真的值得一读。
根据文档HOWTO做Linux内核开发,Linux内核是
一个独立的C环境,不依赖于标准C库,因此不支持C标准的某些部分。
根据C标准BTW的含义是什么
由实现定义,是否需要在独立环境中的程序来定义“主要”功能。