嵌入式开发不可避免的大部分都是使用 Linux 进行开发的,本篇在这里简单介绍自己对 Linux 的认识。
什么是 Linux
Linux 背后有两个最关键的关键字: UNIX,GNU。
UNIX 最初是由贝尔实验室进行开发的,中间有过很曲折的发展历史,在这里就不详细说了。Linux是一个可自由发布的类UNIX内核实现,他是由Linus Torvalds 发明的。说一下所谓的最根本的哲学:简单原则,越大越复杂的系统注定包含越大,越复杂的漏洞,所以,KISS(keep It Small and Simple).
GNU 计划是由Richard Stallman发起的。它的目标是要“重现当年软件界合作互助的团结精神”。为保证GNU软件可以自由地“使用、复制、修改和发布”。GNU 为 Linux 提供了大量的软件诸如:GCC,G++,GDB,GNU make,bash,GNU Emacs。
简单的说,Linux 系统一般有4个主要部分:
内核、shell、文件系统和应用程序。
Linux内核
内核是操作系统的核心,具有很多最基本功能,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,Linux 内核由如下几部分组成:内存管理、进程管理、设备驱动程序、文件系统和网络管理等。如图:
系统调用接口
SCI 层提供了某些机制执行从用户空间到内核的函数调用。这个接口依赖于体系结构,甚至在相同的处理器家族内也是如此。SCI 实际上是一个非常有用的函数调用多路复用和多路分解服务。在./linux/kernel
中您可以找到 SCI 的实现,并在./linux/arch
中找到依赖于体系结构的部分。内存管理
对任何一台计算机而言,其内存以及其它资源都是有限的。为了让有限的物理内存满足应用程序对内存的大需求量,Linux 采用了称为“虚拟内存”的内存管理方式。Linux 将内存划分为容易处理的内存页(对于大部分体系结构来说都是 4KB)。内存管理的源代码可以在./linux/mm
中找到。进程管理
进程实际是某特定应用程序的一个运行实体。在 Linux 系统中,能够同时运行多个进程,Linux 通过在短的时间间隔内轮流运行这些进程而实现多任务。这一短的时间间隔称为时间片,让进程轮流运行的方法称为进程调度 ,完成调度的程序称为调度程序。
内核通过SCI
提供了一个应用程序编程接口(API)来创建一个新进程(fork
、exec
或Portable Operating System Interface
[POSⅨ] 函数),停止进程(kill
、exit
),并在它们之间进行通信和同步(signal
或者 POSⅨ 机制)。虚拟文件系统
Linux 操作系统将独立的文件系统组合成了一个层次化的树形结构,并且由一个单独的实体代表这一文件系统。Linux 将新的文件系统通过一个称为“挂装”或“挂上”的操作将其挂装到某个目录上,从而让不同的文件系统结合成为一个整体。 Linux 支持许多不同的文件系统,并且将它们组织成了一个统一的虚拟文件系统.
虚拟文件系统(VirtualFileSystem
,VFS
):隐藏了各种硬件的具体细节,把文件系统操作和不同文件系统的具体实现细节分离了开来,为所有的设备提供了统一的接口,VFS提供了多达数十种不同的文件系统。虚拟文件系统可以分为逻辑文件系统和设备驱动程序。逻辑文件系统指 Linux 所支持的文件系统,如ext2
,fat
等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。设备驱动程序
设备驱动程序是 Linux 内核的主要部分。和操作系统的其它部分类似,设备驱动程序运行在高特权级的处理器环境中,从而可以直接对硬件进行操作,但正因为如此,任何一个设备驱动程序的错误都可能导致操作系统的崩溃。设备驱动程序实际控制操作系统和硬件设备之间的交互。设备驱动程序提供一组操作系统可理解的抽象接口完成和操作系统之间的交互,而与硬件相关的具体操作细节由设备驱动程序完成。网络接口(NET)
提供了对各种网络标准的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。众所周知,TCP/IP 协议是 Internet 的标准协议,同时也是事实上的工业标准。Linux 的网络实现支持 BSD 套接字,支持全部的TCP/IP协议。Linux内核的网络部分由BSD套接字、网络协议层和网络设备驱动程序组成。
网络设备驱动程序负责与硬件设备通讯,每一种可能的硬件设备都有相应的设备驱动程序。
linux shell
shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行,是一个命令解释器。另外,shell编程语言具有普通编程语言的很多特点,用这种编程语言编写的shell程序与其他应用程序具有同样的效果。
目前主要有下列版本的shell。
Bourne Shell
:是贝尔实验室开发的。BASH
:是GNU的Bourne Again Shell,是GNU操作系统上默认的shell,大部分linux的发行套件使用的都是这种shell。Korn Shell
:是对Bourne SHell的发展,在大部分内容上与Bourne Shell兼容。C Shell
:是SUN公司Shell的BSD版本。
我们最常使用的是BASH
。
linux 文件系统
文件系统是文件存放在磁盘等存储设备上的组织方法。Linux系统能支持多种目前流行的文件系统,如EXT2、 EXT3、 FAT、 FAT32、 VFAT和ISO9660。
1. 文件类型
Linux下面的文件类型主要有:
- 普通文件(
-
):C语言元代码、SHELL脚本、二进制的可执行文件等。分为纯文本和二进制。 - 目录文件(
d
):目录,存储文件的唯一地方。 - 链接文件(
l
):指向同一个文件或目录的的文件。 - 设备文件:与系统外设相关的,通常在/dev下面。分为块设备(
b
)和字符设备(c
)。 - 管道文件(
p
) : 提供进程建通信的一种方式 - 套接字文件(
s
): 该文件类型与网络通信有关
2. Linux目录
文件结构是文件存放在磁盘等存贮设备上的组织方法。主要体现在对文件和目录的组织上。
Linux采用的是树型结构。最上层是根目录,其他的所有目录都是从根目录出发而生成的。
linux主要目录的功用:
/bin
二进制可执行命令/dev
设备特殊文件/etc
系统管理和配置文件/etc/rc.d
启动的配置文件和脚本
/home
用户主目录的基点,/lib
标准程序设计库,又叫动态链接共享库,作用类似windows里的.dll文件/sbin
系统管理命令,这里存放的是系统管理员使用的管理程序/tmp
公用的临时文件存储点/root
系统管理员的主目录/mnt
系统提供这个目录是让用户临时挂载其他的文件系统。/lost+found
这个目录平时是空的,系统非正常关机而留下“无家可归”的文件/proc
虚拟的目录,是系统内存的映射。可直接访问这个目录来获取系统信息/var
某些大文件的溢出区,比方说各种服务的日志文件/usr
最庞大的目录,要用到的应用程序和文件几乎都在这个目录。其中包含:/usr/bin
众多的应用程序/usr/sbin
超级用户的一些管理程序/usr/doc
linux文档/usr/include
linux下开发和编译应用程序所需要的头文件/usr/lib
常用的动态链接库和软件包的配置文件/usr/man
帮助文档/usr/src
源代码,linux内核的源代码就放在/usr/src/linux里/usr/local/bin
本地增加的命令/usr/local/lib
本地增加的库
3. Linux磁盘分区
硬盘分区的标识一般使用 /dev/hd[a-z]X
或者 /dev/sd[a-z]X
来标识,其中 [a-z]
代表硬盘号,X
代表硬盘内的分区号。
整块硬盘分区的块号标识:Linux下用 hda
、hdb
、sda
、sdb
等来标识不同的硬盘;
其中:
IDE
接口硬盘:表示为 /dev/hda1
、/dev/hdb
…;
SCSI
接口的硬盘、SATA
接口的硬盘表示为 /dev/sda
、/dev/sdb
… … ;
Linux下磁盘分区和目录的关系如下:
任何一个分区都必须挂载到某个目录上。
目录是逻辑上的区分。分区是物理上的区分。
磁盘Linux分区都必须挂载到目录树中的某个具体的目录上才能进行读写操作。
根目录是所有Linux的文件和目录所在的地方,需要挂载上一个磁盘分区。
4. linux文件系统
文件系统指文件存在的物理空间,linux系统中每个分区都是一个文件系统,都有自己的目录层次结构。linux会将这些分属不同分区的、单独的文件系统按一定的方式形成一个系统的总的目录层次结构。一个操作系统的运行离不开对文件的操作,因此必然要拥有并维护自己的文件系统。
- 文件系统类型:
ext2
: 早期linux中常用的文件系统
ext3
: ext2的升级版,带日志功能
RAMFS
: 内存文件系统,速度很快
NFS
: 网络文件系统,由SUN发明,主要用于远程文件共享
MS-DOS
: MS-DOS文件系统
VFAT
: Windows 95/98 操作系统采用的文件系统
FAT
: Windows XP 操作系统采用的文件系统
NTFS
: Windows NT/XP 操作系统采用的文件系统
HPFS
: OS/2 操作系统采用的文件系统
PROC
: 虚拟的进程文件系统
ISO9660
: 大部分光盘所采用的文件系统
ufsSun
: OS 所采用的文件系统
NCPFS
: Novell 服务器所采用的文件系统
SMBFS
: Samba 的共享文件系统
XFS
: 由SGI开发的先进的日志文件系统,支持超大容量文件
JFS
:IBM的AIX使用的日志文件系统
ReiserFS
: 基于平衡树结构的文件系统
udf
: 可擦写的数据光盘文件系统 - 文件系统特性:
Linux 正统的文件系统(如ext2、3
等)将硬盘分区时会划分出 超级块、inode Table区块 和 data block数据区域。- 超级块(
Superblock
): 这是整个文件系统的第一块空间。包括整个文件系统的基本信息,如块大小,inode/block的总量、使用量、剩余量,指向空间 inode 和数据块的指针等相关信息。 inode
块(文件索引节点) : 文件系统索引,记录文件的属性。它是文件系统的最基本单元,是文件系统连接任何子目录、任何文件的桥梁。每个子目录和文件只有唯一的一个 inode 块。它包含了文件系统中文件的基本属性(文件的长度、创建及修改时间、权限、所属关系)、存放数据的位置等相关信息.- 数据块(
Block
) :实际记录文件的内容,若文件太大时,会占用多个 block。为了提高目录访问效率,Linux 还提供了表达路径与 inode 对应关系的 dentry 结构。它描述了路径信息并连接到节点 inode,它包括各种目录信息,还指向了 inode 和超级块。
- 超级块(
链接
可以用ln
命令对一个已经存在的文件再建立一个新的连接,而不复制文件的内容。连接有软连接和硬连接之分,软连接又叫符号连接。它们各自的特点是:- 硬连接:原文件名和连接文件名都指向相同的物理地址。目录不能有硬连接;硬连接不能跨越文件系统(不能跨越不同的分区)文件在磁盘中只有一个拷贝,节省硬盘空间;
- 符号连接:用
ln -s
命令建立文件的符号连接符号连接是linux特殊文件的一种,作为一个文件,它的数据是它所连接的文件的路径名。类似windows下的快捷方式。
软硬链接的区别:
通过 filename 找到对应的 inode,通过对应的 inode 找到对应的数据块。
当硬链接时,仅仅只是使链接文件名指向原文件的inode,而软链接是创建了一个新的inode指向了同样的数据块。