计算机系统硬件组成

总线

贯穿整个系统的一组电子管道称为总线, 分为:

片内总线

系统总线

数据总线DB

地址总线AB

控制总线CB

外部总线

I/O设备

I/O设备是系统与外界联系的通道

键盘鼠标是输入设备,显式器是输出设备,磁盘既是输入设备也是输出设备,输入输出是相对于内存来说的。

内存

内存是一个重要的部件,它是与CPU进行沟通的桥梁。它用来存放程序以及程序要处理的数据,磁盘中的程序要加载到内存才能运行。

处理器

中央处理器(CPU),简称处理器。

CPU主要有运算器、控制器、寄存器构成

取指: PC, IR

译码: 指令译码器, RISC, CISC

执行: ALU

写回: -> 内存

跳转: JMP

系统结构图

DMA传输

DMA (直接访问内存)传输将数据从一个地址空间复制到另外一个地址空间的一种技术。当 CPU 初始化这个传输动作时,传输动作本身是由 DMA 控制器 来实行和完成, 而CPU可以继续去完成其他的工作, CPU仅在传输动作的开始和结束的时候参与数据传输的控制。 典型的例子就是移动一个外存的区块到芯片内部的内存区。像是这样的操作并没有让处理器工作拖延,反而可以使CPU重新去处理其他的工作。在实现DMA传输时,是由DMA控制器直接掌管总线。

操作系统

什么是操作系统

操作系统是”有效地管理计算机系统中的资源,合理地管理计算机系统的工作流程,方便用户使用”的程序的集合。

操作系统三个基本抽象

操作系统拥有三个基本抽象概念: 进程、虚拟存储器和文件

文件是对I/O设备的抽象表示,虚拟存储器是对主存和磁盘I/O设备的抽象表示,进程则是对处理器、主存和I/O设备的抽象表示。

进程

进程是操作系统对正在运行的程序的一种抽象。一个系统可以运行多个进程,而每个进程好像在独占使用硬件。

进程上下文切换

虚拟存储器

虚拟存储器为每个进程提供了一个大的、一致的、私有的地址空间;

它将内存看成是存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在主存与磁盘中来回交换数据。

为每个进程提供一致的地址空间,简化了存储管理,保护每个进程的地址空间不被其他进程破坏。

进程虚地址空间

文件

文件是一系列的字节序列,它向应用程序提供了一个统一的视角,来看待系统中各式各样的I/O设备。

虚拟文件系统VFS

虚拟文件系统是内核实现的一种架构,为用户空间提供统一的文件操作接口,即文件系统调用。它在内核内部为不同的真实文件系统提供一致的抽象接口。

用户通过系统调用与内核中的虚拟文件系统交互,进而操作实际的文件系统和设备。

系统编程 VS. 应用编程

系统编程

在操作系统之上利用系统调用、C库进行对系统资源进行访问。编写如apache 、gcc、gdb 等的服务应用.

系统资源包括:处理器,输入输出,进程管理,内存,设备,定时器,进程间通信,网络

应用编程

在更高层次的编程接口或者库之上构建应用程序。如android程序(android sdk)、iphone程序(iphone sdk)、QT程序设计(QT)、MFC程序设计(MFC)等。

系统调用在系统中所处的位置

所有操作系统都提供多种服务的入口点,由此程序向系统核请求服务。这些入口点被称之为系统调用(system call),

C库

这里我们所说的C库(libc),指的是标准C定义的C函数的集合。如标准输入输出函数、字符串处理函数、动态存储分配函数、日期时间函数、数学函数等。

GNU发布的libc称为glibc.

系统调用与C库关系

系统调用与C库从形式上来看都C函数;

但C库函数有些是调用系统调用来实现的,比如说malloc、free调用brk,printf调用write系统调用,而有些函数不需要任何系统调用,比如abs(fabs)、strcpy、atoi等,因为它并不是必需要使用内核服务;

因此系统调用通常提供的是最小界面,而C库函数通常提供更复杂的功能。

内核如何处理系统调用

内核通过软中断的方式实现系统调用, 每个系统调用被赋予一个系统调用号, 在i386平台上,执行一个系统调用需要通过 INT 0x80 指令来完成, 从用户态切换到核心态.

寄存器eax存放系统调用号, 寄存器ebx、ecx、edx、esi、edi存储系统调用参数,对于超过5个参数的系统调用,用一个寄存器(如ebx)指向用户空间的某个缓存, 该缓存存储所有系统调用的参数(可以多于5个)。

错误处理

在系统编程中通常通过函数返回值来表示错误(一般-1代表函数执行出错),并通过特殊变量errno来描述。

errno这个全局变量在 errno.h 头文件中声明如下:extern int errno;

错误处理函数:perror, strerror;

//示例

int main()
{
    int ret = close(10);
    /*
        if (ret == -1)
        {
            perror("close error");
        }
    */
    if (ret == -1)
    {
        fprintf(stderr, "close error with message: %s, errno = %d\n",
                strerror(errno), errno);
    }

    return 0;
}

常见错误代码

E2BIG

参数列表太长

EACCESS

权限不足

EAGAIN

重试

EBADF

错误的文件描述符

EBUSY

设备或资源忙

ECHILD

无子进程

EDOM

数学参数不在函数域内

EEXIST

文件已存在

EFAULT

地址错误

EFBIG

文件太大

EINTR

系统调用被中断

//常见错误代码打印程序

int main()
{
    for (int i = 0; i < 140; ++i)
    {
        errno = i;
        cout << "errno " << i << ": " << strerror(errno) << endl;
    }
    return 0;
}

Linux环境编程导引的更多相关文章

  1. Linux环境编程相关的文章

    Linux环境编程相关的文章 好几年没有接触Linux环境下编程了,好多东西都有点生疏了.趁着现在有空打算把相关的一些技能重拾一下,顺手写一些相关的文章加深印象. 因为不是写书,也受到许多外部因素限制 ...

  2. Linux 环境编程:dirfd参数 有关解析

    背景 在Unix环境编程中,系统提供了很多以at结尾的函数,如openat.fstatat等,而这类函数通常有一个特点,就是形参列表中多了int dirfd 例如: int open(const ch ...

  3. Linux环境编程--waitpid与fork与execlp

    waitpid waitpid(等待子进程中断或结束) 表头文件 #include<sys/types.h> #include<sys/wait.h> 定义函数 pid_t w ...

  4. Linux环境编程进程间通信机制理解

    一.Linux系统调用主要函数 二.创建进程 1.创建子进程系统调用fork() 2.验证fork()创建子进程效果 3.系统调用fork()与挂起系统调用wait() 三.模拟进程管道通信 四.pi ...

  5. 笔记整理:计算CPU使用率 ----linux 环境编程 从应用到内核

    linux 提供time命令统计进程在用户态和内核态消耗的CPU时间: [root@localhost ~]# time sleep real 0m2.001s user 0m0.001s sys 0 ...

  6. 【Linux环境编程】获取网卡的实时网速

    在windows以下.我们能够看到360或者是qq安全卫士的"安全球".上面显示实时的网速情况.那么在linux里面怎样获取网卡的实时网速?事实上原理非常easy,读取须要获取网速 ...

  7. Linux环境编程之同步(二):条件变量

    相互排斥锁用于上锁,条件变量则用于等待.条件变量是类型为pthread_cond_t的变量.一般使用例如以下函数: #include <pthread.h> int pthread_con ...

  8. Linux环境编程之同步(四):Posix信号量

    信号量是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语.有三种类型:Posix有名信号量,使用Posix IPC名字标识.Posix基于内存的信号量,存放在共享内存区中:System ...

  9. Linux环境编程之同步(三):读写锁

    概述 相互排斥锁把试图进入我们称之为临界区的全部其它线程都堵塞住.该临界区通常涉及对由这些线程共享一个或多个数据的訪问或更新.读写锁在获取读写锁用于读某个数据和获取读写锁用于写直接作差别. 读写锁的分 ...

随机推荐

  1. 决策树之ID3、C4.5

    决策树是一种类似于流程图的树结构,其中,每个内部节点(非树叶节点)表示一个属性上的测试,每个分枝代表该测试的一个输出,而每个树叶节点(或终端节点存放一个类标号).树的最顶层节点是根节点.下图是一个典型 ...

  2. Spring中@Transactional事务回滚(含实例详细讲解,附源码)

    一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用.下面举个栗子:比如一个部门里面有很多成员,这两者分别保存在部门表和成员表里面,在删除 ...

  3. Udemy上免费的angualr2视频教程分享

    福利大分享 本文作者:苏生米沿 本文地址:http://blog.csdn.net/sushengmiyan/article/details/52592518 一晚上听了10几节课程,整体感觉很不错的 ...

  4. 《Non-Negative Matrix Factorization for Polyphonic Music Transcription》译文

    NMF(非负矩阵分解),由于其分解出的矩阵是非负的,在一些实际问题中具有非常好的解释,因此用途很广.在此,我给大家介绍一下NMF在多声部音乐中的应用.要翻译的论文是利用NMF转录多声部音乐的开山之作, ...

  5. MySQL命令行SQL脚本的导入导出小结(数据库的备份与还原)

    1.设置环境变量 要想在命令行下各处都能执行mysql命令,必须在系统变量Path中添加mysql的命令所在的目录.例如我安装的是集成PHP环境的mysql,在D盘xampps下,则我需要将" ...

  6. Programming In Scala笔记-第六章、函数式对象

    这一章主要是以定义和完善一个有理数类Rational为线索,分析和介绍有关类定义,构造函数,方法重写,变量定义和私有化,以及对操作符的定义等. 一.Rational类定义和构造函数 1.定义一个空类 ...

  7. Android6.0 init 深入分析

    之前写过一篇关于android5.0 init的介绍,这篇博客是介绍android6.0init,之前有的代码介绍不详细.而且分析 解析init.rc那块代码也没有结合init.rc介绍. 一. ma ...

  8. 快速了解 Robot Operating System(ROS) 机器人操作系统

     http://www.ros.org/ 关于ROS About ROS http://www.ros.org/about-ros/ 机器人操作系统(ROS)是用于编写机器人软件的灵活框架.目的在简化 ...

  9. (Java)微信之个人公众账号开发(二)——接收并处理用户消息(下)

    接下来,我们再讲一下图文消息: 如图: 大家可以先从开发者文档中了解一下图文消息的一些参数: 如上图,用户回复4时,ipastor返回了几条图文消息,上图中属于多图文消息,当然还有单图文消息,图文消息 ...

  10. Android必知必会-发布开源 Android 项目注意事项

    如果移动端访问不佳,请使用 –> Github版 1. 合理配置 .gitignore 文件 配置 .gitignore 可以排除一些非必要文件和保护保密信息,下面是在项目根目录下 .gitig ...