在内核模式下运行程序禁止使用标准C库,因为您的程序链接的唯一东西是内核本身。所以我可以使用内核中定义的函数。但是内核本身是一个用C语言编写的程序,它是为特定的体系结构而编译的。它不应该使用C标准库,但也不应该使用任何驱动程序,因为驱动程序是可加载的模块。那么,我的问题是,在编写内核时使用的实际C函数是什么?您如何与硬件交互,而不是通过内核?别让我看消息来源,这对我来说太高了,泰。
发布于 2016-06-27 02:02:44
Unix内核传统上包含一些汇编语言代码,最近我还没有看过它的源代码,但我怀疑这仍然是真的。
有关该主题的概述,请参见驱动程序如何与硬件设备进行实际通信?。对该问题的回答讨论了两种计算机体系结构。在使用端口映射I/O (PMIO)的系统上,内核必须部分用汇编语言编写--尽管您可以使用几个非常短的例程来完成。在使用内存映射的I/O (MMIO)的系统上,甚至设备驱动程序也可以完全用C编写。他们所需要做的就是声明指针,将指针设置为与设备的虚拟地址相等,然后使用它来操作设备,就好像它正在访问内存一样。
发布于 2016-06-26 22:38:57
并不是所有的驱动程序都是可加载的模块,可加载只是一种选择,但是一些关键的驱动程序并不是动态加载的,它们是内核的一部分。
发布于 2016-06-26 23:11:49
内核静态地在内核内部复制由libc提供的全部功能。
就像在用户模式C编程中一样,一个函数可以定义在一个编译单元中,而另一个单元可以简单地引用它(通常是通过一个头文件),编译器将使它成为一个未定义的引用,链接器将它与实际提供符号的编译单元链接起来。
加载内核模块的工作原理与动态加载相同,如下所述:http://www.tldp.org/LDP/tlk/modules/modules.html
https://unix.stackexchange.com/questions/292277
复制相似问题