分类 读书笔记 下的文章

系统调用

  • 系统调用是受控的内核入口,借助于这一机制,进程可以请求内核以自己的名义去执行某些动作。
  • 以应用程序编程接口(API)的形式,内核提供有一系列服务供程序访问。
  • 关于系统调用需关注一下几点:

    • 系统调用将处理器从用户态切换到核心态,以便CPU访问受到保护的内核内存
    • 系统调用的组成是固定的,每个系统调用都由一个唯一的数字来标识
    • 每个系统调用可辅之以一套参数,对用户空间与内核空间之间传递的信息加以规范。
  • 从C语言编程的角度来看,调用C语言函数库的外壳函数等同于调用相应的系统调用服务例程。

- 阅读剩余部分 -

UNIX和C语言简史

  1. 1969年,在AT&T电话公司下辖的bell实验室中,Ken Thompson 开发出了首个UNIX实现。
  2. 1970年,AT&T的工程师们又在刚购进的Digital PDP-11 小型机上,以汇编语言重写了UNIX;未过多久,Dennis Ritchie设计并实现出了C编程语言。
  3. 到1973年,C语言步入了成熟期,人们使用这一新语言重写了UNIX内核。

- 阅读剩余部分 -

计算机:辅助人脑的好工具

计算机其实是:接收用户输入指令与数据,经过中央处理器的数据与逻辑单元运算处理后,以产生或存储成有用的信息。

计算机硬件的五大单元

  • 输入单元
  • 中央处理器

    • 控制单元
    • 算术逻辑单元
  • 输出单元
  • 内存

CPU的种类

  • 精简指令集
  • 复杂指令集

- 阅读剩余部分 -

翻译程序的第一步

在预处理之前,编译器必须对该程序进行一些翻译处理:

  1. 编译器把源代码中出现的字符映射到源字符集;
  2. 编译器定位每个反斜杠后面跟着换行符到实例,并删除它们(即把代码中本是一行但写了两行的语句转换成一行,常见于在一行字符串中插入反斜杠后跟着按下回车键形成的两行代码。即两个物理行转换成一个逻辑行,预处理表达式的长度必须是一个逻辑行);
  3. 编译器把文本划分成预处理记号序列、空白序列和注释序列(记号是由空格、制表符或换行符分割的项),这里需要注意的是,编译器将用一个空格字符替代每一条注释;
  4. 程序已经准备好进入预处理阶段,预处理器查找一行中以#号开始的预处理指令。

明示常量:#define

  • 预处理器指令从#开始运行,到后面的第一个换行符为止。也就是说,指令的长度仅限于一行。
  • 每行#define(逻辑行)都由3部分组成:

    1. 第1部分是#define指令本身;
    2. 第2部分是选定的缩写,也称为。有些宏代表值,这些宏被称为类对象宏
    3. 第3部分(指令行的其余部分)称为替换列表替换体
      define

- 阅读剩余部分 -