仅为个人学习备忘,方便日后查阅
一、程序的执行过程
计算机本身就是一堆硬件,其中最核心的就是 CPU 和内存。为了实现计算机获得数据,数据的输入输出,需要输入设备和输出设备。在计算机体系内部,一般来讲,输入输出设备是通过南桥接入当前系统的。
对于一个简单的PC机而言,在某一个时刻只能运行一个程序。但是计算机的计算能力很强,一个程序运行程序内容所占用的 CPU 的时间不是特别多。为了能够尽可能地利用计算机的计算能力,需要将计算机同时运行多个程序,因此每个程序运行起来以后需要一个协调器,这个协调程序我们把它称为叫操作系统。操作系统还包含许多其它程序,此处称为内核 kernel 更合理一点。内核本身就负责管理硬件资源,并且将硬件资源虚拟成其他样子,提供给上层所需要的应用程序。
如果一个程序可以直接运行在硬件上,这个程序本身就可以控制硬件的各种属性。其他程序要想运行在硬件上,这些程序之间可能会产生干扰,一个恶意的应用程序可能会导致其他应用程序通通退出。所以需要一个统一的资源管理者,任何应用程序要想使用硬件,必须通过内核来完成。
内核也不会允许程序直接访问硬件,它是将硬件所提供的运算能力,通过一个一个地系统调用来实现的。
系统调用是非常底层的应用,程序员要想根据系统调用来编程会非常麻烦,非常烦琐,而且许多程序之间的功能是相同的。比如word需要打印,excel也需要打印,如果都自己开发,计算机上大量的功能是重复的,这种重复势必会额外地占用空间。从资源的组织角度来讲也不合理。因此操作系统除了提供内核以外,还将内核所提供的一些系统调用输出出来,这种输出是通过高层一点的调用接口来实现,这种接口我们把它称为库。
库本身也是应用程序,只不过这个应用程序没有程序的执行入口,它是不能自我独立运行的。只能被其他程序调用的时候执行。
程序员不使用库,直接在内核上编程也可以,只不过比较麻烦而已。所以调用除了系统调用以外,还有库调用(library call)。库对于一个操作系统,或内核而言,称为应用编程接口,API。
在库的上层就是应用程序,这个应用程序很可能直接运行在系统调用上,内核上,也有可能是通过库调用来完成。只不过使用库调用编程起来可能会更简单,但使用内核调用,它的执行效率可能会更高,因为至少不用使用库来完成了,而且它获得的操作权限也可能会更大。
无论有多少个应用程序,这些程序在操纵系统启动的时候,这个程序未必会运行起来,只不过说操纵系统启动以后,这些程序只是具备了运行条件,或者说已经有了运行环境,但它并没有运行。
通常启动一个程序的方式有多种。比如说,操作系统一启动,这个程序就自动启动起来。比如装完一个干净的操作系统,点开进程管理器,里面也有很多进程。这些进程是随系统的启动而启动的。这些进程有些可以称为服务,或后台服务。操作系统为了自身的运行,或完整的能力,启动一些程序才能让操作系统提供一个基本的功能。
有些是按需启动,比如需要编辑一个word文档的时候,才需要启动 word 。不然开机windows ,自动启动word,没有任何意义。这种程序需要手动启动,称为交互式程序。
敲了一下键盘之后,信息一定是由 CPU 先接收的,通过中断先到达CPU。CPU并不知道敲键盘这个信息意味着什么。能够跟硬件交互的只有内核,CPU在拿到这个信息以后,先通知内核来处理,内核会知道这个命令是由哪个进程发起来的。整个系统资源的监控,包括上层所运行的应用的监控都是由内核来完成的。内核会知道到底哪个进程处于当前焦点进程,而负责接收这样一个快捷键,或键的组合,由内核再转交给应用程序来完成。
二、隔离机制
操作系统本身也是一个程序,它也需要运行,就需要有指令和数据,而指令和数据是放在内存中的。那就意味着在内存当中既有内核,还有其他的应用程序。如果一个恶意的应用程序,能够直接访问内核,能够修改内核中的某些数据的话,意味着系统的稳定性将无从得到保证。所以必须有一种机制,能够将应用程序和内核隔离开来。
通常情况下,比如像intel这类的平台上,会提供所谓的保护机制,或保护模式。一般CPU有四个级别,是同心圆的四个环。最内层,称为0级别,或第0环,也称为特权级别。只有内核才能运行在特权模式下。而其他应用程序只能运行在最外层级别。中间两层没用。所以任何时候,应用程序是不能访问内存当中处于0级别的内存区域的。
CPU跟内存彼此之间是紧密结合的。CPU的0级别,会映射到内存中处于保护的某一段当中。
内存分为三段。
最底层的一段为BIOS的映射程序,POST加电自检之后,BIOS就自动映射到内存的开端之处。
然后载入操作系统内核。kernel space
再后面的空间被多个应用程序所共享。
但是,这样去划分内存,非常容易产生内存碎片。
三、shell
shell 是整个操作系统的外壳,是能够实现接收用户指令,理解用户的命令,并且将它传输给内核,由内核指挥某个应用程序启动的这么一个界面。
GUI: Graphical User Interface 图形界面的 shell
CLI: command-line interface 命令行接口
无论是 GUI 还是 CLI 也是应用程序,所以在不同的操作系统上,它们可能有提供的不同的替换版本。
linux 常见的有三种图形界面,gnome,kde,xface
windows 上只有一种,而且是无法替换的。 windows 2008之前 shell 是直接做进内核的,无法替换。windows 2008 提供了 power shell 这样的接口,也可以不用使用图形界面了。
而对CLI而讲,DOS 本身就是命令行,而linux 的 shell 就有很多。
GUI 和 CLI 也是应用程序,而且在这个接口下所启动的任何应用程序,如果把GUI 或 CLI 关闭,那在这个接口下所启动的应用程序也会关闭。比如将 windows 桌面注销了,那启动的 word 也会退出。
四、内核的功能
进程管理
内存管理
文件系统
网络功能
硬件驱动
安全机制
五、操作系统历史
- 批处理系统
是现代操作系统的前身。当时没有操作系统的前提下,我们的每一个程序都是直接在硬件上运行的,表现为一个一个的作业。
作业一执行完了,它会自动地载入第二个作业,彼此之间使用分隔符分开。
jobs1$$$$$$$$$$$jobs2$$$$$$$$$$$$
第一个程序执行完了,再执行第二个程序。这是远远无法发挥出我们硬件的功能的。
2. Multics
这时有是三个组织,GE (通用电气),美国的电报电话公司(AT & T)的 Bell 实验室,以及麻省理工大学 MIT 的人工智能实验室,联合起来研发比批处理高级的 多任务、多用户的系统。使用汇编语言来开发出来适用于大型机 MainFrame ,能够支持多任务和多用户的系统,称为 Multics.
这时它们已经完成了基本的功能,GE 首先退出,然后 Bell 退出,留下 MIT 研发。
3. Unix
Bell 大概 1970 年退出,当时为了研发招收的科学家就空闲起来了。 其中就包括 ken 。
Ken Thompson:
Space Travel 使用 VGA 图形卡。当时只能运行在 Multics 上。由于 Bell 退出,Ken 无法再免费使用 Multics
70年代,主要生产计算机的公司除了 IBM 还有 DEC.
DEC:
PDP 系列 ,当时最新是 PDP-11
VAX 系列 -- vms
Space Travel 是应用程序。应用程序要运行起来,必须依赖内核。Ken 利用 PDP-7 凭借它对 Multic的理解,开发出一个简单的内核来运行他的 Space Travel ,后来成功了。他在 Bell 实验室到处推销他的游戏。但是大家对他的游戏不感兴趣,倒是对他的系统感兴趣。
应用程序是用汇编开发的,汇编是跟硬件平台紧密结合的。PDP-7 上开发的应用程序想运行在其他系统上不可以。所以Ken 重新移植到其他主机系列上。成功后,它的系统风靡 Bell 实验室。后来他的同事戏谑地称他的系统为 Unics 。因为系统功能非常简单,相对于 Multi 所以叫 Uni 。后来改为 Unix 。
Dennis Ritchie:
这时 Unix 都是使用汇编研发的,性能不错,但移植困难。为了能够扭转这种劣势,Dennis 希望使用高级语言重新开发 Unix 。这样只要使用不同的编译器,在不同的平台版本上编译,就能完成 Unix 的移植。因为高级语言对底层的硬件依赖程度是非常低的。
Dennis 对 B 语言引入了变量、地址等,开发了 C 语言。在当时,高级语言的运行效率比低级语言至少要低 30% 。
1974年,Dennis 和 Ken 在计算机通信杂志发表 Unix 论文。Bell 属于 AT & T 。根据反垄断法,AT & T 不能销售除了电报电话以外的任何商品,不但不能出售,别人要还得给,无偿提供。计算机年会,当别人索要Unix的时候,他们不得以,只好无偿提供。
Bill Jey:
成立了 BSRG ,伯克利操作系统研究小组。
1976年,Ken到美国加州大学伯克利分校任教。 此前,伯克利就获得了 Unix 源代码进行研究。
TCP协议的拥塞控制等功能都诞生在 BSRG Unix 这个版本上。
BSD: Berkely System Distribution 伯克利系统发行版
融合了各种功能,Bill Jey 将 Unix 对外发布,并改名 BSD 。开始卖钱,牟利甚多,引起贝尔实验室不满。
System: 贝尔实验室的 Unix 版本.
后来贝尔实验室被卖给了 Novell,从此不再受 AT & T不能销售操作系统的约束。分拆出来以后,迫不及待卖钱,一个授权 4万美元。到底谁是正统,谁该卖,谁不该卖,跟 BSD 打官司打了十年。
Microsoft: 81年,在美国西雅图一个小公司,Microsoft 成立
IBM 、康柏公司 开始生产 PC 机。
任何计算机没有操作系统没法用。而 Unix 当时只能运行在PDP系列上。Unix 始终没有往 PC 兼容机上移植。当时PDP用的是摩托罗拉公司的M68K CPU。而 PC 机用的都是 Intel 的 8086,8088 ,80286.
当时Intel语言界面丑陋,性能很差,Unix 程序员不屑于把Unix运行在PC机上去 。
CP/M
买一个PC大概2-3万美元,买一个CP/M大概也要3万美元。
微软三个人卖 Basic 编译器,包装发型 Unix ,起名 Xenix。
Bob 朋友花4个星期,仿照 CP/M写了一个操作系统。比尔盖茨一手托两家,5万美元从小程序员买断操作系统,转手卖给 IBM 授权。买断后,敲敲打打,改名 DOS 。
DOS:Disk Operating System,单用户,单任务。
PC机卖出上百万台,DOS获得千万美元利润。
jobs:
这种好的现状,自从另外三个年轻人,创立了另外一家公司以后就破灭了。
乔布斯非常崇拜计算机科学之父图灵。图灵吃了抹了氰化钾的苹果死去。所以乔布斯的公司命名苹果。
乔布斯在apple1上装的是 Unix,界面比DOS好。cpu用的不是 x86,而是 Power.
Xerox: 施乐公司,生产复印机。
PARK实验室:在 Unix基础上,研究出了第一个鼠标,第一个图形操作界面。乔布斯溜进实验室,发现这个研究成果。找到公司,买走拷贝。组织团队研发,apple2 发型的时候,图形界面已经出现。
这对比尔盖茨是当头一棒,DOS还有谁要,于是接近乔布斯,从乔布斯这里骗走一份拷贝。当乔布斯发现的时候,比尔盖茨已经将他的系统重命名为 Windows 。(基于DOS开发)
乔布斯系统是封闭的,不单卖,要买机器一块买。Windows 只卖许可证。
FreeBSD: 世界上第一个能运行在PC机上的正统 Unix 。
OpenBSD: 专注于安全
NetBSD: 专注于服务
迄今为止,苹果的Unix的核心都是 FreeBSD 的内核。
Sun Microsystem: Bill Jey 联合另外两个人成立。
生产工作站,比小型机要轻量级,但性能不差,有自己独立的操作系统。
Sun OS --> 为了避免官司,由BSD 转而使用贝尔实验室的 Unix,改名 Solaris .正统 Unix 。只能运行在Sun 自己的硬件 SPARK 上。
Bill Jey 还引入了 CSH,兼容 C语言风格的 shell 。
Windows 95,98本身基于DOS,DOS本身就是梦魇。
Windows NT: (new technology)DEC 生产的VAX使用 vms操作系统。比尔盖茨引入vms,在vms基础上开 发。内核不再是 DOS,而是 vms
六、Linux
Andrew:
当Unix开始卖钱之后,很多科研机构就不能再免费使用 Unix了。于是荷兰的 Andrew 仿照 Unix 开发 Minix ,上课用。
有一年到芬兰赫尔辛基上课。Mixnix 是开发在教授自己的主机上的,很多地方是用汇编语言写的。因此他的学生要学习 Minix,装在自己的主机上,不得不自己开发驱动程序。
Linus: 自己写了个系统,叫 Linux 。
80年代,Stallman, 倡导软件自由。
GNU: GNU is Not Unix 。递归缩写。
GPL: General Public License 自由
Emacs: 文本编辑器
gcc: GNU C Compiler ,转成二进制
bash
Linux: 只是一个内核。它不是应用程序,它没有库,库在 Linux叫 glibc .gcc 是编译器。
ABI: Applicaiton Binary Interface
编译必须要两个平台完全一样,意味着编译之后期望它能在 x86机器上运行,那就必须在 x86 上进行编译。否则,编译出来的程序只能在当前CPU上运行,拿到其他主机上运行不了。
交叉编译:在A机器上编译,拿到B机器上运行。尽管都是二进制,都是 Intel 的 CPU,在酷睿上编译的程序,不一定能奔腾在上运行,因为 CPU 支持的二进制格式各不相同。
GNU/Linux: 完整的操作系统,GNU还提供很多外围软件。
无论 GNU 的软件,还是 Linux 的内核,都是源代码,是 c 开发的程序。任何程序要运行,得编译成二进制。编译成 01代码,计算机才能识别,计算机才能运行。
Linux 通过源代码的方式向全球的使用者来发布,谁来负责编译呢?
第三方组织,负责编译 Linux 内核,和各种外围应用程序。并将它们做成打包发行成可安装的便捷的这种方式的Linux,直接做成二进制向外打包发布。
Linux 发行商:release
本身都不是Linux的拥有者,只负责将源代码格式的Linux,在通用平台上编译成通用格式,使得其他人拿到以后可以在大多数硬件平台上安装并使用。
SLS: 91年
Debian: 92年。唯一没有商业公司支持。高级用户中流行
Red Hat : 93 年成立于北卡罗来纳州。北美、中国流行
SUSE:被 Novell (Netware)收购了。SUSE前身 SLS。欧洲流行
Ubuntu: 基于 Debian 的二次发行版。界面漂亮,主要基于PC机使用。
Mint: 基于 Ubuntu 二次发行,更漂亮
内核由Linus维护,软件由GNU组织维护,发行商只负责包装发行,只是在包装发行过程中,加入了自己对于一个操纵系统的理解,加入了自己对于某些参数的调整,加入了自己公司的 LOGO,使得 Linux 看起来各不相同。事实上,内核一样,软件一样,可能配置文件不一样而已。
包管理器:
Linux 有内核,GNU提供软件,打包发行的时候不能把所有软件都装上去。早期软件都是打包在一块进行安装的。这不便于软件包的单个管理。
Debian: dpt
Red Hat: rpm
这些系统它们本身都遵循 GPL,就算是红帽把它做成了二进制格式,但它也要把它的软件包的源码格式公布出来,因为 GPL 有这种规定。
GPL: 任何人,当你获取GPL组织的软件程序以后,无论你怎么改,改完以后必须要把你改的内容也一并 公布出来,不公布你就侵权。它们主要是为了保证软件自由的。
所以GPL就像病毒一样,任何人都不敢沾它。假如软件有20行,我借鉴了10行,后来又开发了一万 行,那这一万行必须得公开。
LGPL: Lesser GPL
GPL v2
GPL v3
GPL 是非常严格的
其他开源协议:
BSD
Apache
BSD 和 Apache 要宽松得多。
开源:开放源代码
自由:
自由获取,自由修改,自由学习
Linux 是GPL的,所以红帽发行的时候,要发布两种版本,一种是包装好的二进制格式,一种是发布源代码格式的。
Windows卖的是版权,Red Hat 卖的是服务。
CentOS: Community Enterprise Operating System
红帽只要发布源程序,CentOS,就把它做成二进制,而且跟红帽一模一样。
红帽是红帽公司的注册商标,因此改名叫 CentOS,图表不一样,LOGO不一样,但是程序格式是 完全兼容的。但是 CentOS 不提供服务保证。
国内用的最多。
Fedora: 红帽开始发行个人版,到9.0 ,在2003年终止,后来捐献给 Fedora。
Fedora 再测试稳定以后,会引入后续的红帽企业版。
Mandriva: 桌面
Linux是内核,是内核就有版本,0.1, 1.0, 2.0,...
RHEL: 3.0, 4.0, 5.0, 6.0 红帽发行版的版本
七、Linux 基本原则
- 由目的单一的小程序组成。Linux 是由小程序组成的,每一个程序都非常小。体积非常小,目的非常单一。组合小程序,完成复杂任务。
- 一切皆文件。所有东西都保存为文件格式,甚至连设备的访问入口都保存为文件。
- 尽量避免捕获用户接口。尽量少跟用户进行交互。一般而言,用户启动一个进程之后,用户不需要再输入任何信息。
- 配置文件保存为纯文本格式。
GUI接口:双击
CLI接口:执行命令,给出执行文件的路径。
命令提示符:(给你一个提示符,在这个符号后面可以输入命令) prompt bash
两种不同的展现形式:
# :root 管理员
$ : 普通用户
Linux 跟 windows 不同,用户类别非常简单,就两类,管理员,普通用户。
命令:shell本身就是命令行接口,当我们输入命令以后,这个命令会被 shell 送给内核,由内核判 断这个命令是否具有执行权限,还包括从什么地方开始执行(任何程序要想执行必须得有执行 入口)。
命令格式: 通常由三部分组成。
命令 选项 参数
选项:
短选项: -
多个选项可以组合: -a -b = -ab
长选项: --
长选项不能组合,必须要分开来写。
参数: 命令的作用对象
用户的登录和切换:
su: switch user
exit: 退回原来的选项
# su [-l] 用户名 : [] 内表示可省略的
修改密码
# passwd
密码复杂性规则:
1. 数字,大写字母,小写字母,特殊字符,四种中选三种
2. 至少7位
3. 随机字符串
4. 定期更换
5. 循环周期要足够大: 尽量不要使用最近使用过的密码
Linux 哲学思想之一,能简写绝不全写。
Linux 严格区分大小写
虚拟终端(terminal):
在 VMware 中,ctrl + alt + F2 切换到另一个用户,ctrl + alt + F1 又回来了,
ctrl + alt + F3 又是一个新的用户。
startx & : 启动图形界面, ctrl + alt + F1 切换回去。
GUI:
Gnome: c 开发
KDE: C++
XFace: 嵌入式
CLI:
sh
bash
csh
zsh
ksh
tcsh