【Linux交换分区】 交换分区格式浅析
完成本文,使用了两个工具
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,s
相关文档:
Linux 和 Unix 文件系统被组织成一个有层次的树形结构。文件系统的最上层是 /,或称为 根目录。在 Unix 和 Linux 的设计理念中,一切皆为文件——包括硬盘、分区和可插拔介质。这就意味着所有其它文件和目录(包括其它硬盘和分区)都位于根目录中。 例如:/home/jebediah/cheeses.odt 给出了正确的完整路径,它指 ......
LINUX KERNEL VERSIONS SUPPORTED.
DOCUMENT DATE: May 10, 2010
This document lists the exact versions of Linux kernels supported by
DoubleVision Pro.
Due to subtle differences from one Linux kernel to another, a different
DoubleVision Pro driver is required. If your Linux kernel is not supported
......
首先,请安装驱动,我的显卡是nvidia fx5600,源里面就有驱动,直接安装就是。
代码:
sudo apt-get install nvidia-glx nvidia-settings
sudo cp /etc/X11/xorg.conf /etc/X11/xorg.conf_backup
sudo nvidia-glx-config enable
然后
代码:
Ctrl + Alt + backspace
重启X
建议不要把nvidia的logo去掉,至少在第一 ......
在阅读GNU/Linux内核代码时,我们会遇到一种特殊的结构初始化方式。该方式是某些C教材(如谭二版、K&R二版)中没有介绍过的。这种方式称为指定初始化(designated initializer)。下面我们看一个例子,Linux-2.6.x/drivers/usb/storage/usb.c中有这样一个结构体初始化项目:
static struct usb_driver usb_storage_dri ......