Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 当内核开发人员想要编写程序集时,他们是在高级中编写并使用编译器进行转换,还是直接在程序集中编写?_Assembly_Kernel - Fatal编程技术网

Assembly 当内核开发人员想要编写程序集时,他们是在高级中编写并使用编译器进行转换,还是直接在程序集中编写?

Assembly 当内核开发人员想要编写程序集时,他们是在高级中编写并使用编译器进行转换,还是直接在程序集中编写?,assembly,kernel,Assembly,Kernel,例如,我读到Linux的某些部分在汇编中,我猜它们在汇编中编写是为了更快的执行速度 但是,现代内核开发人员是否真的在需要时直接在汇编中编写,或者他们使用高级语言编写并使用编译器将其转换为汇编,然后使用转换后的汇编代码 哪种方法更好?考虑到编译器也有代码优化功能,将高级转换为汇编不是更有效吗?我的内核的哪些部分真的需要在汇编中编写 为了提高性能,Linux中很少有部分是用asm编写的。请参阅@Ped7g的答案,了解内核为什么对偶尔的特权指令(如控制寄存器的mov)使用内联asm,或对入口点(如中断

例如,我读到Linux的某些部分在汇编中,我猜它们在汇编中编写是为了更快的执行速度

但是,现代内核开发人员是否真的在需要时直接在汇编中编写,或者他们使用高级语言编写并使用编译器将其转换为汇编,然后使用转换后的汇编代码


哪种方法更好?考虑到编译器也有代码优化功能,将高级转换为汇编不是更有效吗?我的内核的哪些部分真的需要在汇编中编写

为了提高性能,Linux中很少有部分是用asm编写的。请参阅@Ped7g的答案,了解内核为什么对偶尔的特权指令(如控制寄存器的mov)使用内联asm,或对入口点(如中断)使用整个手写asm文件 以及分派给C函数的系统调用处理程序入口点

在Linux中,可能只有在x86上使用SSE2或AVX的RAID5 xor奇偶校验和RAID6错误更正在asm中写入以提高性能

这些可能是直接在asm中编写的,因为在C中使用intrinsic手动矢量化并不容易。在那些Linux函数IIRC中,循环仍然是用C完成的

而且它使用了非常糟糕的样式,多个单独的asm语句使用XMM或YMM寄存器。这种情况会发生,尤其是在内核代码中,编译器永远不会生成使用XMM寄存器的代码,但使用单个asm块或向量输出/输入操作数会更安全。有关示例,请参见。还有一个在asm中完成循环的通用块xor函数,可能被内核的其他部分使用。这是为数不多的几个使用SIMD向量寄存器的地方之一,因为保存/恢复FPU状态非常昂贵

Linux可能使用内联asm来提高x86 CRC32指令的性能(如果可用);有些东西使用x86加速的CRC32C多项式

对于更一般的问题,使用编译器生成asm作为优化的起点通常是一个好主意

但是,如果编译器已经发出了良好的asm,您不需要做任何事情,只需使用该C即可。这甚至比内联asm更好,因为它可以通过不断传播等方式进行优化。或者,您可以调整C源代码以帮助编译器完成更高效的工作

但是,如果您无法让编译器生成最佳循环,那么请确保您可以使用其asm并手动对其进行优化。只要您针对原始版本进行基准测试,就不会输给编译器。除非当内联使某些内容成为编译时常量时,asm无法进行优化

有关帮助与击败编译器的更多详细信息,请参阅

<>你只考虑使用一个手写的ASM循环来处理一个软件的非常关键的部分,特别是在像Linux这样的可移植代码库中,因为你需要对每一个平台有不同的实现。 因为Skylake上的最佳配置与20年前P5 Pentium上的最佳配置不同,20年后在未来的x86上也可能不是最佳配置。坚持使用portable C可以让-march=skylake等调优选项完成它们的工作,并使asm针对您编译的特定微体系结构进行调优。或者让编译器中的更新默认调整在几年内生效

更不用说,大多数内核开发人员都不是asm调优专家,他们可以轻松地手工编写接近最优的asm。这不是人们经常做的事情。如果您喜欢这样做,可以使用gcc或clang使它们从C生成更优化的代码

例如,我读到Linux的某些部分在汇编中,我猜它们在汇编中编写是为了更快的执行速度

通常不会,他们在汇编中写入内核的[微小]部分,因为C语言不支持某些操作,例如,在x86 CPU上切换到保护模式需要写入以注册C语言不知道的内容

那么,C非常适合内核之类的东西,它是低级语言,虽然我编程的时间越长,这些类别对我来说就越混乱,在这一刻我相信最高抽象级别的编程语言之一是C++,但很多人不同意我的观点。但是,如果需要,你可以很容易地在C++中得到相当低的水平,所以大多数事情可以直接写在它里面,它只是影响目标机器的某些特定事物的非常小的部分,必须用ASM代码来完成。 例如,考虑内存管理器之类的东西。。有关it的大部分内容包括跟踪空闲/分配的页面、不同进程的虚拟内存映射等。。。是普通数据结构中的普通数字,可以用C轻松处理。但设置最后的v


特定进程的虚拟内存布局可能需要不同的指令,具体取决于目标机器及其MMU设计,因此可能会有一小部分程序集强制执行这些用C计算的内容。

我很确定Linux内核中没有任何部分是通过修改编译器的程序集输出编写的。这通常只由没有经验的汇编程序员完成,要么是编写第一个汇编代码的新手,要么是负责改进用高级语言编写的某些现有代码性能的专业程序员。现在,考虑到编译器已经变得多么优秀,在后一种情况下,大多数情况下它们都会在任务中失败。