• 计算机系统漫游


    前言

    • 计算机能运作,是基于硬件和软件来运行程序,系统会追着时间方式不断变化,但是内在的概念基本不会改变,所以单纯的学习新的工具,短期内收益增加会明显,但是长期来看,缺乏核心竞争力(-毕竟体力和精神力无法和年轻人相比),
      这样就会出现吃青春饭的现象,所以学习机器内在运行原理非常重要,因为这块儿东西,需要花费大量时间去学习和研究,是达到某个高点的必经之路.所以来学习这本教材

    1.1 信息就是 位 + 上下文

    程序的生命周期是从一个源程序(或者说源文件)开始的(比如我创建了一个hello.c的文件,并保存),这些文件本质上由值0 和 1 组成的位(又称 为比特)序列,8 个位被组织成一组,称为字节。每个字节表示程序中的某些文本字符,
    就想下图,一个字节对应一个数值,比如
     等于10,#号对应的是35,
    hello.c的表示方法说明一个基本思想,系统终所有的信息,例如你能看到的文件,磁盘上的文件,都是比特表示的, 区分不同对象的唯一方法是上下文,一不同的上下文表达不同的数据
    

    • c语言编译成二进制可运行流程

    练习

    vi hello.c
    
    #include <stdio.h> 2
    int main()
    {
     printf("hello, world
    ");
     :return 0;
    }
    
    [root@instance-bhrt87fn code]# gcc -o hello hello.c # 编译hello.c文件
    [root@instance-bhrt87fn code]# ls 
    hello  hello.c  # hello 是被创建的可执行的二进制文件
    [root@instance-bhrt87fn code]# ./hello
    hello,word!
    

    1.2 系统的硬件组成

    • 了解硬件组织有助于我们更深入了解运行hello 程序时发生了什么
    • Intel系统产品族的模型图

    总线

    • 贯穿整个系统的一组电子管道,它主要负责携带和传递信息,通常总线被设计成传送定长的字节块(字 word),4个字节(32位),8个字节(64位)

    I/O 设备

    • I / 0 (输 入 / 输 出 )设 备 是 系 统 与 外 部 世 界 的 联 系 通 道, 示 例 系 统 包 括 四 个 I / O 设 备 :作为用户输入的键盘和鼠标,作为用户输出的显示器,以及用于长期存储数据和程序 的磁盘驱动器(简单地说就是磁盘)。最开始,可执行程序h e l l o 就存放在磁盘上。
      每个I/O 设备都通过一个控制器或适配器与I/O 总线相连。控制器和适配器之间的区别主要在于它们的封装方式。控制器是I/O 设备本身或者系统的主印制电路板(通常称作 主板)上的芯片组。而适配器则是一块插在主板插槽上的卡。无论如何,它们的功能都是 在 I/O 总线和I/O 设备之间传递信息。

    主存(临时存在变量的地方)

    • 主存是一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。从 物理上来说,主存是由一组动态随机存取存储器(DRAM)芯片组成的。从逻辑上来说,存储 器是一个线性的字节数组,每个字节都有其唯一的地址(数组索引),这些地址是从零开始 的。一般来说,组成程序的每条机器指令都由不同数量的字节构成。与 C 程序变量相对应的 数据项的大小是根据类型变化的。比如,在运行Linux的 x86-64机器上,short类型的数据 需 要 2 个 字 节 ,i n t 和 f l o a t 类 型 需 要 4 个 字 节 ,而 l o n g 和 d o u b l e 类 型 需 要 8 个 字 节

    处理器

    • 中央处理单元(CPU), 简称处理器,是解释(或执行)存储在主存中指令的引擎。处理
      器的核心是一个大小为一个字的存储设备(或寄存器),称为程序计数器(PC)。在任何时 刻 ,P C 都指向主存中的某条机器语言指令(即含有该条指令的地址)
    • 从系统通电开始,直到系统断电,处理器一直在不断地执行程序计数器指向的指令, 再更新程序计数器,使其指向下一条指令。处理器看上去是按照一个非常简单的指令执行 模型来操作的,这个模型是由指令集架构决定的。在这个模型中,指令按照严格的顺序执 行 ,而执行一条指令包含执行一系列的步骤。处理器从程序计数器指向的内存处读取指 令,解释指令中的位,执行该指令指示的简单操作,然后更新P C ,使其指向下一条指令, 而这条指令并不一定和在内存中刚刚执行的指令相邻。
    • 这样的简单操作并不多,它们围绕着主存、寄存器文件(register file)和算术/逻辑单 元(ALU)进行。寄存器文件是一个小的存储设备,由一些单个字长的寄存器组成,每个 寄存器都有唯一的名字。A L U计算新的数据和地址值。下面是一些简单操作的例子, CPU在指令的要求下可能会执行这些操作。
    •加 载 :从主存复制一个字节或者一个字到寄存器,以覆盖寄存器原来的内容。
    •存 储 :从寄存器复制一个字节或者一个字到主存的某个位置,以覆盖这个位置上原
    来的内容。
    •操作:把两个寄存器的内容复制到ALU, ALU对这两个字做算术运算,并将结果
    存放到一个寄存器中,以覆盖该寄存器中原来的内容。
    •跳 转 :从指令本身中抽取一个字,并将这个字复制到程序计数器(P C )中,以覆盖
    P C 中原来的值。
    

    1.3 运行hello 程序的生命周期

    • 用户开始通过shell程序执行'./hello' 后,shell将字符串逐一写入寄存器,然后把它帮到内存中,一旦目标文件h e llo 中的代码和数据被加载到主存
    • 处理器就开始执行hello程序的main程序中的机器语言指令。这些指令将“hello world'n” 字符串中的字节从主存 复制到寄存器文件,再从寄存器文件中复制到显示设备,最终显示在屏幕上。

    c语言的小知识

         •C 语言是贝尔实验室的Dennis Ritchie于 1969年 〜 1973年间创建的。美国国家标准学
    会(American National Standards Institute, ANSI)在 1989 年颁布了 ANSI C 的标准,后来 C 语言的标准化成了国际标准化组织(International Standards Organization, ISO)的责任。这 些标准定义了 C 语言和一系列函数库,即所谓的C 标准库。Kernighan和 Ritchie在他们的 经典著作中描述了 ANSI C , 这本著作被人们满怀感情地称为“K&R” [61]o 用 Ritchie的话 来说[92], C 语 言 是 “古怪的、有缺陷的,但同时也是一个巨大的成功"。为什么会成功呢?
         •C 语言小而简单。C 语言的设计是由一个人而非一个协会掌控的,因此这是一个 简洁明了、没有什么冗赘的设计。K & R 这本书用大量的例子和练习描述了完整 的 C 语言及其标准库,而全书不过2 6 1页。C 语言的简单使它相对而言易于学 习,也易于移植到不同的计算机上。
         •C 语 言 是 为 实 践 目 的 设 计 的 。 C 语 言 是 设 计 用 来 实 现 U n i x 操 作 系 统 的 。 后 来 , 其他人发现能够用这门语言无障碍地编写他们想要的程序。
    C 语言是系统级编程的首选,同时它也非常适用于应用级程序的编写。然而,它也 并非适用于所有的程序员和所有的情况。C 语言的指针是造成程序员困惑和程序错误的 一个常见原因。同时,C 语言还缺乏对非常有用的抽象的显式支持,例如类、对象和异 常 。像 C + + 和 J a v a 这 样 针 对 应 用 级 程 序 的 新 程 序 语 言 解 决 了 这 些 问 题 。
        
    
    • 说明:所有知识来自<<深入理解计算机系统>>( csapp ) 这本书 和自己的总结,仅供学习和交流,侵权删除.
  • 相关阅读:
    UnknownHostException: xxx,使用nacos远程调用服务(负载均衡)报错
    Failed to bind properties under 'logging.level' to java.util.Map<java.lang.String, java.lang.String>日志级别的问题
    JS 如何返回到父页面?多重跳转之后返回到初始页(父页面)?或者说返回父页面的父页面?
    绝对路径${pageContext.request.contextPath}用法及其与web.xml中Servlet的url-pattern匹配过程
    VS在release模式下进行调试
    visual studio 运行找不到dll库
    C++ 字符串格式化
    SWIG使用遇到的问题
    其他技术---域名中转
    mongoDB增删改查(命令行操作数据库)
  • 原文地址:https://www.cnblogs.com/zdoubly/p/13549855.html
Copyright © 2020-2023  润新知