【Linux】Linux 计算机基础

现代计算机设备的组成部分:运算器、控制器、存储器、输入设备、输出设备

CPU
bus:总线
memory: 编址存储设备
read ahead 高速缓存

IO: 与外部部件交互
    磁盘 网卡

虚拟机:虚拟计算机

CPU:运算器、控制器
CPU指令,指令集;
特权指令:OS运行特权指令;
普通指令:
程序员:

OS: Operating System
软件程序
通用目的
硬件驱动
进程管理
内存管理
网络管理
安全管理

System Call 系统调用

编程层次:
    硬件规格:hardware specifiacation
    系统调用:
    库调用:  library call

UI: user interface 用户接口
GUI: Graphic User Interface 图形用户接口
CLI: Command Line Interface 命令行接口

ABI: Application Binary Interface 应用二进制接口
API:Application Programming Interface 用用程序接口

CPU架构类型:
x86
x64
arm

m68000, m68k
power
powerpc
ultrasparc
alpha
安腾

Windows
Linux:
Linus –> Linux

GNU/Linux

Unix:
System (Bell Lab)
AIX (IBM)
Solaris (SUN)
HP-UX (HP)
BSD: (BSRG)Berkeley System Distribution 伯克利软件套件
NetBSD
OpenBSD
FreeBSD

MIT:Richard Stallman
GNU: GNU is Not Unix;
GPL:General Public License
CPU, memory, I/O

程序运行模式:
用户空间:user space, us
内核空间:system space

POS: Portable Operating System 可移植操作系统
POSIX

API: 编程接口;

运行程序格式:
Windows: EXE, dll(dynamic link library 动态链接库文件)
Linux: ELF, so(shared object 共享对象)

程序:指令+数据
    指令:只读
    数据:读写

程序:算法+数据结构

库调用,系统调用:允许被调用的程序;

malloc(), free()

编程语言:
    汇编语言:微码编程
        系统中某些与硬件相关的特有代码、驱动程序开发;
    高级语言C, C++:
        系统级应用、驱动程序
    高级应用java, python, php:
        应用程序

    unix-like

LSB: Linux Standard Base Linux标准库

程序包管理器:
rpm:
RHEL, Fedora, S.u.S.E, CentOS
dpt:
Debian, Ubuntu

自由软件:
自由使用;自由学习和修改;自由分发;自由创建衍生版;

Linux的哲学思想:
1、一切皆文件;
把几乎所有资源,包括硬件设备都组织为文件格式;
2、由众多单一目的小程序组成;一个程序只实现一个功能,而且要做好;
组合小程序完成复杂任务;
3、尽量避免跟用户交互;
目标:实现脚本编程,以自动完成某些功能;
4、使用纯文本文件保存配置信息;
目标:一款使用的文本编程器即能完成系统配置工作;

如何获取CentOS的发行版:
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com

登录:
root/mageedu

# startx &

终端:
用户与主机交互,必然用到的设备;

物理终端:直接接入本机的显示器和键盘设备;/dev/console

虚拟终端:附加在物理终端之上的以软件方式虚拟实现的终端,CentOS 6默认启动6个虚拟终端
    Ctrl+Alt+F#: [1,6]
    图形终端:附加在物理终端之上的以软件方式虚拟实现的终端,但额外会提供桌面环境;

    设备文件路径:/dev/tty#
模拟终端:
    图形界面下打开的命令行接口,基于ssh协议或telnet协议等远程打开的界面

    设备文件:/dev/pts/#    [0,oo)

查看当前的终端设备:tty

交互式接口:启动终端后,在终端设备附加一个交互式应用程序
GUI:
X protocol, window manager, desktop

    Desktop:
        GNOME (C, gtk)
        KDE   (C++, qt)
        XFCE  (轻量级桌面)
CLI:
    shell程序:
        sh (bourn)
        csh 
        tcsh
        ksh (korn)
        bash (bourn again shell), GPL
        zsh 

    显示当前使用的shell:
        # echo ${SHELL}

    显示当前系统使用的所有shell:
        # cat /etc/shells

    命令提示符:prompt
        [root@localhost ~]#
            [root@localhost ~]:PS1
            prompt:
                管理员:#
                普通用户:$

硬件系统主要有五大部分组成:运算器、控制器、存储器、输入设备、输出设备
运算器:负责算术与逻辑运算。与控制器共同组成了中央处理器
控制器:负责发送和接收指令
存储器:用来存储正在进行程序、将要进行程序的数据及刚处理完的数据
输入设备:用来进行输入的设备
输出设备:用来进行输出的设备

硬件是基础,硬件需要通过系统软件控制来启动硬件,并让各个硬件之间相互协同工作,在系统软件的基础上是用户,用户操控的是系统软件,并在系统软件的基础上安装相应的应用软件,来完成用户所需要的工作,所以说最底层的是硬件,硬件上一层是系统软件,系统软件上一层是应用软件,而最上层的则是用户

计算机的工作原理
算机的工作过程,就是执行程序的过程。怎样组织存储程序,涉及到计算机体系结构问题。
现在的计算机都是基于“程序存储”概念设计末造出来的。
了解了“程序存储”,再去理解计算机工作过程变得十分容易。如果想让计算机工作,就得先把程序编出来,然后通过输入设备送到存储器保存起来,即程序存储。
根据冯·诺依的设计,计算机应能自动执行程序,而执行程序又归结为逐条执行指令。执行。执行一条指令可分为以下4个基本操作

  1. 取出指令:从存储器某个地址中取出要执行的指令送到CPU内部的指令寄存器暂存。
  2. 分析指令:把保存在指令寄存器中的指令送到指令译码器,译出该指令对应的微操作。
  3. 执行指令:根据指令译码,向各个部件发岀相应控制信号,完成指令規定的各种操作
  4. 为执行下一条指令作好准备,即取出下一条指令地址

计算机使用二进制的原因
技术实现简单
简化运算规则
适合逻辑运算
易于进行转换
抗干扰能力强

机器数和真值

一个数在计算机中的二进制表示形式,叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号,正数为0,负数为1
因为第一位是符号位,所以机器数的形式值就一等于真正的数值,将带符号位的机器数对应的真正数值称为机器数的真值(10000011的真值是-3,而不是131)

但是机器不是这么区分一个数的正负的,人可以直接看到第一位是1还是0来区分,机器如果直接判断会增加电路的复杂程度,所以人们就将符号位也参与运算,这样根据1-1=1+(-1),只保留加法,于是有了原码、反码和补码

原码:符号位加上真值的绝对值,即用第一位表示符号,其余位表示值
-1 >> 1000 0001
1 >> 0000 0001
[-127,127]

反码:
正数的补码是基本身
负数和补码是在其原码的基础上,符号位不变,其余各个位数取反
1 >> 0000 0001
-1 >> 1111 1110

补码:
正数的补码是基本身
负数的补码是在其原码的基础上,符号位不变,其余各个位数取反,最后加1(即反码+1)
1 >> 0000 0001
-1 >> 1111 1111

在计算机系统中,数值一律使用补码来表示、存储
因为这样减法可按加法来处理,0000 0001 + 1111 1111 = 0000 0000 ,进位舍去
其实可以这样推导:
为了实现一个正数i加上一个数等于0 ,所以用0-i,比如i等于0000 0001,那么0-i就是1111 1111, 我们知道0-1=-1, 所以 -1的补码就是1111 1111 ,以此类推,一个负数的补码就是0-对应正数的补码。

二进制

十进制 二进制
基本数字 10个,0-9 2个,0、1
进位规则 十进一 二进一

111001:2^5+2^4+2^3+2^0=57

二进制:计算机内部用二进制,运算简单,简化了计算机结构
八进制:标志的开头用0表示,用0-7的数字表示
十六进制:标志的开头用0x表示,用0-9、A、B、C、D、E、F表示

运算符

运算符 运算 示例
& 与运算 6 & 3 = 2
` ` 或运算 `6 3 =7`
^ 异或运算 6 ^ 3 = 5
~ 反码 ~6 = -7
<< 左移 3<<2 = 12
>> 右移 3>>1 = 1
>>> 无符号右移 3>>>1 = 1

按位与&
两位全为1,结果才为1
按位与&的特殊用法:

  1. 清零,如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都是零的数值相与,结果为零。10101110 & 00000000 = 00000000
  2. 取一个数中指定位:找一个数,对应x要取的位,该数的对应位为1,其余位为零,此数与x进行“与运算”可以得到x中的指定位。10101110 & 00001111 = 00001110 取后四位

按位或|
只要有一个为1,结果就为1
按位或|特殊用法:
常用来对一个数据的某些位设置为1:找到一个数,对应x要设置1的位,该数的对应位为1,其余位为零。此数与x相或可使x中的某些位置1。10100000 | 00001111 = 10101111 后四位置一

异或^特殊用法:
两位值不同则该位结果为1,否则为0

  1. 使特定位翻转:特定位异或1。10101110 ^ 00001111 = 10100001 后四位翻转
  2. 与0相异或,保留原值。10101110 ^ 00000000 = 10101110
  3. 两个变量交换值
    1. 借助第三个变量来实现 C=A;A=B;B=C;
    2. 利用加减法实现两个变量的交换 A=A+B;B=A-B;A=A-B
    3. 异或运算,一个数异或本身等于0和异或运算符合交换律 A=A^B;B=A^B;A=A^B

取反与运算~
对一个二进制数按位取反,即将0变为1,1变0

左移<<
将一个运算对象的各二进制位全部左移若干位,左边的二进制位丢弃,右边补0

右移>>
将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。操作数每右移一位,相当于该数除以2

无符号右移运算>>>
各个位向右移指定的位数。右移后左边空出的位用零来填充。移除右边的位被丢弃。

负数以其正数的补码形式表示
反码加1称为补码
32位整数,最高位为1,就是负数
负数 左移或者右移