`
yanfaguanli
  • 浏览: 661851 次
文章分类
社区版块
存档分类
最新评论

Linux内核设计基础(五)之内存管理

 
阅读更多

我感觉学习操作系统首先要从内存分配和管理入手。首先我们应该知道现代操作系统是以页为单位进行内存管理的,32位体系结构支持4KB的页,而64位体系结构支持8KB的页。页是用来分配的,如何才能进行高效和充分的利用,这是内存管理单元(MMU)应当仔细考虑的。


页分配

内核用结构体struct page表示每个物理页。内核用这一结构来管理系统中所有的页,因为内核需要知道一个页是否空闲(也就是页有没有被分配),如果页已经被分配,内核需要知道谁拥有这个页,拥有者可能是用户空间进程、动态分配的内核数据、静态内核代码或页高速缓存。我们用页表来统一管理所有的struct page。另外内核用区对具有相似特性的页进行分组。主要是存在下面两种制约:

  • 一些硬件只能用某些特定的内存地址执行DMA(直接内存访问)
  • 一些体系结构的内存的物理寻址范围比虚拟寻址范围大得多。这样,就有一些内存不能永久地映射到内核空间(高端内存)
于是Linux划分了一下四个区:
  • ZONE_DMA——这个区包含的页能用来执行DMA操作。
  • ZONE_DMA32——同上,不过只能被32位设备访问。
  • ZONE_NORMAL——这个区包含的都是能正常映射的页。
  • ZONE_HIGHEM——高端内存,其中的页并不能永久映射到内核地址空间。


slab层

用于频繁使用的数据结构的缓存,且避免因频繁分配和使用导致的内存碎片。slab层是由高速缓存组成的,而每个高速缓存可以由多个slab组成,slab由一个或多个物理上连续的页组成。每个slab都包含一些缓存的数据结构。这样说还是很抽象,举个inode的例子。

inode是磁盘文件在内存中的体现,会频繁地进行创建和释放,所以有必要进行缓存管理。在这里高速缓存是inode_cachep,它由多个slab组成,而每个slab包含尽可能多的struct inode对象。所以当我们需要一个新的inode结构时,不必现创建,只需从部分满或空的slab返回一个指向已分配但未使用的inode结构的指针即可。当内核使用完这个inode对象时,slab分配器就把该对象标记为空闲,留给后来者。

再举个进程控制块的例子。

我们知道进程在不停地创建和消除,而用struct task_struct去管理一个进程,不停的创建和释放task_struct会很费时。所以内核初始化期间,在fork_init()中着手创建高速缓存:

struct kmem_cache *task_struct_cachep;(内核用这个全局变量存放指向task_struct高速缓存的指针)
task_struct_cachep = kmem_cache_create("task_struct",
                                        sizeof(struct task_struct),
                                        ARCH_MIN_TASKALIGN,
                                        SLAB_PANIC | SLAB_NOTRACK,
                                        NULL);

这样当我们创建进程(执行fork)时,只需从这个高速缓存中索取即可:

struct task_struct *tsk;
tsk = kmem_cache_alloc(task_struct_cachep, GFP_KERNEL);
if(!tsk) return NULL;

内核栈

我们在进程时要注意节省栈资源,要控制函数内的局部变量,尽量不要出现大型数组或大型结构体。尤其对于内核栈,一旦造成溢出,就会影响到内核数据(如thread_info)。所以应当优先考虑动态分配。另外一个进程的内核栈和中断栈是分开的,这样可以减轻内核栈的负担(一个内核栈只占1页或2页)。




分享到:
评论

相关推荐

    Linux 内核分析与驱动编程

    课程介绍及相关基础知识概述 Le ctu re2 :进程管理与调度 Lecture3:中断处理、系统调用 Lecture4:内核同步 Lecture5:内存管理(1) Lecture6:内存管理(2) Lecture7 :文件系统 Lecture8:内核设备模型、时钟...

    边干边学——LINUX内核指导

    第1章 了解Linux内核 1. 1 Linux内核 1. 2 查看Linux内核状况 1. 3 编程序检查系统状况 1. 4 Linux编程环境 第2章 shell 2. 1 she11 2. 2 实现一个简单的shell程序 2. 3 shell编程 第3章 内核时钟 3. 1 关于时钟和...

    深入理解LINUX内核(第三版)

    , 《深入理解Linux内核,第三版》指导你对内核中使用的最重要的数据结构、算法和程序设计诀窍进行一次遍历。通过对表面特性的探究,作者给那些想知道自己机器工作原理的人提供了颇有价值的见解。书中讨论了Intel特有...

    Linux内核设计与实现(中英文版)

    学习Linux内核很好的入门教程,如果对进程,内存管理等操作系统基础知识没什么了解。可以从这里开始学习Linux内核!

    Linux程序设计参考书-六部

    第1章硬件基础与软件基础1.1 硬件基础1.1.1 CPU1.1.2 存储器1.1.3 总线1.1.4 控制器和外设1.1.5 地址空间1.1.6 时钟1.2 软件基础1.2.1 计算机语言1.2.1 计算机语言1.2.2 什么是操作系统第2章内存管理第3章进程第4章...

    深入理解Linux内核

    , 《深入理解Linux内核,第三版》指导你对内核中使用的最重要的数据结构、算法和程序设计诀窍进行一次遍历。通过对表面特性的探究,作者给那些想知道自己机器工作原理的人提供了颇有价值的见解。书中讨论了Intel特有...

    深入理解linux内核

    , 《深入理解Linux内核,第三版》指导你对内核中使用的最重要的数据结构、算法和程序设计诀窍进行一次遍历。通过对表面特性的探究,作者给那些想知道自己机器工作原理的人提供了颇有价值的见解。书中讨论了Intel特有...

    Professional Linux Kernel Architecture

    内核基础知识:介绍Linux内核的基本概念、组成部分和体系结构,包括进程管理、内存管理、设备驱动、文件系统等。 内核源代码结构:讲解Linux内核源代码的组织结构和模块化设计,帮助读者理解内核源代码的组织方式和...

    [14本经典Android开发教程]-8-Linux内核阅读心得体会

    [14本经典Android开发教程] 8 Linux内核阅读心得体会 读核感悟 2 读核感悟 Linux内核启动 内核的生成 2 读核感悟 Linux内核启动 从hello world说起 3 读核感悟 Linux内核启动 BIOS 5 读核感悟 Linux内核启动 setup...

    Linux的内核与编程

    本书结合源代码分析了Linux操作系统,结合源代码是本书的一个亮点本书共有两个大部分:内核原理和编程方法共19章: 第1章 软件基础 (介绍了内核的数据结构) 第2章 内存管理 (各种管理算法) 第3章 进程第4章 进程间通信...

    Linux内核工作原理 word版本 强烈推荐

    内存管理这章描叙了Linux如何处理物理内存以及虚拟存储技术。 进程管理描叙了进程的概念以及Linux核心是如何创建、管理与删除系统中的进程。 进程间及进程与核心间通讯以协调它们的活动。Linux支持大量进程间通讯...

    嵌入式Linux视频教程完整视频

    内存管理子系统) 内核开发基础) 嵌入式Linux系统构建) U-Boot移植) 硬件访问) 设备模型) 块设备驱动程序) 网卡触摸屏) USB驱动程序开发) USB系统架构) PCI串口) LCD驱动程序) 硬件访问) ...

    Linux 基础课程课件

    第1章 Linux系统概述 1.1 计算机基础知识 1.2 操作系统的功能 1.3 Linux系统的历史、现状和特点 1.4 Linux系统安装 1.5 安装工具软件和开发软件 1.6 Linux图形环境 第2章 Linux常用命令 ... 5.4 内存管理

    linux的内核与编程

    分别介绍了Linux操作系统实现的软件基础、内存管理、进程、进程间通信机制、PCI、中断和中断处理、设备驱动器、文件系统、网络、内核机制、模件、内核源代码、内部数据结构、GAWK语言、C语言、系统服务、多进程编程...

    嵌入式Linux操作系统的研究

    在 Linux内核以及 Linux应用环境的研究基础上 ,采用操作系统模块分解改进的方法 ,实现在不同系统芯 片 ( sy stem on chip, So C)硬件平台上可运行的嵌入式 Linux操作系统 .分解改进的模块包括: 启动代码的平台相关 ...

    嵌入式Linux视频教程全套2011新版-国嵌嵌入式培训下载地址

    -国嵌内核驱动进阶班-1-3(Linux内核配置与编译).avi -国嵌内核驱动进阶班-1-4(Linux内核模块开发).avi -国嵌内核驱动进阶班-1-5(必修实验).avi -第2天(U-Boot移植) -国嵌内核驱动进阶班-2-1(嵌入式linux...

    清华大学Linux操作系统原理与应用

    1.4.1 Linux内核的位置 10 1.4.2 Linux内核的作用 11 1.4.3 Linux内核子系统 11 1.5 Linux内核源代码 13 1.5.1 多版本的内核源代码 13 1.5.2 Linux内核源代码的结构 13 1.5.3 Linux内核源代码分析工具 14 习题1 15 ...

    Linux一张软盘上的嵌入应用

    一个嵌入式Linux系统只需要下面三个基本元素:引导程序、Linux微内核(由内存管理、进程管理和事务处理 构成)和初始化进程。如果要让它有更多的功能且保持小型化,还可以加上文件系统、TCP/IP网络支持、GUI(图形...

    Linux底层通信的分析及改进设计

    82页的论文资料。摘要:在新一代的通信构架中,电信设备不断升级更新,其上的电信板功能的强大已经达到了刀片式服务器的水平,板上运行的是...并在此基础上,通过私有协议的设计,来完成X公司点到点通信方式链路管理的需求。

    边干边学Linux__第二版_doc格式

    9.6 了解Linux内核的启动 9.7 应用grub配置启动文件 9.8 编写制作Linux启动盘的shell脚本程序 9.9 Linux源程序的目录分布 9.10 学习Linux的常用工具 9.11 查看Linux内核状况 9.12 编程序检查系统状况 9.13 Linux编程...

Global site tag (gtag.js) - Google Analytics