`

Linux RAMDisk 源码分析

 
阅读更多

在产品中使用了ramdisk, 看了一部分的源码,分析和共享一下。内核源码2.6.18

安装ramdisk

ramdisk 在linux里面被认为是个内存的块设备,通常以rm0,rm1... 挂在dev下,首先需要格式化块设备成linux的文件系统,然后在将想使用的目录mount 到dev/rm0...下,这样操作目录,在目录里操作文件就在内存里。

ramdisk是一个块设备,需要格式化成linux能认识的文件系统(ext2,ext3),那么对ramdisk的 IO的操作 ,就绕不过page cache,也就是无意中多了一次内存复制。

通常在linux中,由于块设备的随机读写是急剧降低性能的,linux 系统中会有一些合并算法,我们将每次设备的请求认为是一个操作,那么在内核中不会将每一次的请求都提交给块设备,而是在一定的时间内把请求合并成一个队列,然后 调整队列里请求的顺序,尽量让请求(比如块设备中地址相近的)排序在相邻的位置,这样可以提高磁头访问的效率。

最后将队列提交给块设备,相见常用的四种电梯调度算法,就不描述了。


ramdisk是以内存作为访问的块设备,随机访问的速度非常块,调度算法不能提高IO的效率,反而因为合并请求而导致访问性能下降,所以ramdisk没有使用调度算法,在初始化ramdisk的时候,重新设置了queue的调度算法。

drivers/block/rd.c


在函数里rd_make_request,核心就是rd_blkdev_pagecache_IO


a. Grab_Cache_Page

grab_cache_page ->find_or_create_page

address_space *mapping,这是Ramdisk block 的块结构,通过index,可以很块的找到在ramdisk里面的内容(也可以说在默认的ramdisk里块和linux 的页的大小是一致的),而不是在 ext 文件系统中所表示的inode的address_space。

find_or_create_page, 是查找ramdisk里的页的位置,在ramdisk中内容是以页的形式来保存的,如果页面不存在,会生成新的页面,如果页面存在会锁住该页,同时加到lru cache的列表中去。该函数是允许睡眠的,在锁住页面的时候,会等待直到页面的状态位设置成set_bit(PG_locked, &(page)->flags),具体的函数__lock_page实现







分享到:
评论

相关推荐

    inux系统下的ramdisk驱动

    Linux系统下的ramdisk驱动是一种特殊的存储技术,它利用系统的RAM(随机存取内存)作为临时的...通过分析提供的源代码,可以深入理解Linux内核驱动的实现细节,这对于内核开发者和技术爱好者来说是非常宝贵的学习资料。

    linux源码研究与分析

    从Linux源码研究与分析出发,我们可以深入探究其进程调度与控制的实现机制,找出Linux在这些方面的优点和不足。这不仅为后续Linux系统的开发和优化提供了理论基础和技术指导,也为自主知识产权操作系统的开发和研究...

    linux内核源代码

    Linux启动时的初始化过程涉及到内核加载、引导程序、初始化RAMdisk(如果有的话)、设置系统时钟、设备驱动初始化、系统调度器的设置等。这个阶段确保了内核能够正确地与硬件交互并准备运行用户空间程序。 2. **...

    ARM+Linux的移植过程及分析

    对于ARM Linux,源码包可以来自标准Linux内核源码,再打上ARM架构的补丁。这一步骤也可以通过下载已经为ARM架构定制好的内核源码包来完成,如SkyEye提供的源码包。 内核配置和编译环节可能需要根据目标硬件平台对...

    Uboot的源码分析

    【U-Boot源码分析】 U-Boot,全称为Universal Boot Loader,是一个开源项目,遵循GPL条款。它的历史可以追溯到FADSROM、8xxROM和PPCBOOT,经过不断发展和演变,现已成为一个功能强大的启动加载器。U-Boot不仅限于...

    linux code tool

    Linux代码工具是针对Linux内核源码进行分析、调试和优化的重要辅助软件。"Linux code tool"这个标题表明我们讨论的是用于处理Linux内核代码的工具集,这可能包括源码阅读器、静态分析工具、性能监控工具等。在描述中...

    嵌入式Linux系统开发课程大纲

    - **内核引导过程**:分析Linux内核启动时的各个阶段。 - **内核调试方法**:学习内核调试的基本技术。 #### 三、嵌入式Linux平台S3C2440(3小时) - **硬件概述**:介绍S3C2440处理器的主要特点。 - **软件环境...

    S3C2410下Linux系统移植.rar

    其次,需要获取并配置Linux内核源码。S3C2410的Linux内核通常需要从Linux官方网站或者专门的嵌入式分支获取,然后根据S3C2410的硬件特性进行定制化配置,例如选择合适的CPU模型、内存大小、设备驱动等。配置完成后,...

    基于s5pc100平台的linux系统移植

    Linux内核源码按照功能分为多个层级: - **Kernel**:核心代码。 - **arch**:架构相关代码,如ARM架构下的S5PC100平台相关代码。 - **drivers**:所有设备驱动代码。 - **include**:内核头文件,包含体系结构相关...

    嵌入式Linux之我行系列

    - RamDisk块设备驱动实例。 - MMC/SD卡驱动实例。 - Flash驱动实例等。 - **开发实例讲解**: - 分析硬件接口。 - 编写驱动代码。 - 测试驱动功能。 #### 10. 内核通知链机制的原理及实现 - **背景介绍**:...

    嵌入式Linux下串口应用开发.pdf

    本文通过分析嵌入式Linux下的串口应用开发,提供了内核配置、根文件系统构建和串口通信程序设计的实践指南,对于从事嵌入式系统开发的工程师来说,是一份宝贵的参考资料。串口通信在嵌入式Linux系统中的实现,有助于...

    Linux嵌入式BootLoader开发之BLOB_小巧精悍的引导程序

    同时,可以使用 `arm-linux-objdump` 对编译后的二进制文件进行反汇编和分析。 【Blob 的定制】 Blob 的定制主要涉及以下两个方面: 1. **定制目标板的 Blob**:如果现有的 Blob 配置不能满足你的需求,你需要...

    linux 2.4.18补丁

    - 下载 Linux 2.4.18 的源码包以及相应的补丁文件。 - 应用补丁后,配置内核选项并编译。 #### 三、关键技术点 - **USB-to-serial 转换器**:这种设备用于将 USB 接口转换为传统的 RS-232 串行接口,以便与没有...

    嵌入式系统构建linux的移植

    接着,我们需要获取u-boot的源代码,并使用Source Insight这样的源码阅读工具进行分析。编译u-boot涉及到配置文件的修改,以匹配目标硬件的特性,然后执行make命令进行编译。 深入到u-boot的代码分析,我们可以学习...

    Linux 0.11内核完全注释.pdf

    - **目录结构**:对内核源码的组织结构进行了详细介绍,帮助读者快速定位关键代码位置。 - **编译环境**:提供了搭建 Linux 内核编译环境的具体步骤和注意事项。 #### 三、引导启动程序(Boot) - **概述与功能**...

Global site tag (gtag.js) - Google Analytics