博文

[ZT]Linux 关于地址空间和MMAP映射(2007-11-01 10:17:00)

摘要:笔记原创: 兰特
联系邮件: epost_guo@126.com

参考资料:
1. Linux Device Drivers, Second Edition, Alessandro
2. Linux kernel development, second edition, Robert Love

进程地址空间 Linux采用虚拟内存技术,系统中的所有进程之间以虚拟方式共享内存。对每个进程来说,它们好像都可以访问整个系统的所有物理内存。更重要的是,即使单独一个进程,它拥有的地址空间也可以远远大于系统物理内存。        进程地址空间由每个进程中的线性地址区组成,每个进程都有一个32位或64位的平坦(flat)空间,空间的具体大小取决于体系结构。“平坦”指地址空间范围是一个独立的连续区间。通常情况下,每个进程都有唯一的这种平坦空间,而且每个进程的地址空间之间彼此互不相干。两个不同的进程可以在它们各自地址空间的相同地址内存存放不同的数据。但是进程之间也可以选择共享地址空间,我们称这样的进程为线程。        在地址空间中,我们更为关心的是进程有权访问的虚拟内存地址区间,比如08048000~0804c000。这些可被访问的合法地址区间被成为内存区域(memory area),通过内核,进程可以给自己的地址空间动态地添加或减少内存区域。        进程只能访问有效范围内的内存地址。每个内存区域也具有相应进程必须遵循的特定访问属性,如只读、只写、可执行等属性。如果一个进程访问了不在有效范围中的地址,或以不正确的方式访问有效地址,那么内核就会终止该进程,并返回“段错误”信息。 <!--[if !supportLists]-->²        <!--[endif]-->内存区域可以包含各种内存对象,如下: <!--[if !supportLists]-->²   &nbs......

阅读全文(6906) | 评论:0

Linux 32位处理器下地址转换 (1)(2007-10-07 20:16:00)

摘要:Linux 32位处理器下地址转换     1.   物理地址结构 物理内存(主存)结构如下:   内存管理按页帧管理,一页大小一般在正常情况(PSE=0)下为4KB,     在LINUX系统中定义宏: #define page_size  4096 #define page _shift 12      由于线性地址只有4G(32b),所以最多只能直接映射4G的物理地址,然而实际的物理内存可能远比4G大,因此有限的线性地址如何去映射产生了问题?!           2.   线性地址 实际在Linux中线性地址以0XC000 0000(3G)为分界线做了如下划分:     小于3G的线性地址用户模式和内核模式下都能访问或使用,但3G以上的地址空间只能在内核模式下直接使用。而且对于内存的管理是由内核来负责的,并只使用第3G来完成。同时前896MB线性地址直接映射物理内存的前896MB,后128MB的线性地址用来动态映射剩余的物理地址,最终实现使用1G的线性地址来映射大于1G的物理内存。对于前896MB由于是用直接映射来实现,所以系统定义了一些宏来简单的实现地址的转换:   #define PAGE_OFFSET  0xC000 0000   Linear Address = __va(physical address ) = physical address + PAGE_OFFSET Physical Address = __pa(Linear address ) = Linear address - PAGE_OFFSET          对于后128MB线性地址到底映射到物理内存的那个位置,则需要建立一些映像关系,具体可分为:永久映射,临时映射和非连续性物理内存映射。 3.   物理页帧 实际对于物理内存的管理是按照页帧来管理的,由于页的大小是相同的,所......

阅读全文(3115) | 评论:2