Linux内核程序集和逻辑

dan*_*_pa 9 linux assembly kernel inline-assembly

我的问题有些奇怪,但我会尽力解释.

看看linux内核的语言,我得到了C和汇编,即使我读了一篇文章说[引用] Unix的第二次迭代完全用C语言编写[/ quote]

我认为这是误导性的,但当我说内核有汇编代码时,我得到了两个问题

  1. 内核中有哪些汇编文件,它们的用途是什么?
  2. 程序集依赖于体系结构,因此如何在多个CPU体系结构上安装linux

如果Linux内核真的完全用C语言编写,那么它是如何获得编译所需的GCC的呢?

我做了一个完整的find / -name *.s ,只是在/ usr/src/linux-headers- `uname -r/中的某处有一个汇编文件(asm-offset.s)

不知怎的,我不认为这有助于GCC的工作,那么linux如何在没有组装的情况下工作,或者如果它使用汇编它在哪里以及它如何在依赖于arch时稳定.

提前致谢

bro*_*oot 13

1.为什么要使用装配?

因为某些事情只能在汇编中完成,因为汇编会产生更快的代码.例如,"您可以访问处理器的异常编程模式(例如16位模式,以便在Intel PC上连接启动,固件或遗留代码)".请阅读此处了解更多原因.

2.使用什么汇编文件?

来自:https://www.kernel.org/doc/Documentation/arm/README

"最初进入内核是通过head.S,它使用与机器无关的代码.机器在输入时由'r1'的值选择,必须保持唯一."

来自https://www.ibm.com/developerworks/library/l-linuxboot/

"当调用bzImage(用于i386映像)时,从开始汇编例程中的./arch/i386/boot/head.S开始(主流程见图3).此例程执行一些基本的硬件设置和调用./arch/i386/boot/compressed/head.S中的startup_32例程.这个例程设置一个基本环境(堆栈等)并清除符号开始的块(BSS).然后通过一个解压缩内核调用一个名为decompress_kernel的C函数(位于./arch/i386/boot/compressed/misc.c).当内核被解压缩到内存中时,它被调用.这是另一个startup_32函数,但是这个函数在. /arch/i386/kernel/head.S".

除了这些汇编文件之外,很多linux内核代码都使用内联汇编.

3.架构依赖?

你是正确的依赖于架构,这就是为什么linux内核代码被移植到不同的架构.


nin*_*alj 7

主要在Linux中汇编的东西:

  • 引导代码:引导机器并将其设置为可以开始执行C代码的状态(例如:在某些处理器上,您可能需要手动初始化缓存和TLB,在x86上您必须切换到保护模式,... .)
  • 中断/异常/陷阱入口点/返回:您需要执行非常特定于处理器的操作,例如:保存寄存器和重新启用中断,最终还原寄存器并正确返回用户模式.某些例外可能完全在汇编中处理.
  • 指令仿真:某些CPU型号可能不支持某些指令,可能不支持未对齐的数据访问,或者可能没有FPU.获取相应的异常时,选项是使用仿真.
  • VDSO: VDSO是内核映射到用户空间的虚拟库.它允许例如:为当前CPU选择最佳系统调用序列(在x86上使用sysenter/syscall而不是int 0x80在可用时),并实现某些系统调用而无需上下文切换(例如:) gettimeofday().
  • 原子操作和锁定:可能在将来,其中一些可以使用C11支持原子操作编写.
  • 从/向用户模式复制内存:除了使用优化副本外,还会检查越界访问.
  • 优化的例程:内核优化了一些例程的版本,例如:crypto例程,memset,clear_page,csum_copy(校验和并在一次传递中复制到另一个地方的IP数据),...
  • 支持暂停/恢复和其他ACPI/EFI /固件
  • BPF JIT:较新的内核包括用于BPF表达式的JIT编译器(例如tcpdump,用于,secmode模式2,...)
  • ...

为了支持不同的体系结构,Linux为它支持的每个体系结构编写了汇编代码(重新编写)(有时,对于使用相同CPU体系结构的不同平台,有一些代码的实现).只需看看下面的所有子目录arch/