linux与android架构基础

来源:互联网 发布:kanthal a1数据 编辑:程序博客网 时间:2024/05/16 04:56

以下图为基础,说明Linux的架构(architecture)。

 

最内层是我们的硬件,最外层是我们常用的各种应用,比如说使用firefox浏览器,打开evolution查看邮件,运行一个计算流体模型等等。硬件是我们的物质基础,而应用是我们所要奋斗的目标,但在两者之间,还要经过一番周折。

还记得我们在Linux启动的时候。首先会启动内核 (kernel),内核是一段计算机程序,这个程序直接管理硬件,包括CPU、内存空间、硬盘接口、网络接口等等。所有的计算机操作都要通过内核传递给硬件。

为了我们方便调用内核,我们将内核的功能总结成为系统调用(system call)。系统调用看起来就像是的C语言函数,你也可以在程序中直接调用。Linux系统有两百多个这样的系统调用。系统调用给了上层程序一个清晰的接口,隐藏了内核的复杂结构。一个操作系统上的功能可以看作是系统调用的组合的效果,而且一个操作系统不可能作出超越系统调用的动作。在命令行中输入$man 2 syscalls可以查看所有的系统调用。你也可以通过$man 2 read来查看系统调用read()的说明。在这两个命令中的2都表示我们要在2类(系统调用类)中查询 (具体各个类是什么可以通过$man man看到)。

由于系统调用非常基础,所以有时使用起来很麻烦。比如说一个简单的给变量分配内存空间的操作,就需要动用多个系统调用。Linux定义一些库函数(library routine)来将系统调用组合成某些常用的功能,以方便我们编程。比如上面的分配内存的操作,看以定义成为一个库函数(像malloc()这样的函数)。再比如说,在读取文件的时候,系统调用要求我们设置好所需要的缓冲。我们这个时候可以使用Standard IO库中的读取函数,而这个读取函数既负责设置缓冲,又负责使用读取的系统调用函数。使用库函数对于机器来说并没有效率上的优势,但可以把程序员从细节中解救出来。

(实际上,一个操作系统要称得上是UNIX系统,必须要拥有一些库函数,比如ISO C标准库,POSIX标准等。)

至于shell,可以看作一种特殊的应用。实际上我们之前所说的命令行,就是shell。shell是一个命令解释器(interpreter),当我们输入“ls -l”的时候,它将此字符串解释为1) 在默认路径找到该文件(/bin/ls),2) 执行该文件,并附带参数"-l"。我们之前用>表示重新定向,用|表示管道,也是通过shell进行理解&或者|的含义,再通过系统调用指挥kernel建立具体的重定向或者管道机制。在没有图形界面之前,shell充当了用户的界面,当用户要运行某些应用的时候,要通过shell输入命令,以建立运行程序。shell可以执行符合shell语法的文本,这样的文本叫做shell脚本(script)。我们可以在图中看到,shell下通系统调用,上通各种应用,同时还有许多自身的便利可以使用,这些条件让shell脚本可以实现非常强大的功能。UNIX的一条哲学是让每个程序尽量独立的做好一个小的功能。而shell充当了这些小功能之间的"胶水",让不同程序能够以一个清晰的接口(文本流)协同工作,从而增强各个程序的功能。

(shell也有很多种,最常见的是bash, 另外还有sh, csh, tcsh, ksh。它们出现的年代不同,所支持的功能也有差异。)

一个shell对应一个终端 (terminal)。曾经来说,终端是一个硬件设备,用来输入并显示输出。如今,由于图形化界面的普及,终端往往就像上图一样,是一个图形化的窗口。你可以通过这个窗口输入或者输出文本。这个文本直接传递给shell进行分析解释,然后执行。

最后,我们进入一般的应用。应用是一个程序,它可以1) 直接调用系统函数 2) 调用库函数 3) 运行shell script。这些应用可以由多种语言开发(当然,最常见的是C语言),以满足我们使用计算机的各种需要。

总结 

我们可以看到,Linux利用kernel实现软硬件的对话。通过系统调用的这个重要的接口,Linux将上层的应用与下层的kernel完全分离开,为程序员隐藏了底层的复杂性(相应的,也提高了上层应用的可移植性)。当我们在升级kernel的时候,也可以保持系统调用的语句不变,从而让上层应用不感受到下层的改变。库函数利用系统调用创造出模块化的功能,而shell则提供了一个用户界面,并让我们可以利用shell的语法编写脚本,以整合程序。


android框架概述

    

  android系统框架图

 

       这是android的系统框架图,从这上面可以看动,android的系统结构分成了四层,由底向上分别为内核层、运行库层、应用框架层、应用层。

       内核层:主要还是标准的linux,这里面android对其自身特有的一些硬件又做了相应的驱动开发,并把驱动抽象到了一个android HAL层(硬件抽象层)。致于为何这样做,有这样的一个说法是若是直接在linux内核上进行开发,需要遵守linux的开源策略,这对很多厂家来说,涉及到了商业秘密的问题。

      系统运行库层:系统运行库层,主要是由C和C++语言开发,实现了系统接口调用和其他的运行模块。在这里面如libc实现的并不像平时的linux下的glibc,而是由android自己开发的一个llibc,称为bionic,只有200多k,运行速率明显比glibc实现的来得快多了。但这也就成了我工作一大困难点,因为在这里,libc是原有glibc下有所裁剪,有些功能不实现,如IPC上的接口,消息发送接口,及内存共享接口等没有接供,这让原本linux下源码中依赖这些ipc机制接口的代码移植碰到了一个问题,如何去解决这个问题,是对程序移植的一大挑战。

       在运行库层中,还包含着如下:

       Surface Manager:对应用层的显示子系统的管理,为应用层提供2D和3D的无疑的融合;

       Media Framework:可以支持多种格式的音频和视频的录制和回放,包含对静态图像的读取;

       Sqlite: 强大的轻量级的数据库引擎,这是第三方的支持,许多数据库都是以这个Sqlite来作为数据库引擎的,大小大概有500K左右;  

       OpenGL|ES:实现3D图像的硬件加速,及优化后的软加速;

       FreeType:其于位图和矢量图形的字体支持;

       WebKit: 功能强大的浏览器引擎,许多主流的浏览器也是基于该引擎的,如chrome,支持android浏览器,并支持内嵌的web视图。

       SGL: 底层的2D图形引擎;

       SSL:为网络通信提供安全及数据完整性的一种安全协议;

       libc : 如一开始提到的,android开发的bionic,提供标准的系统C调用。

       另外,在这里,还包含着core libraries和Davik虚拟机,corelibraries提供java的核心库,Davik虚拟机与Java的JVM不同在于,JVM是基于堆栈的,而Davik是基于寄存器,至于两者哪个好哪个坏,业界是一个争论的话题。

       应用框架层:这里面,实现了对底层C/C++的调用封装,android为开发都提供了基本的应用接口,是java实现的,java调用底层的C/C++则是通过JNI机制来实现。在这里,好的应用框架开发,可以给上层的应用调用提供更好的帮助。

       应用层:用户最直接感受到的一层,这里面实现了与用户交互的过程,不管从界面UI,或是功能上,都与用户相关系,这个好坏决定着用户对产品的认可底。否则,底层封装得再好,也没有用。


0 0