Linux内核设计的艺术
文章平均质量分 78
BruceZhang
计算机专业的一个小学生
展开
-
搭建Linux0.11系统环境
学习Linux0.11内核源代码,我们需要搭建一个基于Linux0.11的操作平台: 1) boch仿真器:可以从http://bochs.sourceforge.net/中下载到。(最好是下载Bochs-2.4的版本,我Bochs的最新版本时出现了一点小问题)我这里也提供一个: 2) Linux跟文件系统: Linux0.11的内核只支持M转载 2013-06-13 20:08:24 · 3486 阅读 · 0 评论 -
Linux的mount命令简介
在Linux系统中,如果要使用硬盘、光盘、软盘或MO盘等存储设备,必须先进行挂装(Mount)。当存储设备挂装完成之后,就可以将其作为一个目录来进行访问了。挂装设备需要使用mount命令。执行这一命令,至少要先确定下列三种信息: 1. 要挂装(Mount)对象的文件系统类型; 2. 要挂装(Mount)对象的设备名称(/dev/...); 3. 要将设备挂装(Mount)到哪一目录。 一、转载 2013-07-12 21:08:18 · 2842 阅读 · 0 评论 -
深入解析Linux中的fork函数
1、定义#include #includepid_t fork( void );pid_t 是一个宏定义,其实质是int,被定义在#include中返回值:若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-12、函数说明:一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回转载 2013-06-28 13:43:57 · 2295 阅读 · 0 评论 -
Linux的文件系统及其硬盘分区挂载原理
如果您是一位新手,也许 您还不知道如何把文件从Windows拷贝到Linux上吧?下面,我们将说明Unix文件系统以及mount的工作过程,然后再比较详细地讨论。 mount的使用和有关选项。如果您已经了解Unix文件系统是如何工作的,那么可以跳过下面一节。否则,您最好继续接着学习"mount"的含义。 什么是mount? 在一些操作系统(如Windows)中,计算机通过设备名来识别设备,例转载 2013-07-12 21:06:39 · 4365 阅读 · 0 评论 -
Linux 句柄是什么 ?
1.句柄就是一个标识符,只要获得对象的句柄,我们就可以对对象进行任意的操作。2.句柄不是指针,操作系统用句柄可以找到一块内存,这个句柄可能是标识符,map的key,也可能是指针,看操作系统怎么处理的了。fd算是在某种程度上替代句柄吧;Linux 有相应机制,但没有统一的句柄类型,各种类型的系统资源由各自的类型来标识,由各自的接口操作。3.http://tech.ddvip.com/2009-06/转载 2013-07-13 16:55:05 · 12241 阅读 · 0 评论 -
Linux进程-进程的创建
今天学习了Linux的进程创建的基本原理,是基于0.11版本核心的。下面对其作一下简单的总结。一、Linux进程在内存中的相关资源 很容易理解,Linux进程的创建过程就是内存中进程相关资源产生的过程,那么Linux进程在内存中有哪些相关资源呢? 1)task数组中的一项:一个指针指向进程的task_struct 2)一页内存:task_struct(Linux进程控制块)和内核态堆栈转载 2013-07-12 17:01:14 · 2347 阅读 · 0 评论 -
进程的用户栈和内核栈
进程是程序的一次执行过程。用剧本和演出来类比,程序相当于剧本,而进程则相当于剧本的一次演出,舞台、灯光则相当于进程的运行环境。进程的堆栈每个进程都有自己的堆栈,内核在创建一个新的进程时,在创建进程控制块task_struct的同时,也为进程创建自己堆栈。一个进程 有2个堆栈,用户堆栈和系统堆栈;用户堆栈的空间指向用户地址空间,内核堆栈的空间指向内核地址空间。当进程在用户态运行时,CPU堆栈指针寄存转载 2013-07-14 22:11:24 · 3652 阅读 · 0 评论 -
Linux0.11中对文本文件进行修改的策略
现在,假设 hello.txt 是硬盘上已有的一个文件,而且内容为 “hello, world” ,在文件的当前指针设置完毕后,我们来介绍 sys_read , sys_write , sys_lseek 如何联合使用才能把数据插入到 hello.txt 中。 可以通过如下方式对它们进行组合应用,应用程序的代码如下: #include #include #include #define L原创 2013-07-15 14:05:37 · 2115 阅读 · 0 评论 -
Linux0.11进程分配时间片的策略
想知道内核什么时候给进程重新分配时间片,最好的办法就是阅读源代码(其中已经打了注释)/****************************************************************************//* 功能:进程调度。 *//* 先对alarm和信号进行处理,如果某个进程处于可中断睡眠状态,并且收 *//* 到信转载 2013-07-15 14:46:39 · 2504 阅读 · 0 评论 -
Linux 进程等待队列
Linux内核的等待队列是以双循环链表为基础数据结构,与进程调度机制紧密结合,能够用于实现核心的异步事件通知机制。在这个链表中,有两种数据结构:等待队列头(wait_queue_head_t)和等待队列项(wait_queue_t)。等待队列头和等待队列项中都包含一个list_head类型的域作为"连接件"。它通过一个双链表和把等待tast的头,和等待的进程列表链接起来。从上图可以清晰看到。所以我转载 2013-07-01 10:51:29 · 2406 阅读 · 0 评论 -
Linux0.11小结
第一部分 基础内容1.操作系统基础 操作系统是计算机硬件系统与用户程序间重要环节,理解操作系统的原理是编写优秀代码的基础。教课书中阐述的操作系统一般由5部分组成。一个最简单的操作系统,可以不需要文件,不需要网络,只要实现多进程,且进程间也不需要通信,相互独立。那么这样一个简单的OS仅需要两块内容:进程管理、内存管理。这两方面内容是相辅相成,不可分割的,因为现在计算机系统的基本架构仍是指令存储转载 2013-06-30 13:34:14 · 3170 阅读 · 0 评论 -
Linux0.11启动过程
从开机加电,到执行main函数之前的过程好吧,这里应该是有执行3个汇编的文件,但是我不太了解。囧从main函数,到启动OK(即可以响应用户操作了)这个步骤做了3件事情:创建进程0,使之具备在主机中进行运算的能力,2.1已进程0为母本创建进程1,不仅有运算能力,而且还能以文件的行驶与外设进行数据交互,2.2-2.4以进程1为母本创建进程2,全面具备进程1的能力和环境,进一步具备支持“人机交互”,实现转载 2013-06-30 13:32:31 · 1544 阅读 · 0 评论 -
两篇文章说中断和异常之一
转载自:http://www.cnblogs.com/javawebsoa/archive/2013/05/05/3061787.html中断和异常的概念* 中断: 硬件通过中断来通知内核。中断是一种电信号,由硬件设备生成,并送入中断控制器 的输入引脚中,中断控制器会给CPU发送一个电信号,CPU检测到这个信号,就中断当 前的工作转而处理中断。每个中断都通过一个唯一的数字标志。这些中断值称为 中断转载 2013-07-01 14:46:40 · 1706 阅读 · 0 评论 -
两篇文章说异常和中断之二
一、基本概念1. 产生的位置发生的时刻时序中断CPU外部随机异步异常CPU正在执行的程序一条指令终止执行后同步2.由中断或异常执行的代码不是一个进程,而是一个内核控制路径,代表中断发生时正在运行的进程的执行中断处理程序与正在运行的程序无关引起异常处理程序的进程正是异常处理程序运行时的当前进程二、特点1.(1)尽可能快(2)能以嵌套的方式执行,但是同种类型的中断不可以嵌套(3)尽可能地限制临界区,因转载 2013-07-01 14:47:57 · 2159 阅读 · 0 评论 -
进程优先级的设置
可以通过改变进程的优先级来保证进程优先运行。在 Linux下,通过系统调用 nice()可以改变进程的优先级。nice()系统调用用来改变调用进程的优先级。函数声明如下:#include int nice( int increment );getpriority() 和 setpriority() 两函数的声明:#include int getpriority( int which, int转载 2013-07-01 15:06:38 · 3444 阅读 · 0 评论 -
LINUX0.11 内核阅读笔记
一.源码目录图1二.系统总体流程:系统从boot开始动作,把内核从启动盘装到正确的位置,进行一些基本的初始化,如检测内存,保护模式相关,建立页目录和内存页表,GDT表,IDT表。然后进入main进行初始化设置,main完成系统各个模块要用到的所有数据结构和外部设备的初始化。使得系统可以正常的工作。然后才进入用户模式。执行第一个fork生成进程1执行init,运行shell,接受并执行用户命令.这里转载 2013-07-21 19:07:01 · 2414 阅读 · 0 评论 -
Linux0.11 创建进程的过程分析--fork函数的使用
/** linux/kernel/fork.c** (C) 1991 Linus Torvalds*//*注意:signal.c和fork.c文件的编译选项内不能有vc变量优化选项/Og,因为这两个文件 内的函数参数内包含了函数返回地址等内容。如果加了/Og选项,编译器就会在认为 这些参数不再使用后占用该内存,导致函数返回时出错。 math/math_emulate.c照理也应该转载 2013-07-11 14:52:06 · 2050 阅读 · 0 评论 -
什么是文件头
要求每个文件均有特殊的、可识别的文件头。文件头偏移 代号 数据类型 字节数 默认值 名称 说明0 FUM P-BCD 2 文件统一标识 所有文件均含有此标识符2 FDT P-BCD 1 文件数据类型 自定义的数据类型3 DAL uc8 1 数据权限级别 该文件的用户可读、写权限级别4 注:数据类型P-BCD 压缩BCD码uc8 unsigned char用文件头判断。直接读取文件的前几个字转载 2013-07-11 19:09:05 · 6210 阅读 · 0 评论 -
深入解析硬盘结构
1.1 硬盘的外部结构一般硬盘正面贴有产品标签,主要包括厂家信息和产品信息,如商标、型号、序列号、生产日期、容量、参数和主从设置方法等。这些信息是正确使用硬盘的基本依据,下面将逐步介绍它们的含义。硬盘主要由盘体、控制电路板和接口部件等组成,如图1-1所示。盘体是一个密封的腔体。硬盘的内部结构通常是指盘体的内部结构;控制电路板上主要有硬盘BIOS、硬盘缓存(即CACHE)和主控制芯片等单元,如图1-转载 2013-06-14 12:53:45 · 2582 阅读 · 1 评论 -
Linux0.11 中对地址的管理
逻辑地址(Logical Address) 是指由程序产生的与段相关的偏移地址部分。例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址,不和绝对物理地址相干。只有在Intel实模式下,逻辑地址才和物理地址相等(因为实模式没有分段或分页机制,Cpu不进行自动地址转换);逻辑也就是在Intel 保护模式下程序执行代码段限长内的偏转载 2013-06-18 08:43:30 · 1748 阅读 · 1 评论 -
对Linux0.11 中 进程0 和 进程1分析
1. 背景进程的创建过程无疑是最重要的操作系统处理过程之一,很多书和教材上说的最多的还是一些原理的部分,忽略了很多细节。比如,子进程复制父进程所拥有的资源,或者子进程和父进程共享相同的物理页面,拥有自己的地址空间,子进程创建后接受统一调度执行等等。原理性的书籍更多地关注了进程创建过程中各个关键部分的功能,但由于过于抽象,很难理解,因此如果自己能够实际操作,实践这个过程就很重要,可以让那些看起来抽象转载 2013-06-18 08:43:39 · 3052 阅读 · 2 评论 -
Linux进程状态解析之R、S、D、T、Z、X
文章转载自:http://hi.baidu.com/shining_pc/item/21abcb32a4d2d484c3cf2950Linux是一个多用户,多任务的系统,可以同时运行多个用户的多个程序,就必然会产生很多的进程,而每个进程会有不同的状态。Linux进程状态:R (TASK_RUNNING),可执行状态。只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可执行状态,这转载 2013-06-18 09:36:56 · 1620 阅读 · 0 评论 -
实例分析exec函数
fork()函数通过系统调用创建一个与原来进程(父进程)几乎完全相同的进程(子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。linux将复制父进程的地址空间内容给子进程,因此,子进程有了独立的地址空间。),也就是这两个进程做完全相同的事。在fork后的子进程中使用exec函数族,可以装入和运行其它程转载 2013-06-22 15:41:22 · 1541 阅读 · 0 评论 -
理解inode
一、inode是什么?理解inode,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组转载 2013-06-23 21:16:10 · 1516 阅读 · 0 评论 -
魔数
魔数(magic number),即在编写程序时直接在程序中运用数字,而不是采用定义宏或是const变量的方式,图1是使用了魔数的一个示例程序。其中的64是指Msk的最大字节数。从这一程序中可以看出,Msk的最小字节数是MIN_MSK_LEN,即20。采用魔数的危害有: 1) 降低了程序的可读性。有人可能会提出,那加一些注释不就完了吗?如果真是采用加注释的方式,那为什么不将其定义成一个宏或是转载 2013-06-22 21:13:58 · 2586 阅读 · 0 评论 -
linux中文件描述符fd和文件指针flip的理解
简单归纳:fd只是一个整数,在open时产生。起到一个索引的作用,进程通过PCB中的文件描述符表找到该fd所指向的文件指针filp。文件描述符的操作(如: open)返回的是一个文件描述符,内核会在每个进程空间中维护一个文件描述符表, 所有打开的文件都将通过此表中的文件描述符来引用; 而流(如: fopen)返回的是一个FILE结构指针, FILE结构是包含有文件描述符的,FILE结构函数可以看作转载 2013-06-23 19:54:12 · 1913 阅读 · 0 评论 -
Linux根文件系统介绍
系统 根文件系统首先是一种文件系统,但是相对于普通的文件系统,它的特殊之处在于,它是内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。 我们首先从主机上所安装的Linux操作系统中了解一些根文件系统的信息。比如在笔者工作的Linux桌面系统中可以得到下面的结果: # mou转载 2013-07-10 08:52:42 · 7492 阅读 · 0 评论 -
Linux中link,unlink,close,fclose详解
unlink系统调用】 功能描述: 从文件系统中删除一个名称。如果名称是文件的最后一个连接,并且没有其它进程将文件打开,名称对应的文件会实际被删除。 用法: #include int unlink(const char *pathname);参数: pathname:指向需解除连接的文件名。 返回说明: 成功执行时,返回0。失败转载 2013-06-24 10:44:10 · 16749 阅读 · 3 评论 -
进程内核栈、用户栈
1.进程的堆栈 内核在创建进程的时候,在创建task_struct的同事,会为进程创建相应的堆栈。每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存在于内核空间。当进程在用户空间运行时,cpu堆栈指针寄存器里面的内容是用户堆栈地址,使用用户栈;当进程在内核空间时,cpu堆栈指针寄存器里面的内容是内核栈空间地址,使用内核栈。2.进程用户栈和内核栈的切换 当进程因为中断或者系转载 2013-06-24 21:43:27 · 1657 阅读 · 0 评论 -
内存分配的原理__进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)
如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看。 majflt代表major fault,中文名叫大错误,minflt代表minor fault,中文名叫小错误。 这两个数值表示一个进程自启动以来所发生的缺页中断的次数。发成缺页中断后,执行了那些操作?当一个进程发生缺页中断的时候,进程会陷转载 2013-06-25 11:09:14 · 5144 阅读 · 0 评论 -
Linux--缺页中断和交换技术
1.请求调页中断:进程线性地址空间里的页面不必常驻内存,例如进程的分配请求被理解满足,空间仅仅保留vm_area_struct的空间,页面可能被交换到后援存储器,或者写一个只读页面(COW)。Linux采用请求调页技术来解决硬件的缺页中断异常,并且通过预约式换页策略。主缺页中断和次缺页中断,费时的需要从磁盘读取数据时就会产生主缺页中断。每种CPU结构提供一个do_page_fault (struc转载 2013-06-25 11:11:43 · 2856 阅读 · 0 评论 -
Linux0.11进程切换和TSS结构
TSS 全称为task state segment,是指在操作系统进程管理的过程中,进程切换时的任务现场信息。 X86体系从硬件上支持任务间的切换。为此目的,它增设了一个新段:任务状态段(TSS),它和数据段、代码段一样也是一种段,记录了任务的状态信息。 与其它段一样,TSS也有描述它的结构:TSS描述符表,它记录了一个TSS的信息,同时还有一个TR寄存器,它指向当前转载 2013-06-25 22:11:06 · 3709 阅读 · 0 评论 -
Linux进程-命令行参数和环境列表
命令行参数在C中,main函数有很多的变种,比如main(),int main(),int main(int argc, char *argv[]),int main(int argc, char *argv[], char *env[])。在很长一段时间里(特别是在windows下),我都不清楚后面两种main函数中这么多参数有什么用,直到转到linux下,才明白了这些参数并不是多余的。i转载 2013-06-25 09:43:44 · 4587 阅读 · 1 评论 -
Linux内核探讨-- 第一章
第一章--进程管理1.什么是进程 第一章首先从进程开始讲起,进程是操作系统最基本的东西,我们依靠进程提供服务,利用进程完成我们需要完成的工作。首先需要明白什么是进程。它是一个动态实体,是程序的一次执行过程。一个进程需要一些必须的资源才能够运行,而最基本的资源就是 CPU 和内存。进程获得 CPU 它就处于运行状态,进程的运行肯定需要程序段,数据段,堆,栈这样的资源,而这些就是原创 2013-09-28 21:48:06 · 1959 阅读 · 0 评论