Linux内核设计的艺术
文章平均质量分 76
对于学习Linux技术开发的人,在了解了系统编程和高级的应用之后,下一个阶段就是应该学习Linux内核,当然,那些都是非常晦涩难懂的知识,博主希望在自己学习的同时,及时记录自己学习的内容,分享自己学习的过程
BruceZhang
计算机专业的一个小学生
展开
-
LINUX0.11 内核阅读笔记
一.源码目录图1二.系统总体流程:系统从boot开始动作,把内核从启动盘装到正确的位置,进行一些基本的初始化,如检测内存,保护模式相关,建立页目录和内存页表,GDT表,IDT表。然后进入main进行初始化设置,main完成系统各个模块要用到的所有数据结构和外部设备的初始化。使得系统可以正常的工作。然后才进入用户模式。执行第一个fork生成进程1执行init,运行shell,接受并执行用户命令.这里转载 2013-07-21 19:07:01 · 2407 阅读 · 0 评论 -
Linux0.11进程分配时间片的策略
想知道内核什么时候给进程重新分配时间片,最好的办法就是阅读源代码(其中已经打了注释)/****************************************************************************//* 功能:进程调度。 *//* 先对alarm和信号进行处理,如果某个进程处于可中断睡眠状态,并且收 *//* 到信转载 2013-07-15 14:46:39 · 2487 阅读 · 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 · 2109 阅读 · 0 评论 -
进程的用户栈和内核栈
进程是程序的一次执行过程。用剧本和演出来类比,程序相当于剧本,而进程则相当于剧本的一次演出,舞台、灯光则相当于进程的运行环境。进程的堆栈每个进程都有自己的堆栈,内核在创建一个新的进程时,在创建进程控制块task_struct的同时,也为进程创建自己堆栈。一个进程 有2个堆栈,用户堆栈和系统堆栈;用户堆栈的空间指向用户地址空间,内核堆栈的空间指向内核地址空间。当进程在用户态运行时,CPU堆栈指针寄存转载 2013-07-14 22:11:24 · 3642 阅读 · 0 评论 -
Linux 句柄是什么 ?
1.句柄就是一个标识符,只要获得对象的句柄,我们就可以对对象进行任意的操作。2.句柄不是指针,操作系统用句柄可以找到一块内存,这个句柄可能是标识符,map的key,也可能是指针,看操作系统怎么处理的了。fd算是在某种程度上替代句柄吧;Linux 有相应机制,但没有统一的句柄类型,各种类型的系统资源由各自的类型来标识,由各自的接口操作。3.http://tech.ddvip.com/2009-06/转载 2013-07-13 16:55:05 · 12208 阅读 · 0 评论 -
Linux进程-进程的创建
今天学习了Linux的进程创建的基本原理,是基于0.11版本核心的。下面对其作一下简单的总结。一、Linux进程在内存中的相关资源 很容易理解,Linux进程的创建过程就是内存中进程相关资源产生的过程,那么Linux进程在内存中有哪些相关资源呢? 1)task数组中的一项:一个指针指向进程的task_struct 2)一页内存:task_struct(Linux进程控制块)和内核态堆栈转载 2013-07-12 17:01:14 · 2340 阅读 · 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 · 6106 阅读 · 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 · 2038 阅读 · 0 评论 -
Linux根文件系统介绍
系统 根文件系统首先是一种文件系统,但是相对于普通的文件系统,它的特殊之处在于,它是内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。 我们首先从主机上所安装的Linux操作系统中了解一些根文件系统的信息。比如在笔者工作的Linux桌面系统中可以得到下面的结果: # mou转载 2013-07-10 08:52:42 · 7477 阅读 · 0 评论 -
两篇文章说异常和中断之二
一、基本概念1. 产生的位置发生的时刻时序中断CPU外部随机异步异常CPU正在执行的程序一条指令终止执行后同步2.由中断或异常执行的代码不是一个进程,而是一个内核控制路径,代表中断发生时正在运行的进程的执行中断处理程序与正在运行的程序无关引起异常处理程序的进程正是异常处理程序运行时的当前进程二、特点1.(1)尽可能快(2)能以嵌套的方式执行,但是同种类型的中断不可以嵌套(3)尽可能地限制临界区,因转载 2013-07-01 14:47:57 · 2148 阅读 · 0 评论 -
两篇文章说中断和异常之一
转载自:http://www.cnblogs.com/javawebsoa/archive/2013/05/05/3061787.html中断和异常的概念* 中断: 硬件通过中断来通知内核。中断是一种电信号,由硬件设备生成,并送入中断控制器 的输入引脚中,中断控制器会给CPU发送一个电信号,CPU检测到这个信号,就中断当 前的工作转而处理中断。每个中断都通过一个唯一的数字标志。这些中断值称为 中断转载 2013-07-01 14:46:40 · 1698 阅读 · 0 评论 -
Linux 进程等待队列
Linux内核的等待队列是以双循环链表为基础数据结构,与进程调度机制紧密结合,能够用于实现核心的异步事件通知机制。在这个链表中,有两种数据结构:等待队列头(wait_queue_head_t)和等待队列项(wait_queue_t)。等待队列头和等待队列项中都包含一个list_head类型的域作为"连接件"。它通过一个双链表和把等待tast的头,和等待的进程列表链接起来。从上图可以清晰看到。所以我转载 2013-07-01 10:51:29 · 2375 阅读 · 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 · 1531 阅读 · 0 评论 -
Linux0.11小结
第一部分 基础内容1.操作系统基础 操作系统是计算机硬件系统与用户程序间重要环节,理解操作系统的原理是编写优秀代码的基础。教课书中阐述的操作系统一般由5部分组成。一个最简单的操作系统,可以不需要文件,不需要网络,只要实现多进程,且进程间也不需要通信,相互独立。那么这样一个简单的OS仅需要两块内容:进程管理、内存管理。这两方面内容是相辅相成,不可分割的,因为现在计算机系统的基本架构仍是指令存储转载 2013-06-30 13:34:14 · 3131 阅读 · 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 · 2280 阅读 · 0 评论 -
Linux0.11进程切换和TSS结构
TSS 全称为task state segment,是指在操作系统进程管理的过程中,进程切换时的任务现场信息。 X86体系从硬件上支持任务间的切换。为此目的,它增设了一个新段:任务状态段(TSS),它和数据段、代码段一样也是一种段,记录了任务的状态信息。 与其它段一样,TSS也有描述它的结构:TSS描述符表,它记录了一个TSS的信息,同时还有一个TR寄存器,它指向当前转载 2013-06-25 22:11:06 · 3679 阅读 · 0 评论 -
Linux--缺页中断和交换技术
1.请求调页中断:进程线性地址空间里的页面不必常驻内存,例如进程的分配请求被理解满足,空间仅仅保留vm_area_struct的空间,页面可能被交换到后援存储器,或者写一个只读页面(COW)。Linux采用请求调页技术来解决硬件的缺页中断异常,并且通过预约式换页策略。主缺页中断和次缺页中断,费时的需要从磁盘读取数据时就会产生主缺页中断。每种CPU结构提供一个do_page_fault (struc转载 2013-06-25 11:11:43 · 2841 阅读 · 0 评论 -
内存分配的原理__进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)
如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看。 majflt代表major fault,中文名叫大错误,minflt代表minor fault,中文名叫小错误。 这两个数值表示一个进程自启动以来所发生的缺页中断的次数。发成缺页中断后,执行了那些操作?当一个进程发生缺页中断的时候,进程会陷转载 2013-06-25 11:09:14 · 5103 阅读 · 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 · 4566 阅读 · 1 评论 -
进程内核栈、用户栈
1.进程的堆栈 内核在创建进程的时候,在创建task_struct的同事,会为进程创建相应的堆栈。每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存在于内核空间。当进程在用户空间运行时,cpu堆栈指针寄存器里面的内容是用户堆栈地址,使用用户栈;当进程在内核空间时,cpu堆栈指针寄存器里面的内容是内核栈空间地址,使用内核栈。2.进程用户栈和内核栈的切换 当进程因为中断或者系转载 2013-06-24 21:43:27 · 1650 阅读 · 0 评论 -
Linux中link,unlink,close,fclose详解
unlink系统调用】 功能描述: 从文件系统中删除一个名称。如果名称是文件的最后一个连接,并且没有其它进程将文件打开,名称对应的文件会实际被删除。 用法: #include int unlink(const char *pathname);参数: pathname:指向需解除连接的文件名。 返回说明: 成功执行时,返回0。失败转载 2013-06-24 10:44:10 · 16679 阅读 · 3 评论 -
理解inode
一、inode是什么?理解inode,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组转载 2013-06-23 21:16:10 · 1506 阅读 · 0 评论 -
linux中文件描述符fd和文件指针flip的理解
简单归纳:fd只是一个整数,在open时产生。起到一个索引的作用,进程通过PCB中的文件描述符表找到该fd所指向的文件指针filp。文件描述符的操作(如: open)返回的是一个文件描述符,内核会在每个进程空间中维护一个文件描述符表, 所有打开的文件都将通过此表中的文件描述符来引用; 而流(如: fopen)返回的是一个FILE结构指针, FILE结构是包含有文件描述符的,FILE结构函数可以看作转载 2013-06-23 19:54:12 · 1911 阅读 · 0 评论 -
魔数
魔数(magic number),即在编写程序时直接在程序中运用数字,而不是采用定义宏或是const变量的方式,图1是使用了魔数的一个示例程序。其中的64是指Msk的最大字节数。从这一程序中可以看出,Msk的最小字节数是MIN_MSK_LEN,即20。采用魔数的危害有: 1) 降低了程序的可读性。有人可能会提出,那加一些注释不就完了吗?如果真是采用加注释的方式,那为什么不将其定义成一个宏或是转载 2013-06-22 21:13:58 · 2574 阅读 · 0 评论 -
Linux系统的shell是什么
shell是用户和Linux操作系统之间的接口。Linux中有多种shell,其中缺省使用的是Bash。本章讲述了shell的工作原理,shell的种类,shell的一般操作及Bash的特性。 什么是shell Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。shell是用户和Linux内核之间的接口程序,如果把Linux转载 2013-06-22 13:37:50 · 4333 阅读 · 0 评论 -
协处理器简介
原文出自:http://blog.csdn.net/liukun321/article/details/5548877协处理器 一种芯片,用于减轻系统微处理器的特定处理任务。例如,数学协处理器可以控制数字处理;图形协处理器可以处理视频绘制。例如,intel pentium 微处理器就包括内置的数学协处理器。 协处理器可以附属于ARM处理器。一个协处理器通过扩展指令集或提供配置寄存器来扩展内核转载 2013-06-20 20:56:25 · 1783 阅读 · 0 评论 -
linux进程管理之进程创建
所谓进程就是程序执行时的一个实例. 它是现代操作系统中一个很重要的抽象,我们从进程的生命周期:创建,执行,消亡来分析一下Linux上的进程管理实现.一:前言进程管理结构;在内核中,每一个进程对应一个task.就是以前所讲的PCB.它的结构如下(include/linux/sched.h):struct task_struct { volatile long state; /* -1 u转载 2013-06-20 20:21:56 · 1601 阅读 · 0 评论 -
C 语言内存区域分配(进程的各个段)详解
C语言可执行代码结构 名称内容代码段 可执行代码、字符串常量数据段 已初始化全局变量、已初始化全局静态变量、局部静态变量、常量数据BSS段 未初始化全局变量,未初始化全局静态变量栈 局部变量、函数参数堆 动态内存分配 一般情况下,一个可执行二进制程序(更确切的说,在Linux操作系统下为一个进程单元,在UC/OSII中被称为任务)在存储(没有调入到内存运行)时拥有3个部分,分别是代码转载 2013-06-20 15:14:02 · 3334 阅读 · 0 评论 -
实例分析exec函数
fork()函数通过系统调用创建一个与原来进程(父进程)几乎完全相同的进程(子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。linux将复制父进程的地址空间内容给子进程,因此,子进程有了独立的地址空间。),也就是这两个进程做完全相同的事。在fork后的子进程中使用exec函数族,可以装入和运行其它程转载 2013-06-22 15:41:22 · 1503 阅读 · 0 评论 -
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 · 1610 阅读 · 0 评论 -
Linux0.11 中对地址的管理
逻辑地址(Logical Address) 是指由程序产生的与段相关的偏移地址部分。例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址,不和绝对物理地址相干。只有在Intel实模式下,逻辑地址才和物理地址相等(因为实模式没有分段或分页机制,Cpu不进行自动地址转换);逻辑也就是在Intel 保护模式下程序执行代码段限长内的偏转载 2013-06-18 08:43:30 · 1738 阅读 · 1 评论 -
对Linux0.11 中 进程0 和 进程1分析
1. 背景进程的创建过程无疑是最重要的操作系统处理过程之一,很多书和教材上说的最多的还是一些原理的部分,忽略了很多细节。比如,子进程复制父进程所拥有的资源,或者子进程和父进程共享相同的物理页面,拥有自己的地址空间,子进程创建后接受统一调度执行等等。原理性的书籍更多地关注了进程创建过程中各个关键部分的功能,但由于过于抽象,很难理解,因此如果自己能够实际操作,实践这个过程就很重要,可以让那些看起来抽象转载 2013-06-18 08:43:39 · 3037 阅读 · 2 评论 -
搭建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 · 3475 阅读 · 0 评论