Linux环境编程导引
来源:互联网 发布:java 线程模型 编辑:程序博客网 时间:2024/04/29 22:52
计算机系统硬件组成
总线
贯穿整个系统的一组电子管道称为总线, 分为:
片内总线
系统总线
数据总线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控制器直接掌管总线。
操作系统
什么是操作系统
操作系统是”有效地管理计算机系统中的资源,合理地管理计算机系统的工作流程,方便用户使用”的程序的集合。
Linux内核模块
进程调度
内存管理
虚拟文件系统VFS
网络接口
进程间通信
操作系统管理硬件
两大职责:
防止硬件被失控的应用程序滥用
响应应用程序提供简单一致的机制来控制复杂而又通常大相径庭的低级硬件设备。
操作系统三个基本抽象
操作系统拥有三个基本抽象概念: 进程、虚拟存储器和文件。
文件是对I/O设备的抽象表示,虚拟存储器是对主存和磁盘I/O设备的抽象表示,进程则是对处理器、主存和I/O设备的抽象表示。
进程
进程是操作系统对正在运行的程序的一种抽象。一个系统可以运行多个进程,而每个进程好像在独占使用硬件。
进程上下文切换
系统调用 DMA控制器
虚拟存储器
虚拟存储器为每个进程提供了一个大的、一致的、私有的地址空间;
它将内存看成是存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在主存与磁盘中来回交换数据。
为每个进程提供一致的地址空间,简化了存储管理,保护每个进程的地址空间不被其他进程破坏。
进程虚地址空间
文件
文件是一系列的字节序列,它向应用程序提供了一个统一的视角,来看待系统中各式各样的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;
(1) errno 是记录系统的最后一次错误代码。代码是一个int型的值,在errno.h中定义
(2) perror(s) 用来将上一个函数发生错误的原因输出到标准设备(stderr)。参数 s 所指的字符串会先打印出,后面再加上错误原因字符串。
头文件 #include<stdio.h> #include<stdlib.h>
(3) strerror 通过标准错误的标号,获得错误的描述字符串 ,将单纯的错误标号转为字符串描述,方便用户查找错误。 头文件: #include <string.h>
//示例
#include <unistd.h>#include <errno.h>#include <stdio.h>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;}
转载:http://blog.csdn.net/zjf280441589/article/details/43875947#t1
视频教程:http://www.cppcourse.com/computer01.html
http://www.cppcourse.com/computer02.html
http://www.cppcourse.com/computer02.html
- Linux环境编程导引
- Linux环境编程导引
- Linux环境编程导引
- Linux开发程序导引
- 嵌入式Linux新手入门导引
- Linux开发系统导引
- Socket编程实践(2) --Socket编程导引
- Socket编程实践(2) --Socket编程导引
- Socket编程实践(2) --Socket编程导引
- 十四Linux编程环境
- linux C++编程环境
- linux C++编程环境
- linux C++编程环境
- Linux编程环境
- LINUX环境编程笔记
- Linux编程环境搭建
- Linux环境编程--进程
- Linux环境编程--多线程
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
- 解决:Unable to connect to repository https://dl-ssl.google.com/android/eclipse/site.xml
- 无限级CSS树形菜单 Ver2.0
- new与malloc的区别,以及内存分配浅析
- linux 题目 (三)
- Linux环境编程导引
- List<map<String,String>>根据选择的key去重
- BZOJ 3132: 上帝造题的七分钟【树状数组(二维区间加,区间查询
- Atitit.词法分析的原理 理论
- Java 七牛缓存刷新
- android—init.rc的读取
- cocos2d-JS 打包APK 无限加载资源、黑屏解决方案
- 大明A+B(第一周c题)大数相加
- 深度学习与人脸识别系列(4)__利用caffe训练深度学习模型