Linux系统硬件平台与程序

01)计算机硬件与程序编程、运行关系

 先有以编程思想指导设计制作的CPU,后有通过编程行为产生的可在CPU上运行的程序。
 CPU向上提供指令集,每一条指令都是一个二进制序列,代表了一种CPU操作,例如加法、乘法、取值令等。将指令集按照解决问题的需求有序组合,便成为二进制程序。
 不同厂商设计的CPU采用不同的指令集,所以就有适合不同CPU平台的程序,不同指令集平台间的二进制程序并不能兼容。
 不同指令集CPU在性能和功耗上不尽相同,所以有了ARM框架在移动端的崛起。

02)Linux运行平台

 2.1)Linux主流运行平台

  x86,
  x64,又称amd64
  arm,手持智能移动终端上最常见的CPU,其在低功耗方面表现最为突出
  无论是服务器、桌面、手持端,32位已经逐渐成为过去式,64位是主流

 2.2)其他系统及运行平台

  m68000,又称m68k,早期Unix操作系统在此芯片/指令集上运行
  ultrasparc ,SUN公司solaris系统工作站使用的
  power aix系统,IBM公司,性能最强劲的CPU芯片,相当贵
  powerpc, 简称ppc,power架构的阉割版,用于个人电脑,早期IBM、苹果使用
  MIPS,龙芯
  alpha hp-ux,惠普小型机
  在兼容机出现前做计算机,还需要设计指令集做CPU,可见其难度相当大

03)Linux系统编程

 3.1)编程历史

  直接使用指令集编程,又称机器码编程,其编写出的程序可以直接运行,在历史上确实有那么一段时期使用机器码直接编程。
  后来将机器码转化成为微码,也就是汇编语言,通过汇编语言编程,然后通过汇编器将汇编语言转化成为机器码程序,方可被机器执行,在历史上使用汇编语言编程持续了相当长一段时间,著名的阿波罗飞船便使用汇编语言编程。
  无论是机器码编程还是汇编语言编程,都是直接与硬件平台绑定的,因为他们都直接面对指令集编程,程序没有可移植性。
  再后来出现高级语言C/C++,通过C/C++编写的程序,首先通过编译器将高级语言转化为汇编语言,然后再通过汇编器转化为二进制执行程序。高级语言(C/C++)不仅在语法上更接近人类语言,并且使用高级语言编写出来的程序(源码)可以被编译器编译出面向不同平台的二进制执行程序,具有很强的可移植,极大地造福程序员。

 3.2)Linux系统编程

  使用高级语言编程,是当下编程的主流方式,也是Linux开发的编程方式,C/C++语言就是Linux系统/应用编程语言。
  面对CPU/计算机编程,不仅仅是语言的选择,还有其他方面的工作。编写程序时,需要对使用到的每一个部件进行控制,如屏幕、键盘、磁盘等。对于单个程序而言,每编写一个程序就需要对计算机的各个部分驱动一次,工作量十分庞大。对于众多程序而言,有太多的功能是共用的功能,A程序需要屏幕,B程序也有需要屏幕的功能。于是乎,操作系统接管整个硬件系统,为上层程序提供系统调用接口(Syscall API),上层程序就可以专注于业务程序,提高开发效率。操作系统的发展,不仅仅只局限于为程序提供驱动的功能,还有作为监控者的功能,这便是后话。
  在程序开发过程中,又有人将基本的系统调用操作进一步封装形成库,通过库调用(Libcall API)编程,又进一步提高了开发效率。在各种各样的库中,有标准库,例如glibc(标准C库);也有其他的专用库,例如OpenCV(计算机视觉库)、GTK( 图形用户界面应用程序库)。

 3.3)程序编译

   如上所言,通过高级语言编写的程序叫做程序源码,计算机并不能执行。另外,GUN/Linux系统的内核以及GUN程序也都是以源码形式发布。所以,无论是想要得到本CPU平台的二进制可执行程序,还是得到其他平台的二进制可执行程序,都需要对源码程序进行编译。
   在Linux中,主流的编译器叫做GCC。GCC的初衷是为GNU操作系统专门编写一款编译器,现已被大多数类Unix操作系统,采纳为标准的编译器,例如Linux、BSD、Mac OS,甚至在微软的Windows上也可以使用GCC。GCC支持多种计算机体系结构芯片,如x86、ARM、MIPS等,并已被移植到其他多种硬件平台。GCC原名为GNU C语言编译器(GNU C Compiler),只能处理C语言。但其很快扩展,变得可处理C++,后来又扩展为能够支持更多编程语言,如Fortran、Pascal、Objective -C、Java、Ada、Go以及各类处理器架构上的汇编语言等,所以改名GNU编译器套件(GNU Compiler Collection)。综上所述,GCC可以为多种平台,多种语言编译程序。编译器的原理为编译原理。
   在Linux系统中编译程序,默认是为本平台(CPU指令集)编译程序,编译出来的程序仅可运行在本平台的计算机上。但是,GCC也可以支持在本台计算机上为其他平台的计算机编译程序,这种行为叫做交叉编译,例如在计算机上开发安卓系统,就需要在计算机上编译好然后下载到手机中。
   在上一节只是讲述的Linux主流运行平台,其实只要将源码针对其他平台编译,程序就可以运行在其他的平台,这种行为叫做程序移植。

 3.4)程序运行简要认识

   (二进制可执行)程序没有执行的存放在磁盘中,当程序执行时被调入内存中,每一个内存单元都有地址,按照程序顺序(涉及到程序循环、选择),CPU一条一条地寻址执行指令。

04)开源软件及开源软件协议

 4.1)闭源程序

  开发商编写程序,隐藏源码和编程算法,在发布时只打包发布二进制执行程序。为了防止反向汇编,甚至采用加壳操作,加壳操作不影响执行,但妨碍反向汇编。

 4.2)开源程序及起源

  闭源程序,有可能被开发商植入后门等等,为了促进程序发展,避免程序完全沦为大公司的盈利/监控工具,于是Stallman发起开源运动,免费开放自己的程序源码,受到广大程序员响应。

 4.3)开源协定

  为了防止程序开发者一开始开源,其后又不开源,于是Stallman设计了一种协议,用于约束这种行为,于是便出现了GPL协定。协定规定程序源码的版权归于GPL,程序受到GPL保护和约束。
  GPL是一种非常开放的协定,针对不同的开源想法,于是出现了BSD、Apache等协定。
  Linux就是一个基于GPL的开源软件,Stallman发起的GNU组织中也产生了大量基于GPL的开源软件,如GCC,Vi等。

 4.4)开源软件的盈利

  开源软件一般有两种盈利模式,一是接收捐赠,开源软件的出现解决了某些金主的问题,金主也不用维持一个团队来做事,支持开源社区便是一个很好的行为;二是收取服务费,针对不同的服务级别,开发者可以按照协约响应问题。但是一般的开源软件在不被关注是,两者都不可得,于是开源软件一般双线发布,社区版和商业版。

  附图,主要开源软件协议
Linux系统硬件平台与程序