本文转自迅为iTOP-4412开发板实战书籍:http://www.topeetboard.com 1. 什么是Linux系统编程Linux系统编程分为三个部分:系统调用、C库和C编译器。 系统调用系统编程的基础是系统调用,也结束于系统调用。在带有操作系统的嵌入式开发中,需要从操作系统申请一些服务和资源,从用户空间向内核发起的一些函数调用。系统调用包括对文件的读写、进程的控制等等。在Linux中,系统的实现少于其它内核。例如在Windows下有几千个系统调用,但是在Linux中只有不到300个。Linux作为开源软件,在不同的体系结构(x86,PowerPC, ARM等)中各自实现标准系统调用。所以,在不同的体系结构中支持的系统调用可能存在一些区别,但是绝大部分都是通用的。本章讨论的内容主要是基于ARM-Linux上的调用。 在嵌入式 单片机编程中,用户可以直接通过编写的裸机程序实现对寄存器的调用。 在Linux中,从安全性和可靠性考虑,需要禁止用户空间的应用程序直接执行对硬件的操作以及对内核的操作。但是应用程序必须通过一种方式获取对底层的操作。在i386处理器上,用户需要通过中断来实现用户空间的调用,然后通过传递参数来实现对底层的操作。在ARM处理器上,是通过切换工作模式来实现对底层的操作,不同模式下CPU可执行的指令和访问的寄存器不一样。 当然在不同的操作系统中,也是有区别的,例如在Android中,所有的应用都是在系统提供的Java虚拟机中运行,应用程序更加远离底层。 C库C库是Linux系统编程的基础,是所有应用的核心,从前面的Linux结构图中可以看到Linux系统中已经完整的包含了C库。即使你使用其它语言,例如在Android中使用Java编程,很多功能也是通过对C库进行封装,方便系统调用,很多功能只是为了保持API的一致性,对C库的核心也很少修改。 在Linux中,使用的是GNU C库。在glibc中,除了标准的C库,还提供了系统调用的封装、线程的支持和基本应用工具。 C编译器在Linux中,标准C编译器是有GNU编辑器工具提供,一般的操作系统都会带有GNU编译器。 在嵌入式开发中,由于使用的是交叉编译工具,所以使用的编译器最好和内核的编译器保持一致,避免最终应用出现调用失败的情况。 2. 为什么要学习Linux系统编程尽管现在流行的Web开发、Java开发、Android开发等,这些的都是逐渐远离系统编程,向高级开发发展。但是这些开发并不是意味着系统编程的结束,例如在嵌入式开发中,要使用处理器做一些算法处理,这些算法不需要高级语言,项目也不需要图形界面,那么使用系统编程加上最小Linux系统可以节省大量的资源。在对内核进行开发时,需要对驱动进行测试,程序员可以使用系统编程来实现一些基础的测试工作。而且像Web开发,Java开发,Android开发,它们的底层也需要工程师去完成,这些工作都会涉及到大量的系统编程。 3. Linux的man命令Linux提供了丰富的帮助手册,当你需要查看某个命令的参数时不必到处上网查找,只要man一下即可。强大的man命令不止查找命令这一个简单的功能。还可以查找各种API函数,想要学会Linux编程,这个man命令一定要掌握。 man命令熟悉之后,很多东西就可以不用教程,不用手册,可以自己进行学习了。将来大家独立做实际项目或者学习的时候,也会经常用到man命令的。 通常情况下,UNIX 系统上的所有软件(包括每个命令行实用程序、每个系统调用、编程库中每个可调用的函数和每种文件格式)都包含一个手册页。 每个部分实现为一个独立的子目录。每个部分按惯例命名为 man1、man2 直到 man8分别包含一类命令的手册页。 man手册分页的标准内容。 man1 | 一般命令。这个部分中的命令通常不需要超级用户(即管理员)特权。ls、cat 和 passwd 放在这里,还有 shell。例如,请试试 man bash。 | | 用来访问 UNIX 内核提供的服务的系统调用或函数。例如 fork 系统,它从一个现有的进程生成一个新进程。输入 man fork 显示它的手册页。使用系统软件的程序员常常参考这个部分。 | | C 库函数。许多软件包提供功能丰富的代码库,让开发人员可以创建新软件来补充现有的特性或开发全新的特性。每个库通常有一个手册页;一些库(比如系统的 libc)太大了,所以各个函数或一组相关函数有单独的文档。 | | | | 文件格式。UNIX 几乎完全使用文本配置文件定制系统的操作。有大量配置文件,包括网络服务的列表 (/etc/services) 和可用的 shell 列表 (/etc/shells) 等等。 | | | | 杂类文件。这是一个包罗万象的类别。在传统的系统上,可以了解 glob 操作符、正则表达式等方面的信息。 | | |
上面的8种man命令,通常我们使用的man1、man2和man3比较多,而且并不是所有的都有上面八种文档,有的只有一种,或者两种文档。在Linux系统编程中可以用过man命令查看各种API函数和接口的详细用法。
|