完成本文,使用了两个工具
1. strace
2. google code search
.
----
- 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;
- 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,则会引发越界访问。
- swap
分区格式有两个版本,姑且称为v0和v1,版本可以在命令行中指定,如果缺省,则mkswap根据swap分区设备/文件大小自动设定。
write_signature((version == 0) ? "SWAP-SPACE" : "SWAPSPACE2");
- 通过上述步骤,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内核配置系统浅析 #### 一、配置系统的重要性及基本结构 随着Linux操作系统在各个领域的广泛应用,尤其是在嵌入式系统领域的迅速发展,越来越多的技术人员投身于Linux内核级别的开发工作。对于这些开发者...
【Linux系统下分区设备挂接问题详解】 在Linux操作系统中,挂接(Mount)是将一个文件系统连接到已存在的目录结构上的过程,使得用户能够访问该文件系统中的数据。Linux系统,作为开源且高度可定制的操作系统,以其...
Linux设备模型浅析之驱动篇.pdf
本文将深入浅析Linux内核bridge的工作原理、功能及其在实际应用中的重要性。 首先,Linux桥接功能是Linux内核提供的一种网络层设备,它允许将多个网络接口(如以太网卡、虚拟接口等)连接在一起,形成一个逻辑上的...
浅析Linux虚拟化技术 Linux虚拟化技术是当今计算机及网络领域的热门技术方向之一,能够为用户屏蔽计算机底层异构系统的复杂性,带给用户操作及管理计算机系统上的极大方便性,并降低企业的信息化成本。Linux作为...
`fdisk`是Linux中的分区管理工具,可以创建、删除和修改硬盘分区表。它通过交互式界面操作,确保分区表的一致性。 2.3 磁盘空间管理 监控磁盘空间使用情况通常使用`df`命令,而检查单个文件或目录占用空间的工具是...
本文将深入浅析 Linux 邮件服务器的配置,涵盖了 Linux 操作系统、电子邮件系统、SMTP、POP、Sendmail 等关键概念。Linux 操作系统作为开源操作系统之一,具有性能稳定、可靠性高和价格低廉等特点,非常适合作为邮件...
"浅析Linux文件系统.pdf" 本文将对Linux文件系统进行详细分析,着重对Ext2文件系统进行分析,并阐述了虚拟文件系统对多种文件系统的支持。 Linux文件系统是操作系统的重要组成部分,它的优秀特性更是广泛公认的。...
### 浅析Linux虚拟化技术 #### 一、引言 随着信息技术的迅猛发展,海量信息的管理和存储成为企业和个人面临的重大挑战。虚拟化技术作为一种高效管理资源的方式,逐渐受到广泛关注。尤其对于Linux操作系统而言,因...
浅析Linux之信号-信号列表
Linux嵌入式应用浅析.pdf
浅析Linux的防火墙技术.pdf
浅析Linux系统FTP服务器的安全问题.pdf
Linux IP伪装功能浅析.pdf
"Linux内核bridge浅析" Linux内核bridge浅析是Linux操作系统中的一种网桥模型,用于连接和桥接多个以太网接口设备。下面是对Linux内核bridge浅析的详细说明: 网桥模型 Linux内核通过一个虚拟的网桥设备来实现...
浅析Linux的文件系统和磁盘管理 Linux操作系统的文件系统是存储和管理文件的方法,所有的软硬件资源全部看做文件。文件系统是操作系统的基本结构,因几乎所有与用户、应用程序或安全性模型的沟通方法都与文件保存的...
《浅析嵌入式Linux》这篇技术文章主要探讨了嵌入式Linux在现代技术领域中的应用和优势。文章首先简要介绍了嵌入式系统的基本概念,随后深入剖析了嵌入式Linux的特点,并与其它嵌入式操作系统进行了对比,最后讨论了...