内存管理
文章平均质量分 95
jerry6699
爱生活,爱编程。
展开
-
MMU地址转换(ARM/ARM64/X86)
X86 MMU地址转换原创 2019-07-13 11:09:51 · 1292 阅读 · 0 评论 -
buddy页分配
zone_watermark_ok函数定义: 693 int zone_watermark_ok(struct zone *z, int order, unsigned long mark, 694 int classzone_idx, int can_try_harder, int gfp_high) 695...原创 2019-01-16 15:24:42 · 168 阅读 · 0 评论 -
释放内存
refill_inactive_zone637 static void 638 refill_inactive_zone(struct zone *zone, struct scan_control *sc) 639 { ...原创 2019-01-26 16:09:00 · 353 阅读 · 0 评论 -
内核常用API
1. ffsffs()函数用于查找一个整数中的第一个置位值(也就是bit为1的位)。原创 2019-01-04 12:04:34 · 763 阅读 · 0 评论 -
lowmem_reserve分析
lowmem_reserve的作用kernel在分配内存时,可能会涉及到多个zone,分配会尝试从zonelist第一个zone分配,如果失败就会尝试下一个zone。我们可以想像应用进程通过内存映射申请Highmem 并且加mlock分配,如果此时Highmem zone无法满足分配,则会尝试从Normal进行分配。这就有一个问题,来自Highmem的请求可能会耗尽Normal zone的内存...原创 2019-01-15 17:32:45 · 949 阅读 · 0 评论 -
buddy初始化
buddy初始化原创 2019-01-09 16:33:11 · 295 阅读 · 0 评论 -
LRU
1. lru结构体1.1page结构223 struct page {....246 struct list_head lru; /* Pageout list, eg. active_list 247 * protected by zone-&am原创 2019-01-20 13:44:29 · 888 阅读 · 0 评论 -
基础
页属性在文件include/linux/page-flags.h中 54 #define PG_locked 0 /* Page is locked. Don't touch. */ 55 #define PG_error 1 ...原创 2019-01-20 10:16:46 · 125 阅读 · 0 评论 -
kswapd进程
kswapd1138 static int kswapd(void *p) 1139 { 1140 unsigned...原创 2019-01-19 10:23:10 · 899 阅读 · 0 评论 -
内存水位
min_free_kbytesmin_free_kbytes:This is used to force the Linux VM to keep a minimum numberof kilobytes free.就是系统运行需要的最小内存。2081 static int __init init_per_zone_pages_min(void) ...原创 2019-01-14 11:17:14 · 897 阅读 · 0 评论 -
ASoc音频驱动框架
ASoc音频框架嵌入式系统使用的音频框架是Asoc,在alsa的基础上又封装了一套代码,针对嵌入式系统。Asoc产生x86是通过PCI,如下图:嵌入式式下面接口,产生了ASoc。1)分为三个部分,platform,codec和machineplatform是soc侧codec是外部声卡machine类似于单板,它选择哪个platform,哪一个codec...原创 2019-01-02 14:35:25 · 724 阅读 · 0 评论 -
page结构体
page的定义223 struct page { 224 page_flags_t flags; /* Atomic flags, some possibly 225 ...原创 2019-01-22 17:41:12 · 621 阅读 · 0 评论 -
buddy页之核心算法
expand函数 395 static inline struct page * 396 expand(struct zone *zone, struct page *page, ...原创 2019-02-02 18:40:43 · 387 阅读 · 0 评论 -
slab的基本概念(二)
kmem_list3链表kmem_list3的定义如下: 273 struct kmem_list3 { ...原创 2019-02-14 09:03:12 · 475 阅读 · 0 评论 -
slab之基本概念
内核版本:2.6.11缓存描述符 302 struct kmem_cache_s { 303 /* 1) per-cpu data, touched during every alloc/free */ 304 ...原创 2019-02-13 10:10:06 · 580 阅读 · 0 评论 -
slab之kmalloc
高速缓存类型高速缓存分为两种类型:普通和专用。普通高速缓存由slab分配器用于自己的目的,而专用缓存转载 2019-02-12 17:58:49 · 609 阅读 · 0 评论 -
slab之内外部对象描述符
定义外部对象描述符:存放在slab的外面,位于高速缓存描述符的slabp_cache字段指向的一个普通高速缓存中。内存区的大小(尤其是存放对象描述符的普通高速缓存的大小)取决于在slab中所存放的对象个数(高速缓存描述符的num字段)。内部对象描述符:放在slab内部,正好位于描述符所描述符的对象之前。示意图:...原创 2019-02-11 08:27:11 · 545 阅读 · 0 评论 -
page count
修改count情景cache mapping (page->mapping)private data (page->private)page mapped in task’s page tables, each mapping is counted.count值的含义page ->_count = -1:代表空闲页page-&...原创 2019-01-30 18:35:54 · 1213 阅读 · 0 评论 -
Slab之着色
原创 2019-02-10 14:57:55 · 1182 阅读 · 0 评论 -
cache说明
参考cache结构与工作原理计算机缓存Cache以及Cache Line详解原创 2019-02-10 14:47:12 · 252 阅读 · 0 评论 -
slab之分配和释放object
这篇博文写得不能再好了Kernel那些事儿之内存管理(8) — Slab(中)转载 2019-02-15 16:12:24 · 408 阅读 · 0 评论 -
slab分配器
参考Linux slab 分配器剖析原创 2019-02-04 10:21:26 · 196 阅读 · 0 评论 -
buddy初始化
释放块36 static inline void __free_pages_bulk (struct page *page, struct page *base, 237 struct zone *zone, unsigned int order) ...原创 2019-01-05 20:37:30 · 486 阅读 · 0 评论 -
工作队列
schedule函数1)函数schedule()是一个调度函数,它可以被一个进程主动调用,从而调度其它进程占用CPU。2)一旦这个主动放弃CPU的进程被重新调度占用CPU,那么它将从上次停止执行的位置开始执行,也就是说它将从调用schedule()的下一行代码处开始执行。3)schedule()的方法进入睡眠状态TASK_UNINTERRUPTIBLE另一种是不可中断的睡眠状态,其状态标...转载 2018-12-30 14:11:00 · 796 阅读 · 0 评论 -
kernel/head.S
设置寄存器原创 2018-11-27 20:15:35 · 307 阅读 · 0 评论 -
Android音频系统框架简述
情景1:情景2:情景3:情景4:情景5:情景6:转载 2018-12-02 17:18:24 · 524 阅读 · 0 评论 -
compress/head.S解析
清除BBS xorl %eax,%eax //eax=0 movl $_edata,%edi //edi=0x262a2d movl $_end,%ecx //ecx=26eea4 subl %edi,%ecx cld rep stosb解压缩内核,就是从压缩的vmlinux,解压出vmlinux.bin/* * Do the decompression, and jump...原创 2018-11-21 19:57:49 · 355 阅读 · 0 评论 -
nandflash的地址
nandflash型号型号:TC58NVG2S0HTAI0Schematic Cell Layout说明: 1个页含有4352字节(4096+256),图中256和4096是逻辑分开的,我可以0-2047做存储,2048-2175做其他用途,比如obb之类的,就是obb信息不一定是 4096-4351做,这和驱动代码的实现有关。...转载 2018-10-24 08:56:12 · 914 阅读 · 0 评论 -
setup.S之保护模式
段寄存器和段描述符寄存器段描述符寄存器(GDTR)是48位寄存器,结构如下32 bits(the location of the GDT in memory)16 bits (size of GDT)段选择寄存器(CS,SS,DS,ES)是16位寄存器,结构如下索引号13位TI(1位)RPL(2位)全局段描述符整个系统中,全局描述符表GDT只有一张(一...原创 2018-10-08 18:08:36 · 351 阅读 · 0 评论 -
setup.S之A20
产生的历史16位实模式情况下,地址16位段基地址:16位偏移,这样最大地址表示值是FFFF:FFFF,也就是0x10ffef。1)在8088时代,只有20条地址线,也就是寻址 0xFFFFF,这样能用线性地址表示出来的0x100000-0x10ffef的地址,在20根地址线表示不出来,通过求模,然后回环到,比如0x10ffef%0x100000=0xffef,也就是读写0x10ffef等于读写...原创 2018-10-08 10:31:10 · 280 阅读 · 0 评论 -
setup.S分析
start: jmp trampoline跳转到tramoline处 trampoline: call start_of_setup .align 16 # The offset at this point is 0x240 ...转载 2018-10-01 14:36:30 · 1451 阅读 · 0 评论 -
内核节点
numa非numa结构 在mm/page_alloc.c中#ifndef CONFIG_DISCONTIGMEM static bootmem_data_t contig_bootmem_data; stru...原创 2018-08-14 17:31:30 · 500 阅读 · 0 评论 -
声音的采集与存储
怎么通过数字化记录声音电阻受声音影响,然后记录电压来记录声音。数字化声音指标采样频率,横轴,采样频率越大,存储数据越大采样精度,纵轴,采样精度越大,存储数据越大声道1)人两个耳朵,在两个耳朵地方采集数据,形成了双通道数据。wav双通道数据存储...转载 2018-12-02 19:24:42 · 2227 阅读 · 0 评论 -
内核的最终页表
在上一节中,我们可以看到,在kernel/head.S中建立了临时页表原创 2018-12-05 13:54:58 · 391 阅读 · 0 评论 -
e820内存数据处理
标题标题原创 2018-12-12 10:04:45 · 1475 阅读 · 0 评论 -
高端内存之永久映射
pkmap_countpkmap_count是一个包含LAST_PKMAP的数组。原创 2018-12-22 11:22:11 · 1783 阅读 · 0 评论 -
内核接口函数
内存管理相关的pte = pte_offset_kernel(pmd, vaddr); #define pte_offset_kernel(dir, address) \ ((pte_t *) pmd_page_kernel(*(dir)) + pte_index(address)) #de...原创 2018-12-17 14:09:26 · 966 阅读 · 1 评论 -
固定映射的线性地址
固定映射的线性地址可以按照任意方式映射到固定的物理内存的页框,而不是线性地址减去0xC000 0000。固定映射用的那些线性地址#define __fix_to_virt(x) (FIXADDR_TOP - ((x) << PAGE_SHIFT))#define FIXADDR_TOP ((unsigned long)__FIXADDR_TOP)defin...原创 2018-12-16 19:16:47 · 1178 阅读 · 0 评论 -
链表-list使用
链表怎么用把链表嵌入一个数据结构中,结构里包含待处理数据。然后把这个结构体实例加入到另外一个链表中。例子:struct kobject {struct list_head entry;char *name;int len;};struct操作函数,会调用list_for_each_entry函数,遍历所有节点,对数据进行处理。...原创 2018-12-21 15:03:10 · 1066 阅读 · 0 评论 -
alsa音频框架
设备节点原创 2018-12-15 18:01:49 · 509 阅读 · 0 评论