移植VexiiRiscv RV64 SMP到EP4CGX150
最近在头疼的学习各种Linux,换个脑子放放松. 先说成果:双核 RV64IMAFDC VexiiRiscv,Sv39,双发射,L1 cache 一致性,128 KiB 四路共享 L2;SDRAM 禁用,片上 RAM 256 KiB,LiteX BIOS/UARTBone 控制.带 Sv39 的配置;CPU DMI 可访问且两...
最近在头疼的学习各种Linux,换个脑子放放松. 先说成果:双核 RV64IMAFDC VexiiRiscv,Sv39,双发射,L1 cache 一致性,128 KiB 四路共享 L2;SDRAM 禁用,片上 RAM 256 KiB,LiteX BIOS/UARTBone 控制.带 Sv39 的配置;CPU DMI 可访问且两...
同一份文件读两遍,第二遍比第一遍快多少?这个日常经验的背后是 page cache:内核拿空闲内存缓存文件内容,读走内存,写先攒着.这篇把这本"最大的账"的进出规则实测一遍 — 冷热差,缓存涨落,脏页积压与回写,以及预读这台自动喂...
1.3 篇从异常处理的角度看过缺页:数据 abort,EC=0x24/0x25,一路分发.这篇站在内存管理这边,把缺页当作"虚拟内存的发动机"来讲:没有它,按需分配,COW,文件映射全是空谈.实验把各种缺页场景的计数精确到个位数,还抓到两个&quo...
1.4 篇从内核侧走过页表,这篇换到用户态视角,用 /proc/self/pagemap 把"我的虚拟页此刻在物理世界的什么位置"逐位读出来;再用 smaps 看懂内核给每个进程记的内存账.中间有个意外:一个我以为十拿九稳的功能在这块板上是死的...
每个进程都以为自己独占一整条地址线,这份错觉由 mm_struct 和它名下的一串 VMA 支撑.这篇讲地址空间怎么划分成区间,区间怎么合并怎么拆分 — 这套看似枯燥的簿记,恰恰是 mmap,mprotect,munmap 全家行为的关键.实验纯用户态就能做得非...
上一篇的 buddy 只会按 2 的幂给页,内核里绝大多数分配是"给我 33 字节"这种碎需求.填这道缝的是对象分配器:把页切成等尺寸的对象小格,反复回收利用.如今这个角色是 SLUB,这篇把 kmalloc 的真实单价(和它的取整黑幕),自建 ...
上一篇把物理内存分了页,这篇讲页怎么分给使用者.核心是 buddy 分配器:一个用"伙伴关系"换零碎片合并的七十岁老算法,今天仍是内核页面分配的唯一正门.alloc_pages 一族怎么用,GFP 标志在说什么,buddyinfo 的每一列怎么读,...
从这一章起进内存管理.地基是物理内存怎么被组织和记账:每个物理页一张"户口页"struct page,按 zone 分区,按 node 分组,底层再用 SPARSEMEM 把不连续的物理内存缝成一张虚拟连续的账本.这篇把这些结构在板上逐个读出来,包...
前面所有调度话题都假装只有一个 CPU.真机是 4 个 A53 加 2 个 A72,六个核,两种脾气,调度器的活立刻多了两件:任务放哪个核,核之间的负载怎么摆平.这篇把 SMP 的三层机制 — 亲和性,负载均衡,异构感知 — 全部在板上实测,顺手把频率联动...
单核再忙,同一时刻也只有一个任务在跑.所谓"多任务",是调度器在毫秒尺度上不停换人:保存旧任务的现场,恢复新任务的现场,放它上CPU.这篇把这个"换人"动作拆开看:一次切换到底贵多少(实测),切换点在哪发生(两种,计...