为什么glibc库使用汇编

为什么glibc库使用汇编,c,gcc,assembly,glibc,C,Gcc,Assembly,Glibc,我正在看这一页: 这就解释了glibc是如何进行系统调用的在其中一个示例中,对代码进行了检查,结果表明,glibc实际执行系统调用(意味着对cpu的中断)所执行的最后一条指令是在汇编中编写的。。。。那么为什么glibc的一部分在组装中呢?把那个小零件写在装配中有什么好处吗? 此外,运行时期间的共享库已经编译为机器代码正确吗 那么,为什么在编译之前使用两种不同的语言会有任何好处呢?谢谢。答案非常简单-因为C不包括系统调用(因为它一般不包括任何物理硬件,更喜欢用抽象机器来表达自己),所以没有C构造g

我正在看这一页:
这就解释了glibc是如何进行系统调用的
在其中一个示例中,对代码进行了检查,结果表明,glibc实际执行系统调用(意味着对cpu的中断)所执行的最后一条指令是在汇编中编写的。。。。那么为什么glibc的一部分在组装中呢?把那个小零件写在装配中有什么好处吗?
此外,运行时期间的共享库已经编译为机器代码正确吗

那么,为什么在编译之前使用两种不同的语言会有任何好处呢?谢谢。

答案非常简单-因为C不包括系统调用(因为它一般不包括任何物理硬件,更喜欢用抽象机器来表达自己),所以没有C构造
glibc
可以用来执行系统调用

有人可能会争辩说,编译器可以提供一种内在的方式来实现这一点,但由于在Linux中glibc实际上是编译器工具套件的一部分(在包含CRT的情况下也是如此),因此确实不需要它,glibc可以完成这项工作


此外,最后,但并非最不重要的一点,在现代CPU中,系统调用通常不是中断。相反,它是一个特定的指令(
syscall
在x86_64中)。

我想解决您的这一问题:

此外,运行时期间的共享库已经编译为机器代码正确吗? 那么,为什么在编译之前使用两种不同的语言会有任何好处呢

SergeyA正确地指出,没有任何C构造(即使有GCC的所有扩展)会导致编译器发出
syscall
指令。这并不是C库要做的唯一一件不能完全用C编写的事情:实现
setjmp
longjmp
makecontext
setcontext
,调用
main
的“入口点”代码,“蹦床”当您从信号处理程序返回时返回的,以及其他几个低级位都需要一点手工编写的汇编。(练习:它们有什么共同点?)

但将汇编语言混合到主要用C编写的程序中还有另一个原因。它是3100行手写汇编语言和预处理器宏。它的作用可以用四行C来表示。为什么会有人这么麻烦呢?速度编译器总是离我们越来越近,但当涉及到从关键的最内层循环中挤出最后一个可能的循环时,他们还没有完全击败人脑。(值得一提的是,在2018年初,glibc开发人员花了大量时间用C替换手工编写的
math.h
函数的汇编实现,因为编译器已经赶上了这些,而C的可维护性更高。)


还有第三个答案,虽然与glibc没有太大关系,但在其他地方也有很多答案,那就是你的程序中可能有两种不同的语言,因为它们在你的部分问题上都更好。统计语言R主要是用C语言实现的,但它的许多数学原语(或者说,我有一段时间没有查过)都是用FORTRAN编写的,因为FORTRAN仍然是数值计算向导所使用的语言。C和FORTRAN都被编译成机器代码,原则上你可以用C重写所有FORTRAN,但没有人愿意这样做。

编译器不支持为CPU部分的中断生成机器代码。如果不是在汇编中编写的,将使用什么样的C语句?为什么C标准库的某些部分会用较低级别的语言实现呢?各种高级语言通常都是在低级语言中实现的。Python、Java、Ruby、Perl和其他许多都属于这一类。你的意思是“glibc不能使用任何C结构”,而“glibc可以使用…”吗?@zwol,是的,这非常不清楚,谢谢你指出。我重新措辞,希望现在更好。@SergeyA。。。我明白你所说的glibc不想专门涵盖任何硬件是什么意思。。。。但是,为了学习,我们只想说,您想为glibc编写一个C函数,用于x86平台系统调用,可以吗?因此,不必在glibc中使用程序集,您可以使用另一个C函数来实现同样的功能。我知道这毫无意义,但我只是好奇这是否可能。谢谢。@hescobar1013您可以编写一组类似中的函数,事实上这正是glibc所做的(出于历史原因,它埋在一堆宏之下)——但函数体中有一个内联汇编操作,这是不可避免的。@zwol……感谢您的链接,这个答案也很有趣…所以我明白了,在glibc和gcc的上下文中,需要汇编有多个原因,其中一个原因是glibc不想关心硬件级别的“东西”并且不可知。。。。但是为了学习,在glibc和gcc之外,是否有可能为x86平台编写一个C库和一个C编译器,从而能够放弃使用汇编?所以,您可以制作一个编译器,它可以理解将“int0x80”或类似的东西转换为机器代码来执行系统调用,对吗?谢谢。“FORTRAN仍然是数值计算向导使用的语言”--这不仅仅是他们使用哪种语言的问题--FORTRAN中缺少指针别名允许更积极的优化,通常会导致更快的机器代码。@EmployeedRussian我认为原则上,只要仔细使用
restrict
,就可以在C中获得相同的优化级别,但无论如何这是一个好的点:学习如何在C中“思考”将涉及到学习所有类似的东西,这些东西必须在C中完成,而不是在FORTRAN中,因此切换