Linux kernel linux源代码中arch/i386/kernel/head.S中的ALIGN是什么
在linux源代码中路径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
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
上找到,正如我在上面的回答中提到的那样。