##![软件程序运作](http://vbird.dic.ksu.edu.tw/image/logo.png "软件程序运作")软件程序运作
鸟哥在上课时常常会开玩笑的问:『我们知道没有插电的计算机是一堆废铁,那么插了电的计算机是什么?』 答案是:『一堆会电人的废铁』!这是因为没有软件的运作,计算机的功能就无从发挥之故。 就好像没有了灵魂的躯体也不过就是行尸走肉,重点在於软件/灵魂罗!所以底下咱们就得要了解一下『软件』是什么。
一般来说,目前的计算机系统将软件分为两大类,一个是系统软件,一个是应用程序。但鸟哥认为我们还是得要了解一下什么是程序, 尤其是机器程序,了解了之后再来探讨一下为什么现今的计算机系统需要『操作系统』这玩意儿呢!
****
###![机器程序与编译程序](http://vbird.dic.ksu.edu.tw/image/logo.png "机器程序与编译程序")机器程序与编译程序
我们前面谈到计算机只认识0与1而已,而且计算机最重要的运算与逻辑判断是在CPU内部, 而CPU其实是具有微指令集的。因此,我们需要CPU帮忙工作时,就得要参考微指令集的内容, 然后撰写让CPU读的懂得指令码给CPU执行,这样就能够让CPU运作了。
不过这样的流程有几个很麻烦的地方,包括:
- 需要了解机器语言:机器只认识0与1,因此你必须要学习直接写给机器看的语言! 这个地方相当的难呢!
- 需要了解所有硬件的相关功能函数:因为你的程序必须要写给机器看, 当然你就得要参考机器本身的功能,然后针对该功能去撰写程序码。例如,你要让DVD影片能够放映, 那就得要参考DVD光驱的硬件信息才行。万一你的系统有比较冷门的硬件,光是参考技术手册可能会昏倒~
- 程序不具有可携性:每个CPU都有独特的微指令集,同样的,每个硬件都有其功能函数。 因此,你为A计算机写的程序,理论上是没有办法在B计算机上面运作的!而且程序码的修改非常困难! 因为是机器码,并不是人类看的懂得程序语言啊!
- 程序具有专一性:因为这样的程序必须要针对硬件功能函数来撰写, 如果已经开发了一支浏览器程序,想要再开发档案管理程序时,还是得从头再参考硬件的功能函数来继续撰写, 每天都在和『硬件』挑战!可能需要天天喝蛮牛了!@_@
那怎么解决啊?为了解决这个问题,计算机科学家设计出一种让人类看的懂得程序语言, 然后创造一种『编译器』来将这些人类能够写的程序语言转译成为机器能看懂得机器码, 如此一来我们修改与撰写程序就变的容易多了!目前常见的编译器有C, C++, Java, Fortran等等。 机器语言与高阶程序语言的差别如下所示:
<center>
![图4.1.1、编译器的角色](http://vbird.dic.ksu.edu.tw/linux_basic/0105computers_files/compiler.gif "图4.1.1、编译器的角色")
图4.1.1、编译器的角色
</center>
从上面的图示我们可以看到高阶程序语言的程序码是很容易察看的!鸟哥已经将程序码(英文)写成中文说~ 这样比较好理解啦!所以这样已经将程序的修改问题处理完毕了。 问题是,在这样的环境底下我们还是得要考量整体的硬件系统来设计程序喔!
举例来说,当你需要将运作的数据写入内存中,你就得要自行分配一个内存区块出来让自己的数据能够填上去, 所以你还得要了解到内存的位址是如何定位的,啊!眼泪还是不知不觉的流了下来... 怎么写程序这么麻烦啊!
为了要克服硬件方面老是需要重复撰写控制码的问题,所以就有操作系统(Operating System, OS)的出现了! 什么是操作系统呢?底下就来谈一谈先!
###![操作系统](http://vbird.dic.ksu.edu.tw/image/logo.png "操作系统")操作系统
***
如同前面提到的,在早期想要让计算机执行程序就得要参考一堆硬件功能函数,并且学习机器语言才能够撰写程序。 同时每次写程序时都必须要重新改写,因为硬件与软件功能不见得都一致之故。那如果我能够将所有的硬件都驱动, 并且提供一个发展软件的参考介面来给工程师开发软件的话,那发展软件不就变的非常的简单了?那就是操作系统啦!
***
- **操作系统核心(Kernel)**
>操作系统(Operating System, OS)其实也是一组程序, 这组程序的重点在於管理计算机的所有活动以及驱动系统中的所有硬件。 我们刚刚谈到计算机没有软件只是一堆废铁,那么操作系统的功能就是让CPU可以开始判断逻辑与运算数值、 让主内存可以开始载入/读出数据与程序码、让硬盘可以开始被存取、让网络卡可以开始传输数据、 让所有周边可以开始运转等等。总之,硬件的所有动作都必须要透过这个操作系统来达成就是了。
>上述的功能就是操作系统的核心(Kernel)了!你的计算机能不能做到某些事情,都与核心有关! 只有核心有提供的功能,你的计算机系统才能帮你完成!举例来说,你的核心并不支持TCP/IP的网络协定, 那么无论你购买了什么样的网卡,这个核心都无法提供网络能力的!
>但是单有核心我们使用者也不知道能作啥事的~因为核心主要在管控硬件与提供相关的能力(例如网络功能), 这些管理的动作是非常的重要的,如果使用者能够直接使用到核心的话,万一使用者不小心将核心程序停止或破坏, 将会导致整个系统的崩溃!因此核心程序所放置到内存当中的区块是受保护的! 并且开机后就一直常驻在内存当中。
<center class="m-tips">
**Tips:**所以整部系统只有核心的话,我们就只能看著已经准备好运作(Ready)的计算机系统,但无法操作他! 好像有点望梅止渴的那种感觉啦!这个时候就需要软件的帮忙了!
![](http://vbird.dic.ksu.edu.tw/linux_basic/0105computers_files/vbird_face.gif);
</center>
****
- **系统呼叫(System Call)**
>既然我的硬件都是由核心管理,那么如果我想要开发软件的话,自然就得要去参考这个核心的相关功能! 唔!如此一来不是从原本的参考硬件函数变成参考核心功能,还是很麻烦啊!有没有更简单的方法啊!
>为了解决这个问题,操作系统通常会提供一整组的开发介面给工程师来开发软件! 工程师只要遵守该开发介面那就很容易开发软件了!举例来说,我们学习C程序语言只要参考C程序语言的函式即可, 不需要再去考量其他核心的相关功能,因为核心的系统呼叫介面会主动的将C程序语言的相关语法转成核心可以了解的任务函数, 那核心自然就能够顺利运作该程序了!
>如果我们将整个计算机系统的相关软/硬件绘制成图的话,他的关系有点像这样:
<center>
![](http://vbird.dic.ksu.edu.tw/linux_basic/0105computers_files/os_01.gif)
</center>
计算机系统主要由硬件构成,然后核心程序主要在管理硬件,提供合理的计算机系统资源分配(包括CPU资源、内存使用资源等等), 因此只要硬件不同(如x86架构与RISC架构的CPU),核心就得要进行修改才行。 而由於核心只会进行计算机系统的资源分配,所以在上头还需要有应用程序的提供,使用者才能够操作系统的。
为了保护核心,并且让程序设计师比较容易开发软件,因此操作系统除了核心程序之外,通常还会提供一整组开发介面, 那就是系统呼叫层。软件开发工程师只要遵循公认的系统呼叫参数来开发软件,该软件就能够在该核心上头运作。 所以你可以发现,软件与核心有比较大的关系,与硬件关系则不大!硬件也与核心有比较大的关系! 至於与使用者有关的,那就是应用程序啦!
<center class="m-tip">
**Tips:**
在定义上,只要能够让计算机硬件正确无误的运作,那就算是操作系统了。所以说, 操作系统其实就是核心与其提供的介面工具,不过就如同上面讲的,因为最简单的核心缺乏了与使用者沟通的亲和介面, 所以在目前,一般我们提到的『操作系统』都会包含核心与相关的使用者应用软件呢!
![](http://vbird.dic.ksu.edu.tw/linux_basic/0105computers_files/vbird_face.gif)
</center>
简单的说,上面的图示可以带给我们底下的概念:
- 操作系统的核心层直接参考硬件规格写成, 所以同一个操作系统程序不能够在不一样的硬件架构下运作。举例来说,个人计算机版的Windows XP不能直接在RISC架构的计算机下运作。 所以您知道为何Windows XP又分为32位及64位的版本了吧?因为32/64位的CPU指令集不太相同, 所以当然要设计不同的操作系统版本了。
- 操作系统只是在管理整个硬件资源,包括CPU、内存、输入输出装置及档案系统档。 如果没有其他的应用程序辅助,操作系统只能让计算机主机准备妥当(Ready)而已!并无法运作其他功能。 所以你现在知道为何Windows XP上面要达成网页影像的运作还需要类似PhotoImpact或Photoshop之类的软件安装了吧?
- 应用程序的开发都是参考操作系统提供的开发介面, 所以该应用程序只能在该操作系统上面运作而已,不可以在其他操作系统上面运作的。 现在您知道为何去购买线上游戏的光盘时,光盘上面会明明白白的写著该软件适合用於哪一种操作系统上了吧? 也该知道某些游戏为何不能够在Linux上面安装了吧?
****
- **核心功能**
- 既然核心主要是在负责整个计算机系统相关的资源分配与管理,那我们知道其实整部计算机系统最重要的就是CPU与主内存, 因此,核心至少也要有这些功能的:
- 系统呼叫介面(System call interface)
刚刚谈过了,这是为了方便程序开发者可以轻易的透过与核心的沟通,将硬件的资源进一步的利用, 於是需要有这个简易的介面来方便程序开发者。
- 程序管理(Process control)
总有听过所谓的『多工环境』吧?一部计算机可能同时间有很多的工作跑到CPU等待运算处理, 核心这个时候必须要能够控制这些工作,让CPU的资源作有效的分配才行!另外, 良好的CPU排程机制(就是CPU先运作那个工作的排列顺序)将会有效的加快整体系统效能呢!
- 内存管理(Memory management)
控制整个系统的内存管理,这个内存控制是非常重要的,因为系统所有的程序码与数据都必须要先存放在内存当中。 通常核心会提供虚拟内存的功能,当内存不足时可以提供内存置换(swap)的功能哩。
- 档案系统管理(Filesystem management)
档案系统的管理,例如数据的输入输出(I/O)等等的工作啦!还有不同档案格式的支持啦等等, 如果你的核心不认识某个档案系统,那么您将无法使用该档案格式的档案罗!例如:Windows 98就不认识NTFS档案格式的硬盘;
- 装置的驱动(Device drivers)
就如同上面提到的,硬件的管理是核心的主要工作之一,当然罗,装置的驱动程序就是核心需要做的事情啦! 好在目前都有所谓的『可载入模组』功能,可以将驱动程序编辑成模组,就不需要重新的编译核心啦! 这个也会在后续的第二十章当中提到的!
<center>
**Tips:**
事实上,驱动程序的提供应该是硬件厂商的事情!硬件厂商要推出硬件时,应该要自行参考操作系统的驱动程序开发介面, 开发完毕后将该驱动程序连同硬件一同贩卖给使用者才对!举例来说,当你购买显示卡时, 显示卡包装盒都会附上一片光盘,让你可以在进入Windows之后进行驱动程序的安装啊!
![](http://vbird.dic.ksu.edu.tw/linux_basic/0105computers_files/vbird_face.gif)
</center>
****
- **操作系统与驱动程序**
----
老实说,驱动程序可以说是操作系统里面相当重要的一环了!不过,硬件可是持续在进步当中的! 包括主机板、显示卡、硬盘等等。那么比较晚推出的较新的硬件,例如显示卡,我们的操作系统当然就不认识罗! 那操作系统该如何驱动这块新的显示卡?为了克服这个问题,操作系统通常会提供一个开发介面给硬件开发商, 让他们可以根据这个介面设计可以驱动他们硬件的『驱动程序』,如此一来,只要使用者安装驱动程序后, 自然就可以在他们的操作系统上面驱动这块显示卡了。
<center>
![图4.2.2、驱动程序与操作系统的关系](http://vbird.dic.ksu.edu.tw/linux_basic/0105computers_files/computer_driver.png "图4.2.2、驱动程序与操作系统的关系")
图4.2.2、驱动程序与操作系统的关系
</center>
由上图我们可以得到几个小重点:
- 操作系统必须要能够驱动硬件,如此应用程序才能够使用该硬件功能;
- 一般来说,操作系统会提供开发介面,让开发商制作他们的驱动程序;
- 要使用新硬件功能,必须要安装厂商提供的驱动程序才行;
- 驱动程序是由厂商提供的,与操作系统开发者无关。
所以,如果你想要在某个操作系统上面安装一张新的显示卡,那么请要求该硬件厂商提供适当的驱动程序吧! ^_^! 为什么要强调『适当的驱动程序』呢? 因为驱动程序仍然是依据操作系统而开发的, 所以,给Windows用的驱动程序当然不能使用於Linux的环境下了。
----
##![](http://vbird.dic.ksu.edu.tw/image/logo.png)应用程序
应用程序是参考操作系统提供的开发介面所开发出来软件,这些软件可以让使用者操作,以达到某些计算机的功能利用。 举例来说,办公室软件(Office)主要是用来让使用者办公用的;影像处理软件主要是让使用者用来处理影音数据的; 浏览器软件主要是让使用者用来上网浏览用的等等。
需要注意的是,应用程序是与操作系统有关系的,如同上面的图示当中的说明喔。因此,如果你想要购买新软件, 请务必参考软件上面的说明,看看该软件是否能够支持你的操作系统啊!举例来说,如果你想要购买线上游戏光盘, 务必参考一下该光盘是否支持你的操作系统,例如是否支持Windows XP/Windows Vista/MAC/Linux等等。 不要购买了才发现该软件无法安装在你的操作系统上喔!
我们拿常见的微软公司的产品来说明。你知道Windows XP, Office 2007之间的关系了吗?
- Windows XP是一套操作系统,他必须先安装到个人计算机上面,否则计算机无法开机运作;
- Windows 98与Windows XP是两套不同的操作系统,所以能在Win 98上安装的软件不见得可在WinXP上安装;
- Windows XP安装好后,就只能拥有很少的功能,并没有办公室软件;
- Office 2007是一套应用程序,要安装前必须要了解他能在哪些操作系统上面运作。
- 第一部份 Linux 的规划与安装
- 第零章 计算机概论
- 1. 計算机:辅助人脑的好工具
- 2. 个人计算机架构与周边设备
- 3. 数据表示方式
- 4. 软件程序运作
- 5. 重点回顾、本章习题、参考数据与延伸阅读
- 第一章 Linux是什么
- 1. Linux是什么
- 2. Torvalds的Linux发展
- 3. Linux的特色
- 4. 重点回顾、本章习题、参考数据与延伸阅读
- 第二章 Linux如何学习
- 1. Linux当前的应用角色
- 2. 鸟哥的Linux苦难经验全都录
- 3. 有心朝Linux作业系统学习者的学习态度
- 4. 鸟哥的建议(重点在solution的学习)
- 5. 重点回顾、本章习题、参考数据与延伸阅读
- 第三章 主机规划与磁盘分区
- 1. Linux与硬件的搭配
- 2. 磁盘分区
- 3. 安装Linux前的规划
- 4. 重点回顾、本章习题、参考数据与延伸阅读
- 第四章 安装CentOS 5.x 与多重引导技巧
- 1. 本练习机的规划--尤其是分割参数
- 2. 开始安装CentOS 5
- 3. 安装后的首次设定
- 4. 多重开机安装流程与技巧
- 5. 关於大硬盘导致无法开机的问题
- 6. 重点回顾、本章习题、参考数据与延伸阅读
- 第五章 首次登陆与 在线求助 man page
- 1. 首次登陆系统
- 2. 文本模式下命令的下达
- 3. Linux系统的在线求助man page与info page
- 4. 超简单文书编辑器: nano
- 5. 正确的关机方法:sync,shutdown
- 6. 启动过程的问题排解
- 7. 重点回顾、本章习题、参考数据与延伸阅读
- 第二部分 Linux 文件、目录与磁盘格式
- 第六章 Linux文件权限与 目录配置
- 1. 使用者与群组
- 2. Linux文件权限概念
- 3. Linux目录配置
- 4. 重点回顾、本章习题、参考数据与延伸阅读
- 第七章 Linux文件与目录管理
- 1. 目录与路径
- 2. 文件与目录管理
- 3. 文件内容查阅
- 4. 文件与目录的默认权限与隐藏权限
- 5. 命令与文件的搜寻:
- 6. 极重要!权限与命令间的关系:
- 7. 重点回顾、本章习题、参考数据与延伸阅读
- 第八章 Linux 磁盘与 文件系统管理
- 1. 认识 EXT2 文件系统
- 2. 文件系统的简单操作
- 3. 磁盘的分割、格式化、检验与挂载
- 4. 配置启动挂载:
- 5. 内存置换空间(swap)之建置:
- 6. 文件系统的特殊观察与操作
- 7. 重点回顾、本章习题、参考数据与延伸阅读
- 第九章 文件的压缩与打包
- 1. 压缩文件的用途与技术
- 2. Linux 系统常见的压缩命令
- 3. 打包命令:
- 4. 完整备份工具:dump
- 5. 光盘写入工具
- 6. 其他常见的压缩与备份工具
- 7. 重点回顾、本章习题、参考数据与延伸阅读
- 第三部分:学习 Shell 与 Shell scripts
- 第十章 vim程序编辑器
- 1. 为何要学 vim
- 2. vi 的使用
- 3. vim 的额外功能
- 4. 其他 vim 使用注意事项
- 5. 重点回顾、本章习题、参考数据与延伸阅读
- 第十一章 认识与学习 BASH
- 1. 认识 BASH 这个 Shell
- 2. Shell 的变量功能
- 3. 命令别名与历史命令
- 4. Bash shell 的操作环境
- 5. 数据流重导向 (Redirection)
- 6. 管线命令 (pipe)
- 7. 重点回顾、本章习题、参考数据与延伸阅读
- 第十二章 正规表示法与 文件格式化处理
- 1. 前言: 什么是正规表示法
- 2. 基础正规表示法
- 3. 延伸正规表示法
- 4. 文件的格式化与相关处理
- 5. 重点回顾、本章习题、参考数据与延伸阅读
- 第十三章 学习 shell scripts
- 1. 什么是 Shell Script
- 2. 简单的 shell script 练习
- 3. 善用判断式
- 4. 条件判断式
- 5. 回圈 (loop)
- 6. shell script 的追踪与 debug
- 7. 重点回顾、本章习题、参考数据与延伸阅读
- 第四部分:Linux 使用者管理
- 第十四章 Linux 账号管理与 ACL 权限控制
- 1. Linux 的账号与群组
- 2. 账号管理
- 3. 主机的细部权限规划:ACL 的使用
- 4. 使用者身份切换
- 5. 使用者的特殊 shell 与 PAM 模块
- 6. Linux 主机上的用户信息传递
- 7. 手动新增使用者
- 8. 重点回顾、本章习题、参考数据与延伸阅读
- 第十五章 磁盘配额(Quota)与 进阶文件系统管理
- 1. 磁碟配额 (Quota) 的应用与实作
- 2. 软件磁盘阵列 (Software RAID)
- 3. 逻辑卷轴管理员 (Logical Volume Manager)
- 4. 重点回顾、本章习题、参考数据与延伸阅读
- 第十六章 例行性工作排程 (crontab)
- 1. 什么是例行性工作排程
- 2. 仅运行一次的工作排程
- 3. 循环运行的例行性工作排程
- 4. 可唤醒停机期间的工作任务
- 5. 重点回顾、本章习题、参考数据与延伸阅读
- 第十七章 程序管理与 SELinux 初探
- 1. 什么是程序 (Process)
- 2. 工作管理 (job control)
- 3. 程序管理
- 4. 特殊文件与程序
- 5. SELinux 初探
- 6. 重点回顾、本章习题、参考数据与延伸阅读
- 第五部分:Linux 系统管理员
- 第十八章 认识系统服务 (daemon)
- 1. 什么是 daemon 与服务 (service)
- 2. 解析 super daemon 的配置文件
- 3. 服务的防火墙管理 xinetd, TCP Wrappers
- 4. 系统开启的服务
- 5. 重点回顾、本章习题、参考数据与延伸阅读
- 第十九章 认识与分析登录档
- 1. 什么是登录文件
- 2. syslogd :记录登录文件的服务
- 3. 登录文件的轮替 (logrotate)
- 4. 分析登录文件
- 5. 本章习题练习、针对本文的建议
- 第二十章 启动流程、模块管理 与 loader
- 1. Linux 的启动流程分析
- 2. 核心与核心模块
- 3. Boot loader: Grub
- 4. 启动过程的问题解决
- 5. 重点回顾、本章习题、参考数据与延伸阅读
- 第二十一章 系统配置工具(网络与 打印机)与硬件侦测
- 1. CentOS 系统配置工具: setup
- 2. 利用 CUPS 配置 Linux 打印机
- 3. 硬件数据收集与驱动,及 lm_sensors
- 4. 重点回顾、本章习题、参考数据与延伸阅读
- 第二十二章 软件安装: 原始码与 Tarball
- 1. 开放源码的软件安装与升级简介
- 2. 使用传统程序语言进行编译的简单范例
- 3. 用 make 进行巨集编译
- 4. Tarball 的管理与建议
- 5. 函式库管理
- 6. 检验软件的正确性
- 7. 重点回顾、本章习题、参考数据与延伸阅读
- 第二十三章 软件安装:RPM, SRPM 与 YUM 功能
- 1. 软件管理员简介
- 2. RPM 软件管理程序: rpm
- 3. SRPM 的使用: rpmbuild
- 4. YUM 线上升级机制
- 5. 管理的抉择:RPM 还是 Tarball
- 6. 重点回顾、本章习题、参考数据与延伸阅读
- 第二十四章 X Window 配置介绍
- 1. 什么是 X Window System
- 2. X Server 配置档解析与配置
- 3. 显卡驱动程序安装范例
- 4. 重点回顾、本章习题、参考数据与延伸阅读
- 第二十五章 Linux 备份策略
- 1. 备份要点
- 2. 备份的种类、频率与工具的选择
- 3. VBird 的备份策略与 scripts
- 4. 灾难复原的考量
- 5. 重点回顾、本章习题、参考数据与延伸阅读
- 第二十六章 核心编译
- 1. 编译前的任务:认识核心与取得核心原始码
- 2. 核心编译的前处理与核心功能选择
- 3. 核心的编译与安装
- 4. 额外(单一)核心模块编译
- 5. 重点回顾、本章习题、参考数据与延伸阅读