Linux kernel linux源代码中arch/i386/kernel/head.S中的ALIGN是什么

Linux kernel linux源代码中arch/i386/kernel/head.S中的ALIGN是什么,linux-kernel,Linux Kernel,在linux源代码中路径arch/i386/kernel/head.s处的head.s文件中,使用了ALIGN,如下面给出的ret指令之后的代码片段所示。我的问题是这是什么,据我所知,它不是指令,不是汇编指令,所以这是什么,为什么在这里使用它 您可以在下面给出的站点获取head.S的代码: 路径:arch/i386/kernel/head.S /* *我们相信ET是正确的。这将检查287/387。 */ 检查_x87: movb$0,X86_硬_数学 clts fninit fstsw%ax

在linux源代码中路径
arch/i386/kernel/head.s
处的head.s文件中,使用了
ALIGN
,如下面给出的
ret
指令之后的代码片段所示。我的问题是这是什么,据我所知,它不是指令,不是汇编指令,所以这是什么,为什么在这里使用它

您可以在下面给出的站点获取
head.S
的代码:

路径:
arch/i386/kernel/head.S

/*
*我们相信ET是正确的。这将检查287/387。
*/
检查_x87:
movb$0,X86_硬_数学
clts
fninit
fstsw%ax
cmpb$0,%al
je 1f
移动%cr0,%eax
xorl$4,%eax
移动%eax,%cr0
ret
ALIGN/*为什么使用ALIGN以及它是什么*/
1:movb$1,X86_硬_数学
.字节0xDB,0xE4
ret

实际上
ALIGN
只是一个宏,在文件中定义:

#ifdef_u组件__
#定义对齐\uu对齐
\u ALIGN
定义取决于体系结构。对于
x86
,您有下一个定义(在内核2.4中),在:

#如果定义了(uuui386_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
#定义对齐。对齐16,0x90
#定义“对齐”.对齐16,0x90“
#否则
#定义对齐。对齐4,0x90
#定义“对齐”.对齐4,0x90“
#恩迪夫
所以最后,
ALIGN
宏就是
.ALIGN
asm指令,它是4字节或16字节对齐(取决于
CONFIG\u X86\u alignment\u 16
选项值)

您可以从文件中计算出
CONFIG\u X86\u ALIGNMENT\u 16
选项值。此值实际上取决于处理器系列


另一个问题是为什么需要这样的调整。接下来是我的理解。通常CPU只能访问总线上对齐的地址(对于32位总线,地址通常应对齐4个字节,例如,您可以访问0x0、0x4、0x8地址等,但您不能访问0x1、0x3地址,因为这会导致错误)

但在您的情况下,我认为情况并非如此,并且调整仅出于性能原因。基本上,这种对齐方式允许CPU更快地获取
1:
部分:

对齐
1:movb$1,X86_硬_数学
.字节0xDB,0xE4
ret
因此,看起来这个
ALIGN
只是一些小优化

另请参见下一主题:

[1]


[2]

实际上
ALIGN
只是一个宏,在文件中定义:

#ifdef_u组件__
#定义对齐\uu对齐
\u ALIGN
定义取决于体系结构。对于
x86
,您有下一个定义(在内核2.4中),在:

#如果定义了(uuui386_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
#定义对齐。对齐16,0x90
#定义“对齐”.对齐16,0x90“
#否则
#定义对齐。对齐4,0x90
#定义“对齐”.对齐4,0x90“
#恩迪夫
所以最后,
ALIGN
宏就是
.ALIGN
asm指令,它是4字节或16字节对齐(取决于
CONFIG\u X86\u alignment\u 16
选项值)

您可以从文件中计算出
CONFIG\u X86\u ALIGNMENT\u 16
选项值。此值实际上取决于处理器系列


另一个问题是为什么需要这样的调整。接下来是我的理解。通常CPU只能访问总线上对齐的地址(对于32位总线,地址通常应对齐4个字节,例如,您可以访问0x0、0x4、0x8地址等,但您不能访问0x1、0x3地址,因为这会导致错误)

但在您的情况下,我认为情况并非如此,并且调整仅出于性能原因。基本上,这种对齐方式允许CPU更快地获取
1:
部分:

对齐
1:movb$1,X86_硬_数学
.字节0xDB,0xE4
ret
因此,看起来这个
ALIGN
只是一些小优化

另请参见下一主题:

[1]


[2]

强制下一条指令与下一个字边界对齐?@user3528438实际上不是字边界,它更复杂。在现代CPU上,通常是16字节对齐。强制下一条指令与下一个字边界对齐?@user3528438实际上不是字边界,它更复杂。在现代CPU上,它通常是16字节对齐方式。uu ALIGN是macor,但我说的是just ALIGN,如果ALIGN也是macor,我从哪里可以获得macor ALIGN的源代码是的,
ALIGN
也是一个宏,它变成了
\uu ALIGN
。请参阅我答案中的第一个
#define
。所以
ALIGN
基本上就是
\uu ALIGN
。而
ALIGN
\u ALIGN
的源代码可以在
include/linux/linkage.h
上找到,正如我在上面的回答中提到的那样。\u ALIGN是macor,但我说的只是ALIGN,如果ALIGN也是macor,我在哪里可以得到macor ALIGN的源代码呢?
ALIGN
也是一个宏,它会变成
\u ALIGN
。请参阅我答案中的第一个
#define
。所以
ALIGN
基本上就是
\uu ALIGN
。而
ALIGN
\uu ALIGN
的源代码可以在
include/linux/linkage.h
上找到,正如我在上面的回答中提到的那样。