计算机结构
宏观来看,计算机是由硬件+软件构成.
硬件为整个计算机丰富功能提供物理支撑,软件直接面向用户提供服务.
计算机硬件组成及工作机制
计算机的硬件从结构上看大致可以分类CPU,内存,IO设备.这三个部分在内部通过总线进行信号(电信号)的交互.
各硬件模块之间彼此交互的是信号,而且是电信号,无论是CPU,内存还是IO设备,硬件实现上都是一些二极管,三极管和一些线性元器件的组合电路,这些小东西只认识电信号(电流或电压).现在大多数电子设备都是数字信号,计算机硬件同样如此,(模拟)电信号又被进一步处理成数字信号(模数转换或称为调制).
不难发现CPU Memory和IO设备组成的计算机,也只认识数字信号(电信号).显然,想要用计算机做点什么,通常需要给它提供一些数字信号,我们通常认为这些数字信号只有两种:开或关,抽象到数学表达上就是1或0.如果我们试图将
一些有意义的文件或者图片抽象成01的数字串,我们几乎完成了一次与计算机硬件的单向交互.进而若能收到对文件01串的回应,便完成了双向交互.
我们将向硬件发送数据的提供者称作是程序,将计算机根据程序的要求进行具体操作称为指令,用户传递和接收的01串称为数据.
数据+指令都由程序负责管理,到达电路中它们都是01串,计算机在内存中存储它们.
有趣的是,现代计算机所具有的一切诸如播放视频,玩网络游戏等功能都是在用户与底层硬件之间不停的往返发送01串而已.
最重要的软件---操作系统
尽管计算机工作起来看似十分简单,实际让它按人类的意志工作还需要有软件支持,保证01串的交互更人性化,更易于控制.
一台计算机上的软件成千上万,最关键的软件就是操作系统.操作系统在计算机硬件之上向用户提供可操作的接口.
操作系统有著名的Windows, Mac OS, GNU/Linux三大类.
Windows为计算机的普及做了不可小觑的贡献.
Mac OS刷新了广大中国人民对于美的认识.
GNU/Linux为中国互联网的发展做出了杰出的贡献,其用户仍在不断增长中.
GNU/LINUX操作系统
如果扔掉GNU只谈LINUX,指的是计算机内核(KERNEL).通常众谈论的Linux都是指内核.
那么一台计算机自上电启动后做了什么,能让用户看到桌面呢?
Linux是这么做的.计算机硬件上电后,进行上电自检(电信检查CPU,MEMORY,IO设备是否都正常),一切正常后将寄存器(在CPU内)中的一BIOS程序加载到内存中,BIOS启动后开始读MBR(512Bytes),目的是找到Bootloader程序并将其加载到内存中启动它,Bootloader启动以启动grub程序加载内核,grub负责在内存中注册文件系统,为所有IO设备在内存中注册等.自此Linux内核才正式启动,为了向用户提供操作接口,Linux会在加载成功后运行/sbin/init程序,以启动外壳程序.
这个过程如可以用图形表示如下:
外壳程序有两种:CLI(Command Line Interface)和GUI(Graphical User Interface).Linux系统中常用的两种外壳是:
- CLI:
- Bash
- csh
- zsh
- ksh
- tcsh #功能最强大的是zsh.
- GUI:
- Gnome
- KDE
Linux系统计算机如何工作
Linux这个超级程序(软件)在运行时分为用户空间和内核空间.两个空间彼此之间有严格的界限,用户空间的程序不能随意控制内核空间的资源.
内核空间的底层是计算机硬件,因此内核负责对硬件的管理,权限很大,可以直接操作硬件,大致包括文件系统管理,进程管理,内存管理,网络栈,时间片的调度�等.
用户空间在内核之上,用户的一切行为都发生在这一层.比如:敲击键盘,点击鼠标,观看视频,运行一段自己的小程序,向显示器打印一句hello world.通常这个打印语句会写成下面这样.
printf("hello world!\n");
或
System.out.println("Hello world!");
无论printf还是println都不是程序员自己写代码实现的功能,其实是内核向用户提供的API.在Linux下可以用命令查看所有的API.
有时内核提供的API无法满足用户的要求,仍然有和底层交互的需求,内核提供的系统调用的方式,以保护硬件系统.用户可以在shell中敲入命令查看Linux提供的所有系统调用.
于是我们发现在用户空间和内核空间的中间有一层非常薄的API和系统调用.
总结
终上所述,一台装有Linux内核的计算机结构应该可以抽象成下图.