【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
相关文档:
1. 基本概念
消息队列的最佳定义是:内核地址空间中的内部链表。消息可以顺序地发送到队列中,
并以几种不同的方式从队列中获取。当然,每个消息队列都是由 IPC标识符所唯一标识的。
2. 内部和用户数据结构
要完成理解象系统 V IPC这样复杂的问题,关键是要彻底熟悉内核的几个内部数据结构。
甚至对那些最基本的操作 ......
原文链接:http://blog.csdn.net/ecjtuync/archive/2008/10/23/3132789.aspx
Linux静态/动态链接库的创建和使用
和Windows系统一样Linux也有静态/动态链接库,下面介绍创建和使用方法:
假设有下面几个文件:
头文件String.h,声明相关函数原形,内容如下:
Strlen.c:函数Strlen的实现,获取给定字符串的长度,内容如 ......
config.h
/*--
Copyright (c) 2004 Shenzhen Huaren Education Co.Ltd
File Name:
config.h
Ver ......
、Linux里查看所有用户
linux里,并没有像windows的net user,net localgroup这些方便的命令来治理用户.
Xwindows界面的就不说了.
(1)在终端里.其实只需要查看 /etc/passwd文件就行了.
(2)看第三个参数:500以上的,就是后面建的用户了.其它则为系统的用户.
或者用cat /etc/passwd |cut -f 1 -d : ......
Fedora 下是有/etc/inittab文件的,而在Ubuntu中是没有这一个文件的,因为在ubuntu中,inittab软件包已经被upstart软件包替换了,所有的配置信息都在/etc/event.d/目录下。inittab文件在inittab里面这样描述的,This inittab file describes how the INIT process should set up the system in a certain run-level.即在lin ......