2011年12月31日

Linux内存管理

摘要: 本文转自:http://www.kerneltravel.net/journal/v/mem.htm摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理,在此基础上逐步深入到内核中讨论系统物理内存管理和内核内存的使用方法。力求从外到内、水到渠成地引导网友分析Linux的内存管理与使用。在本章最后,我们给出一个内存映射的实例,帮助网友们理解内核内存管理与用户内存管理之间的关系,希望大家最终能驾驭Linux内存管理。前言内存管理一向是所有操作系统书籍不惜笔墨重点讨论的内容,无论市面上或是网上都充斥着大量涉及内存管理的教材和资料。因此,我们这里所要写的Linux内存管理采取避重就轻的策略 阅读全文

posted @ 2011-12-31 19:32 _huanonly范特西 阅读(363) 评论(0) 推荐(0) 编辑

Linux的内核空间和用户空间是如何划分的(以32位系统为例)?

摘要: Linux将4G的地址划分为用户空间和内核空间两部分。在Linux内核的低版本中(2.0.X),通常0-3G为用户空间,3G-4G为内核空间。这个分界点是可以改动的。 正是这个分界点的存在,限制了Linux可用的最大内存为2G.而且要通过重编内核,调整这个分界点才能达到。实际上还可以有更好的方法来解决这个问题。由于内核空间与用户空间互不重合,所以可以用段机制提供的保护功能来保护内核级代码。 2.2.X版的内核对此进行了改动。这样内核空间扩张到了4G。从表面上看内核的基地址变为了0,但实际上,内核通常仍在虚址3G以上。 用户空间在2.2.X中从直观上变为0-4G,让人迷惑,不是可以直接访问内.. 阅读全文

posted @ 2011-12-31 19:26 _huanonly范特西 阅读(824) 评论(0) 推荐(1) 编辑

通过slab分配器申请内核内存的函数有?

摘要: 以页为最小单位分配内存对于内核管理系统中的物理内存来说的确比较方便,但内核自身最常使用 的内存却往往是很小(远远小于一页)的内存块——比如存放文件描述符、进程描述符、虚拟内存区域描述符等行为所需的内存都不足一页。这些用来存放描述符的 内存相比页面而言,就好比是面包屑与面包。一个整页中可以聚集多个这些小块内存;而且这些小块内存块也和面包屑一样频繁地生成/销毁。 为了满足内核对这种小内存块的需要,Linux系统采用了一种被称为slab分配器的技术。Slab分配器的实现相当复杂,但原理不难,其核心思想就是“存储池”的运用。内存片段(小块内存)被看作对象,当被使用完后,并不直接释放而是被缓存到“存.. 阅读全文

posted @ 2011-12-31 19:19 _huanonly范特西 阅读(875) 评论(0) 推荐(0) 编辑

2011年12月30日

通过伙伴系统申请内核内存的函数有哪些?

摘要: 本文转自:http://blog.chinaunix.net/space.php?uid=22566367&do=blog&id=2747207在物理页面管理上实现了基于区的伙伴系统(zone based buddy system)。对不同区的内存使用单独的伙伴系统(buddy system)管理,而且独立地监控空闲页。相应接口alloc_pages(gfp_mask, order),_ _get_free_pages(gfp_mask, order)等。补充知识:1.原理说明 Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足 阅读全文

posted @ 2011-12-30 15:28 _huanonly范特西 阅读(617) 评论(0) 推荐(0) 编辑

用户进程间有哪几种通信方式

摘要: 本文转自:http://blog.chinaunix.net/space.php?uid=22566367&do=blog&id=2747207(1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。(2)命名管道(named pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。(3)信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于 阅读全文

posted @ 2011-12-30 15:15 _huanonly范特西 阅读(539) 评论(0) 推荐(0) 编辑

怎样申请大块内核内存

摘要: 在Linux内核环境下,申请大块内存的成功率随着系统运行时间的增加而减少,虽然可以通过vmalloc系列调用申请物理不连续但虚拟地址连续的内存,但毕竟其使用效率不高且在32位系统上vmalloc的内存地址空间有限。所以,一般的建议是在系统启动阶段申请大块内存,但是其成功的概率也只是比较高而已,而不是100%。如果程序真的比较在意这个申请的成功与否,只能退用“启动内存”(Boot Memory)。下面就是申请并导出启动内存的一段示例代码: 1 void* x_bootmem = NULL; 2 EXPORT_SYMBOL(x_bootmem); 3 4 unsigned long x_boot. 阅读全文

posted @ 2011-12-30 15:13 _huanonly范特西 阅读(795) 评论(0) 推荐(0) 编辑

linux的内核模式和用户模式各是什么含义

摘要: linux中内核本身处于内核模式,应用程序处于用户模式。 内核模式的代码可以无限制地访问所有处理器指令集以及全部内存和I/O空间。如果用户模式的进程要享有此特权,它必须通过系统调用向设备驱动程序或其他内核模式的代码发出请求。另外,用户模式的代码允许发生缺页,而内核模式的代码则不允许。 在2.4和更早的内核中,仅仅用户模式的进程可以被上下文切换出局,由其他进程抢占。除非发生以下两种情况,否则内核模式代码可以一直独占CPU:(1)它自愿放弃CPU;(2)发生中断或异常。2.6内核引入了内核抢占,大多数内核模式的代码也可以被抢占。 阅读全文

posted @ 2011-12-30 15:06 _huanonly范特西 阅读(2364) 评论(0) 推荐(0) 编辑

linux内核中主要有哪几种锁

摘要: Linux的同步机制从2.0到2.6以来不断发展完善。从最初的原子操作,到后来的信号量,从大内核锁到今天的自旋锁。这些同步机制的发展伴随Linux从单处理器到对称多处理器的过渡;伴随着从非抢占内核到抢占内核的过度。Linux的锁机制越来越有效,也越来越复杂。 Linux的内核锁主要是自旋锁和信号量。 自旋锁最多只能被一个可执行线程持有,如果一个执行线程试图请求一个已被争用(已经被持有)的自旋锁,那么这个线程就会一直进行忙循环——旋转——等待锁重新可用。要是锁未被争用,请求它的执行线程便能立刻得到它并且继续进行。自旋锁可以在任何时刻防止多于一个的执行线程同时进入临界区。 Linu... 阅读全文

posted @ 2011-12-30 14:59 _huanonly范特西 阅读(2829) 评论(0) 推荐(0) 编辑

linux内核工程师必须知道的三十道题

摘要: 1) Linux中主要有哪几种内核锁?2) Linux中的用户模式和内核模式是什么含意?3) 怎样申请大块内核内存?4) 用户进程间通信主要哪几种方式?5) 通过伙伴系统申请内核内存的函数有哪些?6) 通过slab分配器申请内核内存的函数有?7) Linux的内核空间和用户空间是如何划分的(以32位系统为例)?8) vmalloc()申请的内存有什么特点?9) 用户程序使用malloc()申请到的内存空间在什么范围?10) 在支持并使能MMU的系统中,Linux内核和用户程序分别运行在物理地址模式还是虚拟地址模式?11) ARM处理器是通过几级也表进行存储空间映射的?12) Linux是通过什 阅读全文

posted @ 2011-12-30 14:38 _huanonly范特西 阅读(424) 评论(0) 推荐(1) 编辑

导航