每种不同的硬件使用规格不同,x86_64 x86_32以及ARM架构不尽相同,各种内存规格也不同,各种显卡的显示芯片也不同,需要程序猿自己去进行涉及对应的底层的调度,难度很大,而且如果更换硬件,程序就会失效。
程序猿和硬件之间的层次的严重不协调可以通过增加一个中间层来解决。 程序猿和硬件之间层次相差太远,不管是什么硬件,使用该中间层解决差异,调度硬件,如果程序要画一条直线,写好程序之后,告诉中间层,中间层会调用该硬件的驱动程序驱动硬件在显示器上显示直线。底层硬件的差异就被隐藏起来。
操作系统把底层硬件的各种不同之处做完全的封装,并通过一个统一接口(系统调用 system call 简称SysCall)提供给程序猿,是一个应用程序和底层硬件衔接的中间层。但其实其功能不只如此,比如CPU分时等等功能。
操作系统提供的接口叫做系统调用,简称为syscall,syscall非常底层,因此数量繁杂, 比如制作馒头流程,需要给麦种,然后种植,收割,磨面,和面,成型,蒸熟这几步操作,syscall给的就是这种很底层的操作,但是你的选择很多,磨面操作可以磨其他种子,和面也是,麦种也可以进行其他操作,但是懒人也是有的,库(Application Programming Interface api 应用编程接口,由syscall和库组成)可以将这些直接给你个生的馒头, 你直接把馒头蒸好就可以了,但是这样用户的选择更少了。
应用开发接口API(Application Programming Interface/库) :由syscall(系统调用接口)和libcall(库调用接口)组成。
ABI(Application Binary Interface):不同的OS内核对二进制格式文件支持不同,在C语言中的程序经过预处理,编译,汇编,链接之后生成完整的二进制应用程序文件,在每个应用程序的开头有符号表示其格式,例如windows下为exe msi 二进制程序,而linux下为elf二进制程序,在程序执行前内核先识别是否可执行,然后才会放到CPU上跑。
所以ABI是可识别、可支持相应文件格式、并提供二进制格式库文件(提供库文件,包括基本的syscall的封装的libcall供给程序调用)的环境。