最近业余有点空闲时间,入手了一台树莓派3B+,想业余时间架点服务,另外尝试一下连接一些外设玩玩。第一次玩,很多不清楚的,所以边玩边写下来。

 

一 硬件

 

目前最新的树莓派版本是3B+,今年3月发布,上一代是16年发布的。主要区别在于CPU 频率提升到了1.4G, 网卡升级到了1000M,支持5GWIFI, 蓝牙升级到4.2。

其他树莓派型号如下:

继续阅读

1+

我们在浏览器访问一个网页时,一般输入一个网页的地址,比如: www.baidu.com,然后就可以和远程服务器建立HTTP连接传输数据。但是对于网络层来说,它只认识IP地址,并不认识网页地址。所以他们之间有一个转换的过程。这个转换过程是DNS服务完成的。

 

域名

 

网域名称英语:Domain Name),简称域名网域,是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

IP地址Internet主机的作为路由寻址用的数字体标识,人不容易记忆。因而产生了域名这一种字符型标识。

域名是有分级的,顶级域名主要按照组织(com, org, net)和地区(us, cn, hk ,cc)划分。比如我注册的021xt.cc这个域名,.cc是一个地区顶级域名,021xt.cc是顶级域名下的一个二级域名。 而www.021xt.cc, blog.021xt.cc 这些都是三级域名,而xxx.blog.021xt.cc是四级域名,依次类推。

 

DNS

 

网域名称系统英文Domain Name System,缩写DNS)是互联网的一项服务。它作为将域名IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCPUDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符

继续阅读

0

一 VPS是啥

 

虚拟专用服务器英语:Virtual private server,缩写为 VPS),是指通过虚拟化技术在独立服务器中运行的专用服务器。每个使用VPS技术的虚拟独立服务器拥有各自独立的公网IP地址、操作系统、硬盘空间、内存空间、CPU资源等,还可以进行安装程序、重启服务器等操作,与运行一台独立服务器基本相同。

这是维基百科上的解释。其实和我们自己在电脑上装虚拟机是一样的,只不过VPS有独立的公网IP。多个VPS之间系统是隔离的,但是硬件不是隔离的。 比如Host Server是8核CPU+16G内存,如果安装了8个VPS,那么每个分配1核CPU+2G内存。用过虚拟机的就明白的,不用多解释。

VPS系统主要是xUNIX系统,这样不需要图形界面,远程SSH上去操作。目前也有Windows的VPS,主要就是图形化的远程登录操作。VPS就好比是自己电脑,自由度很大。

 

虚拟主机?云主机?

 

虚拟主机英语:Virtual Host)(英语:Shared Web Hosting),又称虚拟服务器主机空间或是网页空间,是一种网络技术,可以让多个主机名称(host name),在一个单一服务器(或是一个服务器组)上运作,而且可以分开支持每个单一的主机名称。

虚拟主机是以前用的比较多的,主要用来架设个人网站,搭建FTP服务器等。利用Apache和IIS 就很容易搭建虚拟主机。以前主要使用FTP等方式进行远程操作。相对于VPS自由度比较小。而云服务可以说是VPS加上云的概念,是在一组集群主机上划分出的多个VPS集群。

所以个人用而言,使用VPS是最好的选择。一般使用xUNIX系统,无论是科学上网、建站、搭建云盘等等都不在话下。

继续阅读

0

 

前言

 

前一篇我们介绍了内存管理中的分页试内存管理,分页的主要作用就是使得每个进程有一个独立的,完整的内存空间,通过虚拟内存技术,使得程序可以在较小的内存上运行,而进程之间内存空间相互独立,提高了安全性。这一篇将主要介绍内存管理中分段管理,以及两种的结合,也是目前计算机普遍采用的段页式内存管理。这也直接决定了的后面程序的编译,加载以及允许时的内存布局。

 

 

 

1. 内存分段

 

 

1.1 为什么分段?

 

 

在x86-16体系中,为了解决16位寄存器对20位地址线的寻址问题,引入了分段式内存管理。而CPU则使用CS,DS,ES,SS等寄存器来保存程序的段首地址。当CPU执行指令需要访问内存时,只会送出段内的偏移地址,而通过指令的类型类确定访问那一个段寄存器。具体可以参考:计算机原理学习(5)– x86-16 CPU和内存管理

 

到了IA-32,Intel引入了保护模式,所以在IA-32中为了保持兼容性,所以同样支持内存分段管理。另外我们讨论过了内存分页,页面中包含了程序的代码,数据等信息,它们都有各自的地址。这些地址是在编译的时候就确定的,因为每个进程都有独立完整的内存空间,只需要把页和物理页映射就能运行,所以这个地址是可以在编译时就决定的。在编译时,编译器会等程序进行语法词法等分析,在编译过程中会建立许多的表,来确定代码和变量的虚拟地址:

  • 被保存起来供打印清单的源程序正文;
  • 符号表,包含变量的名字和属性;
  • 包含所有用到的整形和浮点型数据的表;
  • 语法分析树,包括程序语法分析的结果;
  • 编译器内部过程调用的堆栈。

前面4张表会随着编译的进行不断增大,而堆栈的数据也会变化,现在的问题就是,每一张表的大小都不确定,那么如何指定每一张表在虚拟内存空间的地址呢?

继续阅读

0

前言

 

 

上一篇我们了解了x86-16 CPU计算机的内存访问方式,寻址方式,以及基于MS-DOS的应用程序的内存布局。这一篇会主要介绍32位处理器的内存访问,内存管理以及应用程序的内存布局。虽然目前64位CPU已经非常普及了,不过相对于32位的内存管理方式并没有大的变化,而32位相对于16位却有了极大的改变。

 

 

1.  IA-32 CPU

 

1985年10月。Intel推出了80386 CPU 用来取代之前x86-16位的架构,一直到现在差不多块20年的时间里,虽然处理的速度,制造工艺都在不断提升,但x86-32的架构都没有大的改变。一般我们说的IA-32, I386和x86-32是一个意思。

从80386开始,地址线变为了32位,和CPU寄存器以及运算单元位数一样,最大寻址范围增加到4G。所以在也不会出现16位CPU时访问内存出现的问题。另外80386处理器都可以支持虚拟存储器,支持实模式,保护模式和虚拟8086模式,支持多任务。 而之后的CPU,主要的改进就在于:

  1. CPU内部集成DMA,计数器,定时器等;
  2. 制造工艺的提示,更多的晶体管,更快的速度
  3. 加入更多的指令集,如MMX,SSE,SSE2等
  4. 集成L1,L2,L3高速缓存,减少外部总线的访问
  5. 超线程,多核心提高CPU效率

但是在内存管理访问,却没有太大的变化,所以我们后面介绍的内容基本上可以试用所有的x86-32 CPU而不用特意去区分那个型号的CPU。

继续阅读

0

 

前言

 

 

前面我们已经了解了计算机硬件的工作原理,以及操作系统的发展。我们知道是内存把计算机硬件和软件联系了起来。不夸张的说,了解了软件在内存中的结构,就基本了解了程序最底层的运行原理。所以从这一篇开始,将深入的讨论计算机中内存管理和布局。内存的管理同计算机硬件以及擦做系统是分不开的。这一篇我们主要讨论早期x86 CPU和DOS系统对于内存的管理。

 

 

1. 8086 CPU

 

说到CPU,我们第一个想到的应该就是Intel。 1971年11月15号,Intel发布了全球第一款微处理器Intel 4004,这是一个主频只有108KHz的4bit处理器。而后又发布了8bit的8008处理器。而我们最熟悉的应该就是8086,为什么?因为随便找一本汇编的书籍看看,都会有8086四个大字。因为8086标志着Intel x86体系结构的CPU的开始。而且8086/8088开始用于便携电脑,所以我们就从8086开始介绍。80186除8086内核,另外包括了中断控制器、定时器、DMA、I/O、UART、片选电路等外设。

 

 

1.1 8086/8088内存访问

 

8086是x86体系结构的开始,他采用了16bit,但是地址线却用了20位。前面介绍CPU工作原理的时候哦我们知道,CPU内部有一个PC计数器,用来存储下一个要执行的物理地址。但是16位的寄存器如何存储20位的地址呢?

继续阅读

0

 

前言

 

 

前面的文章主要都是计算机硬件相关的一些工作原理。而前一篇文章介绍了内存的工作原理,编址方式,逐步过渡到软件上面来了。前面也说过,内存是一个非常重要的部件,因为CPU所需的指令和数据都在内存中。所以从这一篇开始我们主要看看程序运行时在内存中的布局。

 

我们知道对于计算机系统来说,最底层的是硬件,硬件之上是操作系统,而我们的程序都是基于操作系统来运行的,而不是基于硬件,这样操作系统为我们提供了一层抽象,所以对于程序员来说,不需要特别的关注计算机硬件。所以正常来说介绍完硬件后,应该来介绍操作系统。但是我们知道在计算机在不断的发展,硬件,操作系统都在不断发展。而无论怎么发展,程序运行都离不开内存,所以我决定以内存和出发点,来看硬件,操作系统以及应用程序的发展过程。

 

 

 

1. 操作系统和内存布局

在第一代计算机时期,构成计算机的主要元器件是电子管,计算机运行速度慢(只有几千次/秒),当时没有操作系统,甚至没有任何软件。程序员首先编写程序,然后直接在计算机的控制台上操纵程序运行。

 

 

1.1 人工操作方式

 

当时的计算机有一个控制面板,上面有一些开关,当要启动计算机的使用,就是要把启动程序用手工输入到机器里去,其方法就是利用机柜面板上的一排开关,用二进制代码把指令一条一条拨进去。但是指令有限,干不了太多事情。

 

所以当时程序员使用机器码编写程序,然后通过打孔机,将程序转换到打孔的纸袋上。纸袋每排有八个孔的位置,穿了孔的代表1,没穿孔的代表0。然后通过纸带机等设备手工将程序装入计算机的内存,按动控制台开关和按扭确定程序的起始地址并启动程序执行。程序员只能通过控制台上的显示灯来观察程序执行情况。当程序运行出错时,程序员直接通过控制台开关来停止程序运行,检查内存及寄存器内容并调试程序。程序运行结果可以通过打印机或穿孔机输出。

 

上图就是纸袋和纸袋读入机器。但是存储程序的介质是纸袋,而加载程序是通过纸带机。其实这里我也有个疑问:

  1. 纸带机是如何把纸袋上的程序加载到内存的呢?
  2. 程序被加载到内存的地址是如何确定的呢?

继续阅读

0

 

前言

 

 

前面两篇文章介绍了计算机硬件是如何工作的。而从这一章开始将逐渐的转到软件上面来。我们还有内存这一个很重要的部分没有介绍。这一章不仅仅介绍内存的工作原理,还会介绍内存的编址、内存数据存放。逐渐从硬件过渡到软件上来。为后面介绍程序运行打下基础。

 

 

 

1. 内存工作原理

 

 

CPU和内存是计算机中最重要的两个组件,前面已经知道了CPU是如何工作的,上一篇也介绍了内存采用的DRAM的存储原理。CPU工作需要知道指令或数据的内存地址,那么这样一个地址是如何和内存这样一个硬件联系起来的呢?现在就看看内存到的是怎么工作的。

 

 

1.1 DRAM芯片结构

上图是DRAM芯片一个单元的结构图。一个单元被分为了N个超单元(可以叫做cell),每个单元由M个DRAM单元组成。我们知道一个DRAM单元可以存放1bit数据, 所以描述一个DRAM芯片可以存储N*M位数据。上图就是一个有16个超单元,每个单元8位的存储模块,我们可以称为16*8bit 的DRAM芯片。而超单元(2,1)我们可以通过如矩阵的方式访问,比如 data = DRAM[2.1] 。这样每个超单元都能有唯一的地址,这也是内存地址的基础。

 

每个超单元的信息通过地址线和数据线传输查找和传输数据。如上图有2根地址线和8根数据线连接到存储控制器(注意这里的存储控制器和前面讲的北桥的内存控制器不是一回事),存储控制器电路一次可以传送M位数据到DRAM芯片或从DRAM传出M位数据。为了读取或写入【i,j】超单元的数据,存储控制器需要通过地址线传入行地址i 和列地址j。这里我们把行地址称为RAS(Row Access Strobe)请求, 列地址称为(Column Access Strobe)请求。

 继续阅读

0

 

前言

 

 

前一篇文章介绍了冯诺依曼体系结构的计算机的基本工作原理,其中主要介绍了CPU的结构和工作原理。这一篇主要来介绍存储区,总线,以及IO设备等其他几大组件,来了解整个计算机是如何工作的。 这些东西都是看得见摸得着的硬件,平时我们买电脑时最关注的就是CPU的速度,内存的大小,主板芯片等等的参数。

 

 

 

1. 存储器

 

前面我们以一个简单通用的计算机模型来介绍了CPU的工作方式,CPU执行指令,而存储器为CPU提供指令和数据。 在这个简单的模型中,存储器是一个线性的字节数组。CPU可以在一个常数的时间内访问每个存储器的位置,虽然这个模型是有效的,但是并不能完全反应现代计算机实际的工作方式。

 

 

1.1 存储器系统层次结构

 

在前面介绍中,我们一直把存储器等同于了内存,但是实际上在现代计算机中,存储器系统是一个具有不同容量,不同访问速度的存储设备的层次结构。整个存储器系统中包括了寄存器、Cache、内部存储器、外部存储。下图展示了一个计算机存储系统的层次图。层次越高速度越快,但是价格越高,而层次越低,速度越慢,价格越低。

 

相对于CPU来说,存储器的速度是相对比较慢的。无论CPU如何发展,速度多块,对于计算机来说CPU总是一个稀缺的资源,所以我们应该最大程度的去利用CPU。其面我们提到过CPU周期,一个CPU周期是取1条指令的最短的时间。由此可见,CPU周期在很大程度上决定了计算机的整体性能。你想想如果当CPU去取一条指令需要2s,而执行一个指令只需要2ms,对于计算机来说性能是多么大的损失。所以存储器的速度对于计算机的速度影响是很大的。

 

对于我们来说,总是希望存储器的速度能和CPU一样或尽量的块,这样一个CPU周期需要的时钟周期就越少。但是现实是,这样的计算机可能相当的昂贵。所以在计算机的存储系统中,采用了一种分层的结构。速度越快的存储器容量越小,这样就能做到在性能和价格之间的一个很好的平衡。

 

继续阅读

0

 

前言

 

 

对于我们80后来说,最早接触计算机应该是在95年左右,那个时候最流行的一个词语是多媒体。 依旧记得当时在同学家看同学输入几个DOS命令就成功的打开了一个游戏,当时实在是佩服的五体投地。因为对我来说,屏幕上的东西简直就是天书。有了计算机我们生活发生了巨大的变化,打游戏,上网,聊天,甚至到现在以此为业。有时无不感叹计算机的强大。

人类总是聪明的而又懒惰的。即便是1+1这种简单的计算都不想自己做,1623年Wilhelm Schickard 制作了一个能进行六位以内数加减法,并能通过铃声输出答案的”计算钟”。通过转动齿轮来进行操作。 这已经相当高端了,说起计算器,我们5000年文明古国在东汉末年就有记载了算盘。

计算机的发展也是随着科技的发展经历了机械计算机、电子计算机、晶体管计算机、小规模集成电路和超大规模集成电路计算机。我们无意讨论整个计算机的发展过程,主要还是介绍基于冯诺依曼体系结构的现代计算机。

 

 

1. 计算机的发展

 

 

计算机的发展包括了硬件和软件的发展,硬件的发展为计算机提供了更快的处理速度,而软件的发展为用户提供了更好的体验。两者相辅相成,密不可分。

  • 第一阶段: 60年代中期以前,是计算机系统发展的早期时代。在这个时期通用硬件已经相当普遍,软件却是为每个具体应用而专门编写的,大多数人认为软件开发是无需预先计划的事情。这时的软件实际上就是规模较小的程序,程序的编写者和使用者往往是同一个(或同一组)人;
  • 第二阶段:从60年代中期到70年代中期,是计算机系统发展的第二代。在这10年中计算机技术有了很大进步。多道程序、多用户系统引入了人机交互的新概念,开创了计算机应用的新境界,使硬件和软件的配合上了一个新的层次;
  • 第三阶段:计算机系统发展的第三代从20世纪70年代中期开始,并且跨越了整整10年。在这10年中计算机技术又有了很大进步。分布式系统极大地增加亍计算机系统的复杂性,局域网、广域网、宽带数字通信以及对“即时”数据访问需求的增加,都对软件开发者提出了更高的要求;
  • 第四阶段:在计算机系统发展的第四代已经不再看重单台计算机和程序,人们感受到的是硬件和软件的综合效果。由复杂操作系统控制的强大的桌面机及局域网和广域网,与先进的应用软件相配合,已经成为当前的主流。计算机体系结构已迅速地从集中的主机环境转变成分布的客户机/服务器。

 

 

继续阅读

0