Linux内核探索
Dave888Zhou
大处着眼,小处着手;群居守口,独居守心。
展开
-
Linux内核体系结构
本文转自IBM developerWorks,稍有改动。 图1说明Linux内核的发展简史: 图1 Linux内核发展简史 图2是Linux系统的层次结构:图2 Linux系统层次结构 最上面是用户(或应用程序)空间。这是用户应用程序执行的地方。用户空间之下是内核空间,Linux 内核正是位于这里。GNU C Library (glibc)也在这转载 2012-01-03 00:23:17 · 3181 阅读 · 0 评论 -
Linux进程调度(4):实时调度
4、实时调度算法 linux内核中提供了两种实时调度策略:SCHED_FIFO和SCHED_RR,其中RR是带有时间片的FIFO。这两种调度算法实现的都是静态优先级。内核不为实时进程计算动态优先级。这能保证给定优先级别的实时进程总能抢占优先级比他低得进程。linux的实时调度算法提供了一种软实时工作方式。实时优先级范围从0到MAX_RT_PRIO减一。默认情况下,MAX_RT_PRIO为原创 2012-03-20 22:36:26 · 6451 阅读 · 0 评论 -
Linux进程调度(2):CFS调度操作
Linux主要实现了两大类调度算法,CFS(完全公平调度算法)和实时调度算法。宏SCHED_NOMAL和SCHED_BATCH主要用于CFS调度,而SCHED_FIFO和SCHED_RR主要用于实时调度。这几个宏的定义可以在include/linux/sched.h中找到。文件kernel/sched.c包含了内核调度器及相关系统调用的实现。调度的核心函数为sched.c中的schedule(),原创 2012-03-20 22:09:00 · 6108 阅读 · 2 评论 -
Linux进程管理(3):总结
7. exit与_exit的差异 为了理解这两个系统调用的差异,先来讨论文件内存缓存区的问题。 在linux中,标准输入输出(I/O)函数都是作为文件来处理。对应于打开的每个文件,在内存中都有对应的缓存,每次读取文件时,会多读一些记录到缓存中,这样在下次读文件时,就在缓存中读取;同样,在写文件时也是写在文件对应的缓存中,并不是直接写入硬盘的文件中,等满足了一定条件(如达到一定数量,遇到换原创 2012-03-19 22:28:56 · 2598 阅读 · 1 评论 -
Linux进程调度(1):CFS调度器的设计框架
1. 概述 对于分时操作系统而言,表面上看起来是多个进程同时在执行,而在系统内部则进行着从一个进程到另一个进程的切换动作。这样的进程并发执行涉及到进程切换(process switch)和进程调度(process scheduling)两大问题。其中进程调度是操作系统的核心功能,它是一个非常复杂的过程,需要多个系统协同工作完成。Linux作为一个通用操作系统,其调度器的设计一直是一个颇有原创 2012-03-20 21:48:28 · 13630 阅读 · 4 评论 -
Linux内存管理(2):内存描述
linux内存管理建立在基本的分页机制基础上,在linux内核中RAM的某些部分将会永久的分配给内核,并用来存放内核代码以及静态内核数据结构。RAM的其余部分称为动态内存,这不仅是进程所需的宝贵资源,也是内核本身所需的宝贵资源。实际上,整个系统的性能取决于如何有效地管理动态内存。因此,现在所有多任务操作系统都在经历优化对动态内存的使用,也就是说,尽可能做到当要时分配,不需要时释放。 内存原创 2012-08-18 11:54:09 · 4460 阅读 · 0 评论 -
Linux内存管理(1): 内存模型
本文转自IBM developerWorks,稍有改动。 Linux使用的是单一整体式结构(Monolithic),其中定义了一组原语或系统调用以实现操作系统的服务,例如在几个模块中以超级模式运行的进程管理、并发控制和内存管理服务。尽管出于兼容性考虑,Linux依然将段控制单元模型(segment control unit model)保持一种符号表示,但实际上已经很少使用这种模型了。转载 2012-08-18 11:41:05 · 5101 阅读 · 1 评论 -
Linux内存管理(3):内存探测与初始化
1、内存探测 linux在被bootloader加载到内存后, cpu最初执行的内核代码是arch/x86/boot/header.S汇编文件中的_start例程,设置好头部header,其中包括大量的bootloader参数。接着是其中的start_of_setup例程,这个例程在做了一些准备工作后会通过call main跳转到arch/x86/boot/main.c:main()函数原创 2012-08-18 12:21:31 · 5578 阅读 · 1 评论 -
Linux内存管理(4):内存映射机制
现代意义上的操作系统都处于32位保护模式下。每个进程一般都能寻址4G的内存空间。但是我们的物理内存常常没有这么大,进程怎么能获得4G的内存空间呢?这就是使用了虚拟地址的好处。我们经常在程序的反汇编代码中看到一些类似0x32118965这样的地址,操作系统中称为线性地址,或虚拟地址。通常我们使用一种叫做虚拟内存的技术来实现,因为可以使用硬盘中的一部分来当作内存使用。另外,现在操作系统都划分为系统空间原创 2012-08-26 15:14:22 · 6998 阅读 · 1 评论 -
Linux进程管理(2):进程创建的copy_process和进程销毁
4. copy_process: 进程描述符的处理 copy_process函数也在./linux/kernel/fork.c中。它会用当前进程的一个副本来创建新进程并分配pid,但不会实际启动这个新进程。它会复制寄存器中的值、所有与进程环境相关的部分,每个clone标志。新进程的实际启动由调用者来完成。 对于每一个进程而言,内核为其单独分配了一个内存区域,这个区域存储的是内核原创 2012-03-18 23:45:54 · 8117 阅读 · 0 评论 -
Linux进程管理(1):进程描述和进程创建
Linux 是一种动态系统,能够适应不断变化的计算需求。Linux 计算需求的表现是以进程的通用抽象为中心的。进程可以是短期的(从命令行执行的一个命令),也可以是长期的(一种网络服务)。因此,对进程及其调度进行一般管理就显得极为重要。 在用户空间,进程是由进程标识符(PID)表示的。从用户的角度来看,一个 PID 是一个数字值,可惟一标识一个进程。一个 PID 在进程的整个生命期间不会更原创 2012-03-18 17:51:09 · 3688 阅读 · 0 评论 -
Linux进程调度(3):进程切换分析
3、调度函数schedule()分析 当kernel/sched.c:sched_tick()执行完,并且时钟中断返回时,就会调用kernel/sched.c:schedule()完成进程切换。我们也可以显示调用schedule(),例如在前面“Linux进程管理“的介绍中,进程销毁的do_exit()最后就直接调用schedule(),以切换到下一个进程。 schedule(原创 2012-03-20 22:23:01 · 11343 阅读 · 1 评论 -
X Window System介绍
1、概述 X Window System是1984年由麻省理工学院(MIT)和DEC公司共同开发研究的,是运行在UNIX系统上的视窗系统。严格地说,X Window System并不是一个软件,而是一个协议,这个协议定义一个系统成品所必需具备的功能(就如同TCP/IP、DECnet或IBM的SNA,这些也都是协议,定义软件所应具备的功能)。能满足此协议及符合X协会其他规范的系统便可称为X原创 2011-08-07 15:14:47 · 14553 阅读 · 0 评论 -
Linux init程序分析(续)
3、upstart介绍 upstart是一个基于事件的init的替代程序,这意味着服务的启动和停止都基于事件的通信。 upstart 正在由 Scott James Remnant 进行开发,早期用于Ubuntu发行版,不过它想要成为任何 Linux 发行版上 init 的通用替代程序。现在已经用在了包括Ubuntu、Fedora等主流的Linux系统中了,前面的代码分析就是基于upst原创 2011-08-07 15:04:32 · 7438 阅读 · 2 评论 -
Linux初始RAM磁盘介绍
本文转自IBM developerWorks,有稍许的改动。 1、什么是初始RAM磁盘 初始 RAM 磁盘(initrd)是在实际根文件系统可用之前挂载到系统中的一个初始根文件系统。initrd 与内核绑定在一起,并作为内核引导过程的一部分进行加载。内核然后会将这个 initrd 文件作为其两阶段引导过程的一部分来加载模块,这样才能稍后使用真正的文件系统,并挂载实际的根文件系转载 2011-08-01 20:49:21 · 2473 阅读 · 0 评论 -
Linux引导过程内幕
<!--p {margin-bottom:0.08in}--> 本文转自IBMdeveloperWorks,有稍许的改动。 早期时,启动一台计算机意味着要给计算机喂一条包含引导程序的纸带,或者手工使用前端面板地址/数据/控制开关来加载引导程序。尽管目前的计算机已经装备了很多工具来简化引导过程,但是这一切并没有对整个过程进行必要的简化。让我们先从高转载 2011-08-01 21:15:20 · 2530 阅读 · 1 评论 -
Linux init程序分析
1、init程序剖析 init进程是内核引导过程完成时创建的第一个进程。Linux使用了init进程来对组成Linux的服务和应用程序进行初始化。 当 init 进程启动时(使用传统的sysvinit版本),它会打开一个名为 /etc/inittab 的文件。这个文件是 init 的配置文件,定义了如何对系统进行初始化。这个文件还包含了有关出现电源故障时执行的操作(如果系统支持原创 2011-08-07 14:44:42 · 19801 阅读 · 5 评论 -
Linux安装程序Anaconda分析(续)
(1) disptach.py: 下面我们看一下Dispatcher类的主要接口。 1)gotoNext & gotoPrev:这两个接口分别从当前安装步骤前进(后退)到下一个(上一个)具有用户界面的安装步骤,在图形界面安装模式下,由InstallControlWindow类调用,在字符模式下,由InstallInterface类(在text.py和cmdline.py中)调用。这两个函原创 2012-01-02 23:22:25 · 7043 阅读 · 0 评论 -
Linux内核启动过程分析
1、Linux内核启动协议 阅读文档\linux-2.6.35\Documentation\x86\boot.txt 传统支持Image和zImage内核的启动装载内存布局(2.4以前的内核装载就是这样的布局): | |0A0000 +------------------------+ | Reserved for BIO原创 2011-08-07 13:13:58 · 32759 阅读 · 3 评论 -
Linux安装程序Anaconda分析
1、概述 Anaconda是RedHat、CentOS、Fedora等Linux的安装管理程序。它可以提供文本、图形等安装管理方式,并支持Kickstart等脚本提供自动安装的功能。此外,其还支持许多启动参数,熟悉这些参数可为安装带来很多方便。该程序的功能是把位于光盘或其他源上的数据包,根据设置安装到主机上。为实现该定制安装,它提供一个定制界面,可以实现交互式界面供用户选择配置(如选择原创 2012-01-02 22:23:59 · 29754 阅读 · 3 评论 -
Linux内存管理(5):分页机制和管理区初始化
1、初始化启动内存分配器 在内存子系统初始化以前,即boot阶段也需要进行内存管理,启动内存分配器是专为此而设计的。linux启动内存分配器是在伙伴系统、slab机制实现之前,为满足内核中内存的分配而建立的。本身的机制比较简单,使用位图来进行标志分配和释放。arch/x86/kernel/setup.c:setup_arch()在用init_memory_mapping(0, max_l原创 2012-08-26 15:28:09 · 4522 阅读 · 0 评论