`
java-mans
  • 浏览: 11897733 次
文章分类
社区版块
存档分类
最新评论

【Linux交换分区】 交换分区格式浅析

 
阅读更多

完成本文,使用了两个工具

1. strace

2. google code search .

----

  1. swap分区有一个大小为PAGE_SIZE的页面,称为signature页,上面记录swap分区的基本信息。
    static struct swap_header_v1 {
    char bootbits[1024]; /* Space for disklabel etc. */
    unsigned int version;
    unsigned int last_page;
    unsigned int nr_badpages;
    unsigned int padding[125];
    unsigned int badpages[1];
    } *p;
  2. check_blocks()会 对整个文件进行一次顺序读,在v1生成一个磁盘块“好块”和“坏块”的位图。在v2中,“好块”无需记录,只记录坏块。一个磁盘的坏块一般来说极少,为了 节省空间,因此记录方法不再是位图,改而用数组的方式。
    p->badpages[badpages] = page; // page为坏块号

    这里需要注意的是,在 swap_header_v1的定义中,p->badpages数组大小为1,这里实际上产生了越界。但是,从C语言的知识我们知道,即使越界,只 要编译器没有检测出来,并且实际访问的“越界区”是我们可访问的区域,则不会有任何问题。上面这句代码是一种“可控的、有意识的越界”。可控的边界在哪里 呢?

    #define MAX_BADPAGES    ((pagesize-1024-128*sizeof(int)-10)/sizeof(int))  // 637 bad pages over i386
    结合swap_header_v1的定义,上面的公式不难理解 bootbits占1024字节,随后4个变量分别占4、4、4、4*125字节,SIGNATURE占10字节,剩余的都给badpages了。超过了 MAX_BADPAGES,则会引发越界访问。
  3. swap 分区格式有两个版本,姑且称为v0和v1,版本可以在命令行中指定,如果缺省,则mkswap根据swap分区设备/文件大小自动设定。
    write_signature((version == 0) ? "SWAP-SPACE" : "SWAPSPACE2");
  4. 通过上述步骤,signature页的内容都被初始化好 了,现在写回到块设备中去:
            offset = ((version == 0) ? 0 : 1024);
    if (lseek(DEV, offset, SEEK_SET) != offset)
    error_msg_and_die("unable to rewind swap-device");
    if (write(DEV, (char *) signature_page + offset, pagesize - offset)
    != pagesize - offset)
    error_msg_and_die("unable to write signature page");
    对于v0,signature页被写到设备头,对于 v1,signature页被写到偏移为1024字节处。

附mkswap源码

---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----

Ray的生活博客: http://raywill.blog.sohu.com

---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----

分享到:
评论

相关推荐

    浅析Linux中的共享内存机制.pdf

    浅析Linux中的共享内存机制.pdf

    Linux内核配置系统浅析

    ### Linux内核配置系统浅析 #### 一、配置系统的重要性及基本结构 随着Linux操作系统在各个领域的广泛应用,尤其是在嵌入式系统领域的迅速发展,越来越多的技术人员投身于Linux内核级别的开发工作。对于这些开发者...

    浅析Linux系统下分区设备挂接问题.pdf

    【Linux系统下分区设备挂接问题详解】 在Linux操作系统中,挂接(Mount)是将一个文件系统连接到已存在的目录结构上的过程,使得用户能够访问该文件系统中的数据。Linux系统,作为开源且高度可定制的操作系统,以其...

    Linux设备模型浅析之驱动篇.pdf

    Linux设备模型浅析之驱动篇.pdf

    Linux内核bridge浅析

    本文将深入浅析Linux内核bridge的工作原理、功能及其在实际应用中的重要性。 首先,Linux桥接功能是Linux内核提供的一种网络层设备,它允许将多个网络接口(如以太网卡、虚拟接口等)连接在一起,形成一个逻辑上的...

    浅析Linux虚拟化技术.pdf

    浅析Linux虚拟化技术 Linux虚拟化技术是当今计算机及网络领域的热门技术方向之一,能够为用户屏蔽计算机底层异构系统的复杂性,带给用户操作及管理计算机系统上的极大方便性,并降低企业的信息化成本。Linux作为...

    浅析Linux文件系统管理.pdf

    `fdisk`是Linux中的分区管理工具,可以创建、删除和修改硬盘分区表。它通过交互式界面操作,确保分区表的一致性。 2.3 磁盘空间管理 监控磁盘空间使用情况通常使用`df`命令,而检查单个文件或目录占用空间的工具是...

    浅析Linux邮件服务器配置.pdf

    本文将深入浅析 Linux 邮件服务器的配置,涵盖了 Linux 操作系统、电子邮件系统、SMTP、POP、Sendmail 等关键概念。Linux 操作系统作为开源操作系统之一,具有性能稳定、可靠性高和价格低廉等特点,非常适合作为邮件...

    浅析Linux文件系统.pdf

    "浅析Linux文件系统.pdf" 本文将对Linux文件系统进行详细分析,着重对Ext2文件系统进行分析,并阐述了虚拟文件系统对多种文件系统的支持。 Linux文件系统是操作系统的重要组成部分,它的优秀特性更是广泛公认的。...

    浅析Linux虚拟化技术

    ### 浅析Linux虚拟化技术 #### 一、引言 随着信息技术的迅猛发展,海量信息的管理和存储成为企业和个人面临的重大挑战。虚拟化技术作为一种高效管理资源的方式,逐渐受到广泛关注。尤其对于Linux操作系统而言,因...

    浅析Linux之信号-信号列表

    浅析Linux之信号-信号列表

    Linux嵌入式应用浅析.pdf

    Linux嵌入式应用浅析.pdf

    浅析Linux的防火墙技术.pdf

    浅析Linux的防火墙技术.pdf

    浅析Linux系统FTP服务器的安全问题.pdf

    浅析Linux系统FTP服务器的安全问题.pdf

    Linux IP伪装功能浅析.pdf

    Linux IP伪装功能浅析.pdf

    Linux内核bridge浅析.doc

    "Linux内核bridge浅析" Linux内核bridge浅析是Linux操作系统中的一种网桥模型,用于连接和桥接多个以太网接口设备。下面是对Linux内核bridge浅析的详细说明: 网桥模型 Linux内核通过一个虚拟的网桥设备来实现...

    浅析Linux的文件系统和磁盘管理.pdf

    浅析Linux的文件系统和磁盘管理 Linux操作系统的文件系统是存储和管理文件的方法,所有的软硬件资源全部看做文件。文件系统是操作系统的基本结构,因几乎所有与用户、应用程序或安全性模型的沟通方法都与文件保存的...

    浅析嵌入式Linux.pdf

    《浅析嵌入式Linux》这篇技术文章主要探讨了嵌入式Linux在现代技术领域中的应用和优势。文章首先简要介绍了嵌入式系统的基本概念,随后深入剖析了嵌入式Linux的特点,并与其它嵌入式操作系统进行了对比,最后讨论了...

Global site tag (gtag.js) - Google Analytics