Unix/Linux kernel
文章平均质量分 60
「已注销」
程序员
展开
-
CPU
多道程序(Multiprogramming) : 在计算机发展的早期,CPU资源非常昂贵,如果一个CPU只能运行一个程序,那么当程序读写磁盘(当时可能是磁带)时,CPU就空闲下来了,这在当时简直是暴殄天物。于是人们很快编写了一个监控程序,当某个程序暂时无需使用CPU时,监控程序就把另外的正在等待CPU资源的程序启动,使得CPU能够充分地利用起来。这种被称为 多道程序(Multiprogr原创 2016-03-03 18:05:35 · 587 阅读 · 0 评论 -
设备驱动
操作系统作为硬件层的上层,它是对硬件的管理和抽象。对于操作系统上面的运行库和应用程序来说,它们希望看到的是一个统一的硬件访问模式。作为应用程序的开发者,我们不希望在开发应用程序的时候直接读写硬件端口、处理硬件中断等这些繁琐的事情。由于硬件之间千差万别,它们的操作方式和访问方式都有区别。比如我们希望在显示器上面画一条直线,对于程序员来说,最好的方式是不管计算机使用什么显卡、什么显示器,多少大原创 2016-03-03 18:06:02 · 517 阅读 · 0 评论 -
内存不够怎么办?
进程的总体目标是希望每个进程从逻辑上看都可以独占计算机的资源。OS的多任务功能使得CPU能够在多个进程之间很好地共享,从进程的角度看好像是它独占了CPU,而不用考虑其他进程分享CPU的事情。OS的I/O抽象模型也很好地实现了I/O设备的共享和抽象,那么唯一剩下的就是主存,也就是内存的分配问题了。在早期的计算机中,程序是直接运行在物理内存上的,也就是说,程序在运行时所访问的地址都是物理地原创 2016-03-03 18:06:38 · 980 阅读 · 0 评论 -
关于隔离
让我们回到程序的运行本质上来。用户程序在运行时不希望介入到这些复杂的存储器管理过程中,作为普通的程序,它需要的是一个简单的执行环境,有一个单一的地址空间、有自己的CPU,好像整个程序占有整个计算机而不用关心其他的程序(当然程序间通信的部分除外,因为这是程序主动要求跟其它程序通信和联系)。 所谓的地址空间是个比较抽象的概念,你可以把它想象成一个很大的数组,每个数组的元素是一个字节,而这原创 2016-03-03 18:07:11 · 530 阅读 · 0 评论 -
计算机系统(四)运行hello
1: 初始时,shell程序 执行它的指令,等待用户输入一个命令, 当在键盘上输入字符串 “./hello” 后, shell 程序将 字符逐一读入寄存器,再把它存储在 存储器中。2: 当键盘上输入回车,shell知道命令结束。然后shell执行一系列的指令 来load hello 执行文件(ELF),将hello目标文件中的代码和数据从 磁盘 copy主存,原创 2015-08-13 17:08:30 · 672 阅读 · 0 评论 -
计算机系统(八)虚拟存储器(虚拟内存地址空间)
虚拟存储器:是一个抽象概念,抽象内存地址。它为每个process提供了一个假象,即每个process都在独占的使用主存。 每个process 看到的是一致的存储器,称为虚拟地址空间。 linux/unix process的虚拟地址空间;地址空间的最上面的区域是位OS的内核代码和数据保留的,这对所有的process都是一样的。底部区域存放 用户process定义的代码和数据。原创 2015-08-13 17:15:43 · 1851 阅读 · 0 评论 -
AT&T汇编语法
在IA-32系统上,汇编代码本身必须是AT&T表示法给出。AT&T汇编语法总结为以下5条规则,就足够了。寄存器通过在名称前加百分号(%)前缀引用。example:为使用eax寄存器,汇编代码中将使用%eax。(如果在C中内联汇编的话,C代码必须指定两个百分号,才能在转给汇编器的输出中形成一个百分号)。源寄存器总是在目的寄存器之前指定。 example,在mov语句中,这原创 2016-02-24 15:35:38 · 2124 阅读 · 0 评论 -
七种寻址方式
(一)立即寻址操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数。这种寻址方式也就称为 立即数寻址方式.立即数寻址方式通常用于 通用寄存器或内存单元赋初值。立即数可以是8bit 16bit或 32bit,该数值紧跟在操作码之后。如果立即数为16bit 或32bit,那么它将按照“高高低低”的原则进行存储 。example:原创 2016-02-24 15:44:15 · 22136 阅读 · 2 评论 -
操作系统做什么?
操作系统的一个功能就是提供抽象的接口,另外一个主要功能是管理硬件资源。 计算机硬件的能力是有限的,比如一个CPU一秒钟能够执行的指令条数是1亿条或者是1GB的内存能够最多同时存储1GB的数据。 无论你是否使用它,资源总是那么多。当然我们不希望自己花钱买回来的 hardware成为摆设,充分挖掘硬件的能力,使得计算机运行得更有效率,在更短的时间内处理更多的任务,才是我们原创 2016-03-03 18:05:05 · 509 阅读 · 0 评论 -
linux内核链表分析
读开源项目发现不同的项目中几乎都有自己所特有的数据结构原创 2015-04-11 15:15:21 · 409 阅读 · 0 评论 -
计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决
系统软件这个概念其实比较模糊,传统意义上一半将用于管理计算机本身的软件称为系统软件,以区别普通的应用程序。系统软件可以分成两块, 一块是平台性的,比如操作系统内核、驱动程序、运行库和数以千计的系统工具;另外一块是用于程序开发的,比如 编译器,链接器,汇编器等开发工具和开发库。计算机系统软件体系结构采用一种层的结构,有人说过一句名言:“计算机科学领域的任何问题都可原创 2016-03-03 18:04:26 · 11363 阅读 · 3 评论 -
计算机系统(六)OS 管理 硬件
继续回到hello的实例。1: 当shell load 并perform hello程序时,以及hello程序输出自己的消息时,shell和hello 程序都没有直接的访问 键盘,显示器,磁盘或者 主存。取而代之的是,它们依靠操作系统提供的服务。2: 所以 我们可以把 操作系统 看做 是application 与 hardware 之间插入的一层 中间软件层;所有的 ap原创 2015-08-13 17:12:49 · 491 阅读 · 0 评论 -
计算机系统(二)程序被其他程序翻译成不同的格式 Compiler
gcc -E hello.c -o hello.i 预编译期间,替换宏 等操作gcc -S hello.c -o hello.s 编译期间 产生 汇编代码gcc -O hello.c -o hello.o 汇编期间 产生机器码 gcc -o hello hello.c 从源文件到目标文件的转化由编原创 2015-08-13 17:02:40 · 483 阅读 · 0 评论 -
Linux从程序到进程
计算机如何执行进程呢?这是计算机运行的核心问题。即使已经编写好程序,但程序是死的。只有活的进程才能产出。我们已经从Linux进程基础中了解了进程。现在我们看一下从程序到进程的漫漫征程。 一段程序下面是一个简单的C程序,假设该程序已经编译好,生成可执行文件vamei.exe。#include int glob=0;原创 2015-01-08 09:53:41 · 379 阅读 · 0 评论 -
Linux进程基础
计算机实际上可以做的事情实质上非常简单,比如计算两个数的和,再比如在内存中寻找到某个地址等等。这些最基础的计算机动作被称为指令(instruction)。所谓的程序(program),就是这样一系列指令的所构成的集合。通过程序,我们可以让计算机完成复杂的操作。程序大多数时候被存储为可执行的文件。这样一个可执行文件就像是一个菜谱,计算机可以按照菜谱作出可口的饭菜。那么,程序和进程(p原创 2015-01-08 09:37:53 · 357 阅读 · 0 评论 -
Linux文件管理相关命令
在了解了Linux文件管理背景知识之后, 我们可以学习一些命令来管理我们的文件。 文件操作相关有一些命令可以帮助我们"修剪"之前看到的文件树。$touch a.txt如果a.txt不存在,生成一个新的空文档a.txt。如果a.txt存在,那么只更改该文档的时间信息。(这个命令实际上用得并不广泛,但可以帮我们创建一个空文件来实验下面操作)$ls .原创 2015-01-08 09:36:11 · 436 阅读 · 0 评论 -
Linux进程间通信
我们在Linux信号基础中已经说明,信号可以看作一种粗糙的进程间通信(IPC, interprocess communication)的方式,用以向进程封闭的内存空间传递信息。为了让进程间传递更多的信息量,我们需要其他的进程间通信方式。这些进程间通信方式可以分为两种:管道(PIPE)机制。在Linux文本流中,我们提到可以使用管道将一个进程的输出和另一个进程的输入连接起来,从而利用文件原创 2015-01-08 10:19:45 · 537 阅读 · 0 评论 -
Linux信号基础
Linux进程基础一文中已经提到,Linux以进程为单位来执行程序。我们可以将计算机看作一个大楼,内核(kernel)是大楼的管理员,进程是大楼的房客。每个进程拥有一个独立的房间(属于进程的内存空间),而每个房间都是不允许该进程之外的人进入。这样,每个进程都只专注于自己干的事情,而不考虑其他进程,同时也不让别的进程看到自己的房间内部。这对于每个进程来说是一种保护机制。(想像一下几百个进程总是要干涉原创 2015-01-08 09:38:46 · 394 阅读 · 0 评论 -
Linux文件管理
对于计算机来说,所谓的数据就是0和1的序列。这样的一个序列可以存储在内存中,但内存中的数据会随着关机而消失。为了将数据长久保存,我们把数据存储在光盘或者硬盘中。根据我们的需要,我们通常会将数据分开保存到文件这样一个个的小单位中(所谓的小,是相对于所有的数据而言)。但如果数据只能组织为文件的话,而不能分类的话,文件还是会杂乱无章。每次我们搜索某一个文件,就要一个文件又一个文件地检查,太过麻烦。文件系原创 2015-01-08 09:32:08 · 391 阅读 · 0 评论 -
Linux文件系统的实现
Linux文件管理从用户的层面介绍了Linux管理文件的方式。Linux有一个树状结构来组织文件。树的顶端为根目录(/),节点为目录,而末端的叶子为包含数据的文件。当我们给出一个文件的完整路径时,我们从根目录出发,经过沿途各个目录,最终到达文件。我们可以对文件进行许多操作,比如打开和读写。在Linux文件管理相关命令中,我们看到许多对文件进行操作的命令。它们大都基于对文件的打开和读写操作。原创 2015-01-08 10:21:35 · 576 阅读 · 0 评论 -
Linux常用命令
下面是格式说明,你现在可以跳过,直到遇到疑问时再来查询。$ 命令行提示符粗体表示命令斜体表示参数 filename, file1, file2 都是文件名。有时文件名有后缀,比如file.zip command 命令名 dir 文件夹名 string 字符串 username 用户名 gro原创 2015-01-08 10:21:27 · 387 阅读 · 0 评论 -
Linux进程关系
Linux的进程相互之间有一定的关系。比如说,在Linux进程基础中,我们看到,每个进程都有父进程,而所有的进程以init进程为根,形成一个树状结构。我们在这里讲解进程组和会话,以便以更加丰富的方式了管理进程。 进程组 (process group)每个进程都会属于一个进程组(process group),每个进程组中可以包含多个进程。进程组会有一个进程组领导进程 (pro原创 2015-01-08 09:42:06 · 417 阅读 · 0 评论 -
Linux文本流
文本流文件用于数据的存储,相当于一个个存储数据的房子。我们之前说,所谓的数据是0或者1的序列,但严格来说,Linux以字节(byte)来作为数据的单位,也就是说这个序列每八位(bit)为一个单位(八位二进制对应的十进制范围为0到255)。使用ASCII编码,可以将这样一个字节转换成为字符。所以,在Linux中,我们所说的数据,完全可以用字符表达出来,也就是说文本(text)的形式。原创 2015-01-08 09:37:23 · 353 阅读 · 0 评论 -
Linux开机启动(bootstrap)
计算机开机是一个神秘的过程。我们只是按了开机键,就看到屏幕上的进度条或者一行行的输出,直到我们到达登录界面。然而,计算机开机又是个异常脆弱的过程,我们满心期望的登录界面可能并不会出现,而是一个命令行或者错误信息。了解计算机开机过程有助于我们修复开机可能出现的问题。 最初始阶段当我们打开计算机电源,计算机会自动从主板的BIOS(Basic Input/Output Syste原创 2015-01-08 09:30:25 · 322 阅读 · 0 评论 -
计算机系统(七) 操作系统之process /thread
像hello 这样的程序 在现代OS上运行时,OS会提供一种假象,就好像系统上只有这个程序在运行,看上去只有这个程序在使用CPU,主存,IO设备。 CPU看起来就像在不间断地一条接一条地执行程序中的指令,即该程序的代码与数据是 系统存储器中的唯一对象。这些假象是通过process的概念来实现的。 process 是OS对一个正在运行的程序的一种抽象, 在一原创 2015-08-13 17:14:35 · 2185 阅读 · 0 评论 -
计算机系统 (五)存储设备层次结构
高速缓存存储器: 作为暂时的集结区域,用来存放cpu近期可能会需要的信息, L1 的容量有 数万byte,访问速度几乎和寄存器文件一样快。 L2 的容量数十万 到数百万 byte,通过一条特殊的总线连接到cpu 时间开销:process访问L2 比访问L1 的时间要长5倍,但是仍然比访问主存的时间 快5-10倍,硬件角度:L原创 2015-08-13 17:10:55 · 1491 阅读 · 0 评论 -
计算机系统(一)信息就是(位+上下文)
#include int main(){ printf("hello world\n");}ASCII 字符构成的文件 统称为 文本文件 ;所有其他的文件都是 二进制文件#include <stdio原创 2015-08-13 16:59:56 · 883 阅读 · 0 评论 -
Linux用户与“最小权限”原则
Linux的用户在登录(login)之后,就带有一个用户身份(user ID, UID)和一个组身份(group ID, GID)。在Linux文件管理背景知识中,我们又看到,每个文件又有九位的权限说明,用来指明该文件允许哪些用户执行哪些操作(读、写或者执行)。(参考Linux文件管理背景知识) 一般来说,Linux的用户信息保存在/etc/passwd中,组信息保存在/e原创 2015-01-08 09:43:31 · 527 阅读 · 0 评论 -
Linux架构
我以下图为基础,说明Linux的架构(architecture)。(该图参考《Advanced Programming in Unix Environment》) 最内层是硬件,最外层是用户常用的应用,比如说firefox浏览器,evolution查看邮件,一个计算流体模型等等。硬件是物质基础,而应用提供服务。但在两者之间,还要经过一番周折。还记得Lin原创 2015-01-08 09:37:52 · 379 阅读 · 0 评论 -
Linux命令行与命令
Linux的命令是很重要的工具,也往往是初学者最大的瓶颈。有朋友用了很长时间的Linux图形界面,基本不使用命令行输入命令执行,所以装的Linux最终成了摆设。这里总结一些命令行下常使用的命令,希望能有用。 什么是命令我们通常所说的Linux命令行是运行在终端(terminal)的shell (阅读Linux架构以了解什么是shell以及它在Linux系统中的位置)所谓的命令,原创 2015-01-08 09:35:51 · 386 阅读 · 0 评论