Linux Kernel
文章平均质量分 74
kickxxx
这个作者很懒,什么都没留下…
展开
-
lowmem_reserve的理解
2.6内核的zone结构中一个成员变量 lowmem_reservestruct zone { /* Fields commonly accessed by the page allocator */ /* zone watermarks, access with *_wmark_pages(zone) macros */ unsigned long watermar原创 2013-04-22 18:23:14 · 9861 阅读 · 0 评论 -
进程地址空间 - 数据结构
TBD原创 2013-07-17 13:49:47 · 2318 阅读 · 0 评论 -
进程地址空间 - 堆管理
TBD原创 2013-07-17 19:50:24 · 2179 阅读 · 0 评论 -
避免物理内存碎片化 - ZONE_MOVABLE
在2.6.20-rc4中,mel Gorman提交了的patch引入了ZONE_MOVABLE,引入这个pseudo zone的目的是为了防止zone内存碎片化ZONE_MOVABLE表示这个zone仅能被带有__GFP_HIGHMEM和__GFP_MOVABLE标志的分配使用。这就使得所有non-movable页面都限制在单一的内存区,而movable的分配则由其他的内存区满足。Mo翻译 2013-03-26 17:16:57 · 3633 阅读 · 0 评论 -
Linux 进程地址空间 - 简介
TBD原创 2013-07-17 13:49:30 · 2244 阅读 · 0 评论 -
进程地址空间 - 内存区操作
TBD原创 2013-07-17 19:47:30 · 1192 阅读 · 0 评论 -
内核分配不连续页 - vmalloc
当buddy系统还有大量的连续物理内存时,我们可以通过__pages_alloc成功分配很大的一块连续物理内存空间,随着系统运行时间加长,buddy系统内很难中找到一块大的连续物理内存空间,因此__pages_alloc可能会失败,即便通过kswapd进行页面的回收和交换,buddy仍然不可避免的碎片化首先我们要明确的是,连续物理内存的分配并不是必要的。对于大部分DMA操作,我们的确需原创 2013-07-14 11:42:09 · 8959 阅读 · 0 评论 -
进程地址空间 - page fault处理
TBD原创 2013-07-17 19:48:04 · 1445 阅读 · 0 评论 -
Linux Fixmap 的作用
Fixmaps是内核(虚拟)地址空间地址固定的映射到物理内存,同DMA/Normal zone物理内存的直接地址映射有点类似。但是4GB开始部分的直接地址映射是线性的,也就是说物理地址和线性映射地址间存在着计算公式paddr = vaddr - PAGE_OFFSET;而固定地址映射则可以映射任意的物理地址,包括DMA Normal Highmem。Fixmaps的存在意义每个原创 2013-03-28 07:25:46 · 4674 阅读 · 0 评论 -
Linux Highmem的使用
Linux kernel zone有如下类型:ZONE_DMA, ZONE_NORMAL和ZONE_HIGHMEM。每一种zone类型适合不同的使用类型:ZONE_DMA是低端物理内存范围适合于ISA设备的请求,ZONE_DMA的物理页框映射到kernel线性地址空间。ZONE_NORMAL则被直接映射到kernel线性地址空间,常见的内核操作都发生在ZONE_NORMAL。ZON原创 2013-02-20 17:19:14 · 6915 阅读 · 1 评论 -
内核映射 - 持久内核映射
持久内核映射 permanent kernel mappings内核提供了其他函数用于把Highmem内存映射到内核地址空间:持久内核映射和临时内核映射。而这些函数和vmalloc无关。因此网络上对持久内核映射和临时内核映射的理解非常的混乱持久内核映射允许内核建立高端物理内存帧到内核地址空间的长期映射。和其他kernel地址空间一样,持久内核映射使用kernel一个pte页表来原创 2013-07-14 17:32:21 · 2900 阅读 · 2 评论 -
伙伴系统分配器 - __free_pages
内核中所有涉及到页面释放的函数最终都会调用到__free_pages原创 2013-07-13 16:08:24 · 2877 阅读 · 1 评论 -
伙伴系统分配器 - buffered_rmqueue
在__alloc_pages过程中,操作分为两个部分,第一部分是找到适当的内存域,接下来的一部分就是按照伙伴系统的分配方式,从free_lists中移除这些页。buffered_rmqueue就是用来完成第二部分工作的。1. 首先判断要分配的页面数是否为 1,如果为1 的情况下,那么并不需要从buddy系统获取,因为per-CPU的页缓存提供了更快的分配和释放机制。per-CPU cach原创 2013-07-12 10:33:21 · 3394 阅读 · 0 评论 -
伙伴系统分配器 - __alloc_pages
kernel可以通过几个分配函数从伙伴系统分配页面:alloc_pagesget_zeroed_pageget_dma_pages这几个函数都是通过alloc_pages来实现页面分配的,而alloc_pages的核心实现就是__alloc_pages。alloc_pages在gfp.h中定义#define alloc_pages(gfp_mask, ord原创 2013-07-10 10:14:10 · 6806 阅读 · 0 评论 -
内存管理中的cold page和hot page, 冷页 vs 热页
所谓冷热是针对处理器cache来说的,冷就是页不大可能在cache中,热就是有很大几率在cache中。网上还有一种说法:冷页就是冷的页,热页就是热点的页,解释的真好 :)cold page和hot page的概念可以参考LWN的一片文章http://lwn.net/Articles/14768/2.5.45内核,Martin Bligh和Andrew Morton以及其他人提交翻译 2013-07-12 09:46:03 · 5079 阅读 · 1 评论 -
伙伴系统分配器 分配掩码
kernel伙伴系统分配的函数,只能分配2的整数幂个页,更细力度的分配只能借助与slab或者slub分配器常见的分配函数是:alloc_pages(mask, order) 分配2的order幂次个页面,如果成功返回第一个页框对应的page结构,失败则返回NULLget_zeroed_page(mask)分配一个页面,成功则返回这个页框对应的page结构,失败返回NUL原创 2013-07-09 19:06:38 · 1981 阅读 · 0 评论 -
进程地址空间 - 辅助函数分析
TBD原创 2013-07-17 15:51:42 · 1295 阅读 · 0 评论 -
Linux mmap内存映射
Linux系统调用mmap和mmap2,创建一个进程地址空间的映射,mmap/mmap2几个常用的场景:1. 文件映射普通文件I/O操作,读写mmap映射后的内存,即可完成文件的读写操作,kernel和userspace操作同一块物理内存;而常规的文件读写,需要循环调用read write lseek接口,每一次读写都需要kernel到userspace,或者userspace到kernel的原创 2013-04-03 14:10:16 · 4295 阅读 · 0 评论 -
linux 内存管理中的PG_Compound和GFP_COMP
当__alloc_pages分配的gfp_flags制定了__GFP_COMP,那么内核必须将这些页组合成复合页compound page。第一个页称为head page,其余所有的页称为tail page。复合页的尺寸要远大于当前分页系统支持的页面大小。并且一定是2^order * PAGE_SIZE大小。复合页主要用在HugeTLB相关的代码。复合页的引入是因为随着计算机物理内存容量不断增原创 2013-07-13 11:38:14 · 4331 阅读 · 0 评论 -
QSPI nor flash相关驱动代码
QSPI nor flash drvier原创 2017-03-31 17:45:23 · 8040 阅读 · 1 评论 -
printk 输出函数调用栈的方法
有时在linux kernel过程中, 想知道当前函数的调用者是谁, 一直没查到内这个功能, 今天终于发现了这个好东西void * __init memblock_virt_alloc_try_nid_nopanic( phys_addr_t size, phys_addr_t align, phys_addr_t min_a原创 2017-01-23 14:22:52 · 3063 阅读 · 0 评论 -
Out of memory, OOM killer输出信息分析
当out of memory发生时,out_of_memory函数会选择一个内核认为犯有分配过多内存 “罪行”的进程,并杀死该进程。这就有很大的几率腾出较多的空闲页,然后再跳转回重试内存分配的操作。这里我们不讨论out_of_memory的:1. 函数流程2. 选择要牺牲进程的策略方法。我们仅讨论out of memory发生时,内核输出信息的含义。以下是一段典型的ou原创 2015-12-17 10:42:54 · 20767 阅读 · 1 评论 -
Linux 文件系统 - Ext4 Howto
去年就发现项目Android系统中已经用上了Ext4文件系统,当时并没有深究为什么要使用Ext4文件系统,使用ext4带来的优点和缺点。最近有时间,正好整理下Ext4对于Ext2/Ext3带来的变化。网上关于Ext4的文章并不多,只找到了来自http://kernelnewbies.org/Ext4/的Ext4 Howto,是一篇概括性的文章。1. 介绍Ext4是Linux操作转载 2013-07-29 10:14:12 · 7208 阅读 · 0 评论 -
Linux EMMC子系统分析-初始化流程
最近在解EMMC的一个bug,发现Linux EMMC有点小复杂,先整理个文档出来吧用的是TI 平台,仅分析MMC,不分析SD和SDIO1初始化1.1mmc_init2769 static int __init mmc_init(void)2770 {2774 2775 workqueue = alloc_ordered_workqueue("kmmcd",原创 2016-04-12 13:04:53 · 13420 阅读 · 0 评论 -
EMMC子系统分析-读写流程
EMMC read/write流程原创 2016-04-22 10:21:21 · 9362 阅读 · 0 评论 -
伙伴系统分配器 - PF_MEMALLOC 标志位
这是一个进程标记位,除了在内存管理子系统中使用外,还在其他的内核子系统中使用。之所以在伙伴系统分配器中讨论,是因为这个标记和内存管理密不可分。当一个进程被设置PF_MEMALLOC后,那么对进程会有如下影响:1. 当进程进行页面分配时,可以忽略内存管理的水印进行分配,这是告诉内存管理系统,给我一点紧急内存使用,我将会释放更多的内存给你。2. 如果忽略水印分配仍然失败,那么直接返回ENO原创 2013-07-11 20:15:51 · 6753 阅读 · 2 评论 -
内核线程和普通进程的区别
内核线程的主要作用1. 周期性的将dirty内存页同步到磁盘设备上。 比如 bpflush线程周期性的把dirty数据写回磁盘2. 内存页很少的情况下,把内存page 交换到磁盘空间。 比如kswapd,系统会为每一个NUMA创建一个kswapd进程,但是在非NUMA系统上,则仅有一个kswapd3. 管理延时动作4. 实现文件系统的事物日志有两种类型的线程:原创 2013-07-01 11:03:03 · 4482 阅读 · 0 评论 -
pdflush 几个参数的含义
参考3.4内核文档pdflush是Linux 内核的数据同步机制,系统通常会有多个pdflush内核线程存在,当前没有研究内核线程的数目是由什么决定的。系统内脏页积累到一定程度,或者系统需要释放脏页占用的内存时,需要把脏页中的数据写回磁盘,这个写回机制由内核线程pdflush实现。pdflush受多个控制参数控制,分别是:dirty_background_bytesdi翻译 2014-12-15 11:49:52 · 3139 阅读 · 0 评论 -
v4l2_field理解
video的帧可区分为隔行和逐行: 逐行顺序的传输一帧所有的行,而隔行则把一帧划分成两个fields,分别保存帧的奇数行和偶数行,被称作奇场和偶场. 阴极射线电视机需要交替的显示两场来组成一个完整的帧,交替的时延需要我们交替的传输奇场和偶场。这个奇怪技术的引入是因为:在刷新率接近电影时,图片会消退的过快。使用奇偶场可以避免使用双倍的buffer以及额外的带宽需求。 首先要明确camera翻译 2011-04-27 18:35:00 · 18090 阅读 · 4 评论 -
理解linux虚拟文件系统VFS - 路径查找 path_lookup
VFS的一个主要操作,是给定一个文件名,获取该文件名的inode。路径查找是VFS中相当繁琐的一部分,主要是符号链接,文件系统装载点,已经. ..和//等奇怪路径带来了一些额外处理。nameidata数据结构查找过程涉及到很多函数调用,在这些调用过程中,nameidata起到了很重要的作用:1. 向查找函数传递参数;2. 保存查找结果。struct nameidata {原创 2013-07-27 16:06:50 · 10863 阅读 · 1 评论 -
Linux 进程调度
CFS调度器传统的调度器使用时间片的概念,对系统中的进程分别计算时间片,使得进程运行至时间片结束。在所有的进程时间片都以用尽后,重新计算时间片。而CFS调度器完全摒弃了时间片,会重点考虑进程的等待时间。CFS调度器的目的是,向系统中每个激活的进程提供最大的公正性,或者说确保没有进程被亏待。CFS引入了虚拟时钟的概念,该时钟的流逝速度小于实时时钟,精确的速度依赖于当前等待翻译 2013-07-30 17:32:56 · 1873 阅读 · 0 评论 -
linux进程调度 - 周期性调度器
周期性调度器是在scheduler_tick中实现。如果系统正在活动中,内核会按照频率HZ自动调用该函数。如果没有进程在等待调度,那么在计算机电力供应不足的情况下,也可以关闭该调度器以减少电能消耗。3469 /*3470 * This function gets called by the timer code, with HZ frequency.3471 * We call i原创 2013-08-02 16:14:32 · 2917 阅读 · 0 评论 -
理解linux虚拟文件系统VFS - 数据结构
file_system_type1406 struct file_system_type {1407 const char *name;1408 int fs_flags;1409 int (*get_sb) (struct file_system_type *, int,1410 const原创 2013-07-25 17:24:00 · 4852 阅读 · 0 评论 -
linux进程调度 - cpu进程负载均衡
当某个cpu负载过轻而其他的cpu负载过重时,系统会把进程从较重负载cpu迁移到负载较轻的cpu上原创 2013-08-02 16:13:01 · 2515 阅读 · 0 评论 -
存储器层次结构 - cache基本原理
局部性原理局部性原理表明了在任何时间内,程序访问的只是地址空间相对较小的一部分内容。以下是两种类型的局部性:时间局部性如果某个数据被访问,那么在不久的将来它可能再一次的被访问。例如大多数程序都包好了循环结构,因此这部分指令和数据将被重复的访问,呈现出了很高的时间局部性。空间局部性如果某个数据项被访问,与他地址相邻的数据项可能很快被访问。由于程序通常是顺序执行的,因此程序也呈现了翻译 2013-05-27 15:43:48 · 4130 阅读 · 0 评论 -
Linux kernel和TLB
TLB - translation lookaside buffer快表,直译为旁路快表缓冲,也可以理解为页表缓冲,地址变换高速缓存。由于页表存放在主存中,因此程序每次访存至少需要两次:一次访存获取物理地址,第二次访存才获得数据。提高访存性能的关键在于依靠页表的访问局部性。当一个转换的虚拟页号被使用时,它可能在不久的将来再次被使用到,。TLB是一种高速缓存,内存管理硬件使用它来改善原创 2013-03-29 16:59:21 · 5715 阅读 · 0 评论 -
UBIFS 文件系统分析1 - 磁盘结构
ubifs磁盘结构UBIFS文件系统把UBI volume划分为六个部分,分别为1. superblock area,使用LEB02. master area,使用LEB1和LEB23. log area,从LEB3开始,log area区的大小4. LPT area,跟随在log area之后,LPT的大小在创建文件系统时确定5. orpan area,在log area原创 2011-12-28 18:19:26 · 7739 阅读 · 0 评论 -
UBIFS文件系统分析7 - LPROPS
fs/ubifs/lprops.clprops结构包含着一个list成员,类型是list_head,通过这个成员lprops链接到ubifs_info的freeable_list, frdi_idx_list, empty_list, uncat_list;如果lprops类型为LPROPS_DIRTY, LPROPS_FREE, LPROPS_DIRTY_IDX,lprops则由原创 2012-01-31 16:46:07 · 2099 阅读 · 0 评论 -
UBIFS文件系统分析6 - LPT分析1
LPT area - LEB Properties TreeLPT area包含LEB properties tree, ltab: a table of LPT area eraseblocks, 以及针对big model的saved LEB number - lsaveLPT area是一个自包含的文件系统,LPT有自己的Garbage collection系统,LPT Proper原创 2012-01-17 18:09:42 · 3845 阅读 · 0 评论 -
framebuffer 一些基本知识
Horizontal回扫和Vertical回扫是CRT引入的概念,电子束从左向右画水平线,回到下一行行首继续下一行扫描,直到屏幕最下一行,然后回到屏幕上方继续下一帧扫描。水平回扫:电子束从上一行尾移动到下一行起始点需要的时间帧回扫:电子束从屏幕下方移动到屏幕上方所需的时间 CRT的刷新屏率是怎么计算的:假定显卡的dotclock是28.37516MHZ1. 那么每个点的扫描原创 2011-04-29 14:48:00 · 2565 阅读 · 1 评论