- 博客(445)
- 收藏
- 关注
原创 细节描写的六种方法
对比细节法:前后差异,突出变化 / 感悟。道具串联法:小物品藏住情感 / 故事。感官细节法:看、听、闻、触、尝。特写镜头法:关键瞬间,放大细节。动作拆分法:大动作拆成小动作。环境烘托法:小景物衬大情绪。
2026-05-24 22:04:17
20
原创 minicom调整列宽的使用方法 ubuntu入门之三十一
使用minicom 打开串口,发现长行会被折叠,严重影响体验。查看当前列宽(行数 × 列数)查看当前列宽(行数 × 列数)这样长行不容易折叠了。
2026-04-03 09:39:47
31
原创 memleak的使用的方法
```zcat /proc/config.gz | grep MEMLEAKCONFIG_HAVE_DEBUG_KMEMLEAK=yCONFIG_DEBUG_KMEMLEAK=yCONFIG_DEBUG_KMEMLEAK_MEM_POOL_SIZE=16000... ...CONFIG_DEBUG_KMEMLEAK_AUTO_SCAN=y``````# ps | grep memleak 191 root 0 SWN [kmemleak] 4785 root 34
2026-03-26 09:47:33
50
原创 git rebase 举例
前面看到的 git merge 保持了 main / feature_1 原始节点的一致性,代价就是多了一个 merge 节点那是否有方法可以不要有这些 merge 看起来“无用”的节点呢?那就用到了 rebase 方案。
2026-02-03 18:43:23
104
原创 git merge 举例
git 主分支main, 创建子分支 feature_1main 分支创建新文件 main.c, 同时子分支创建新文件 feature_1.c,现在想把 main 的修改记录同不到 feature_1。
2026-02-03 18:03:28
609
原创 Ubuntu22.04 安装telnetd ubuntu入门之二十九
安装 telnetd 服务:安装完成后,telnet 服务会自动启动,你可以通过以下命令检查服务状态: 场景windows上的 ssh工具版本太老,无法使用最新密钥交换建立ssh会话
2025-09-28 14:22:00
280
原创 解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示最终上报fail。
2025-06-10 11:21:50
529
原创 慢慢欣赏linux 之 last = switch_to(prev, next)分析
为什么需要定义last作为调用switch_to之前的prev的引用。我们再来看 switch_to 的调用者。ARM64体系结构编程与实践。
2025-06-08 06:24:21
319
原创 作文笔记17 点面结合
呼画面感结尾 含蓄深刻引人深思意犹未尽。首尾呼应 加深印象,强调主题。排比反问开头 激发读者兴趣。开门见山开头 简洁明了。
2025-04-11 21:43:59
452
原创 作文笔记16 点面结合
在写真情实感的文章的时候,一般以第一人称视角来写,这样别人会觉得你写的是真实的,不是编的故事。第二,你写的这个故事一定要合乎常理,不能有前后矛盾的地方。有的作文里边儿的要求比较详细,比如说给你一幅图片,让你根据这个图片来描述你的什么样的心情有可能是开心的,有可能是不开心的。不同的人有不同的反应,哪一种反应平静的也好,或者是特别兴奋的也好,比如说同样是考了100分,有的人就会特别兴奋的蹦起来,有的人就会习以平常的这种内敛的。内心的喜悦,每个人的表现是不一样的,也就是说,你写描写心情的时候,你可以是不一样的。
2025-03-31 06:22:05
495
原创 慢慢欣赏arm64内核启动30 __primary_switched之第三部分
将 x21 的值存放在 __fdt_pointer。而 __fdt_pointer 的定义如下。第1行涉及宏定义 str_l,其定义如下。
2024-10-17 09:06:22
618
1
原创 慢慢欣赏arm64内核启动29 __primary_switched之第二部分
展示代码 adr_l x8, vectors // load VBAR_EL1 with virtual msr vbar_el1, x8 // vector table address isb stp xzr, x30, [sp, #-16]! mov x29, sp#ifdef CONFIG_SHADOW_CALL_STACK adr_l scs_sp, init_shadow_call_stack // Set shadow call stack#endif分析代码
2024-10-16 09:10:47
347
原创 慢慢欣赏arm64内核启动28 __primary_switched之第一部分
第1行到第5行是注释,提示这段代码是在使能 MMU 之后执行。入参是 x0,即 __PHYS_OFFSET。第7行将 init_thread_union 的页面物理地址存放在 x4。
2024-10-14 09:01:03
1040
原创 慢慢欣赏arm64内核启动27 primary_entry之__primary_switch代码第三部分
该宏定义在《慢慢欣赏arm64内核启动10 primary_entry之set_cpu_boot_mode_flag》和《慢慢欣赏arm64内核启动18 primary_entry之__create_page_tables代码第五部分》有介绍。在 ARM64 架构中,页面大小通常是 4KB,所以这个指令实际上是获取 __PHYS_OFFSET 地址所在的 4KB 页面的起始地址。这样我们到了第34行,第34行将 __primary_switched 的内核链接地址存放在了 x8。
2024-10-12 09:24:58
402
原创 慢慢欣赏arm64内核启动26 primary_entry之__primary_switch代码第二部分 __enable_mmu
x1 是 TTBR1_EL1 的赋值,《慢慢欣赏arm64内核启动25 primary_entry之__primary_switch代码第一部分》里面有描述。x0 是 SCTLR_EL1 的赋值,《慢慢欣赏arm64内核启动24 primary_entry之__cpu_setup代码第六部分》里面有描述。该函数的作用是使能 MMU,前期做了那么多的工作,就是为了这一刻。该函数需要两个入参,x0 和 x1。第1行到第12行是注释。
2024-10-08 09:03:38
734
原创 慢慢欣赏arm64内核启动25 primary_entry之__primary_switch代码第一部分
此外,CONFIG_RANDOMIZE_BASE是CONFIG_DYNAMIC_MEMORY_LAYOUT和CONFIG_RANDOMIZE_MEMORY的先决条件。禁用CONFIG_RANDOMIZE_BASE可以通过在内核启动参数中添加nokaslr来实现,这会导致内核的加载地址在每次启动时都是相同的,从而降低了安全性。总的来说,CONFIG_RANDOMIZE_BASE是一个重要的安全特性,可以防止多种类型的攻击,特别是那些依赖于内核地址预测的攻击。我们先不分析这个属性,我们关注启用 MMU。
2024-10-08 08:34:46
528
原创 慢慢欣赏arm64内核启动24 primary_entry之__cpu_setup代码第六部分
第1行到第3行是注释,准备寄存器 SCTLR,SCTLR 是什么东东我们继续分析。第4行涉及宏定义 SCTLR_EL1_SET,定义如下。
2024-09-26 09:07:32
1186
原创 慢慢欣赏arm64内核启动23 primary_entry之__cpu_setup代码第五部分
CONFIG_ARM64_HW_AFDBM 是 Linux 内核的一个配置选项,用于启用 ARMv8.1 架构扩展中的硬件功能,该功能支持硬件更新页面表项中的访问(Access)和脏(Dirty)标志位。同样,如果向设置了 DBM 位的只读页面写入,将清除只读位(AP[2]),而不是触发权限故障。当在 TCR_EL1 寄存器(HA 和 HD 位)上启用此功能时,如果访问了清除了 PTE_AF 位的页面,则会设置该位,而不是触发访问标志故障。第2行到第6行为注释,含义为使能“硬件访问标记位”。
2024-09-25 09:06:37
854
原创 慢慢欣赏arm64内核启动22 primary_entry之__cpu_setup代码第四部分
在该宏定义里面,ID_AA64MMFR0_EL1, AArch64 Memory Model Feature Register 0。第4行涉及到宏定义 tcr_compute_pa_size 和 TCR_IPS_SHIFT。提供 EL1 异常模式下 内存模型和内存管理的信息,涉及到的宏定义如下。第1到第3行是注释,含义是设置 TCR_EL1 的 IPS 域。其中,tcr_compute_pa_size 的定义如下。我们可以看到 bit[3] 始终为0, 所以可以忽略掉。
2024-09-23 09:19:07
881
原创 作文笔记15 点面结合
修辞手法:比喻(把一个事物比作另一个事物,好处是形象生动),拟人(给人以外的事物人的特征,好处是情感共鸣),排比(不少于3句,句式结构类似郎朗上口,句意相关,好处是气势节奏强,深化中心)。好处是强化描写的层次感,既有整体形象描写,又凸显人物个性特点。表现手法:正面描写(对描写对象直接描写),侧面描写(描写对象周围的景物)另外对比,象征,借景抒情,托物言志等等。景色描写方法:动态描写,静态描写,动静结合。人物描写方法:外貌,语言,动作,神态,心理。环境描写方法:自然环境,社会环境。
2024-09-22 21:07:04
1153
原创 慢慢欣赏arm64内核启动21 primary_entry之__cpu_setup代码第三部分
展示代码 /* * Set/prepare TCR and TTBR. We use 512GB (39-bit) address range for * both user and kernel. */ mov_q x10, TCR_TxSZ(VA_BITS) | TCR_CACHE_FLAGS | TCR_SMP_FLAGS | \ TCR_TG_FLAGS | TCR_KASLR_FLAGS | TCR_ASID16 | \ TCR_TBI0 | TCR_A1 | TC
2024-09-13 09:13:13
1267
原创 慢慢欣赏arm64内核启动20 primary_entry之__cpu_setup代码第二部分
【代码】慢慢欣赏arm64内核启动20 primary_entry之__cpu_setup代码第二部分。
2024-09-04 08:51:05
1018
原创 慢慢欣赏arm64内核启动19 primary_entry之__cpu_setup代码第一部分
也就是说,位域bit12设置为1时,在EL0异常等级下,访问 MDCCSR_EL0, DBGDTR_EL0, DBGDTRTX_EL0, and DBGDTRRX_EL0 将会切换到 EL1 异常等级。第14, 15行涉及的寄存器 CPACR_EL1, Architectural Feature Access Control Register 的位域 bits[21:20]daifclr 涉及到 pstate 寄存器的 bits[9:6],分别是 DAIF,8对应 bit[9],表示清除调试掩码。
2024-09-02 09:41:38
1106
原创 慢慢欣赏arm64内核启动18 primary_entry之__create_page_tables代码第五部分
【代码】慢慢欣赏arm64内核启动18 primary_entry之__create_page_tables代码第五部分。
2024-08-24 15:43:32
1073
原创 慢慢欣赏arm64内核启动17 primary_entry之__create_page_tables代码第四部分map_memory剩下的流程
其中,表项的属性由 PMD_TYPE_TABLE 定义,rtbl 只定义了下一级页表的第一个页表起始地址,那么下一级页表的后续页表的起始地址需要根据 rtbl + n * PAGE_SIZE 而定。接着第7行,根据第6行,将 对应的下一级页表的物理地址 rtbl 填写到 本级页表也就是全局页表的表项,区间为 [start, iend],count 为0,表示全局页表的表项只在一个页表里面,不可能跨页表,当然 count 也当出参,统计全局页表的表项数目。n 代表第n个页表,n的范围为 [0, count)
2024-08-20 08:44:34
794
原创 慢慢欣赏arm64内核启动16 primary_entry之__create_page_tables代码第四部分populate_entries
我们没有使能 CONFIG_ARM64_PA_BITS_52,而是使能了 CONFIG_ARM64_PA_BITS_48,所以该宏就是把 rtbl,也就把是下一级的页表物理地址存放在 tmp1 里面。第19行将 tmp1 与 flags 进行或操作,也就是说,将页表基地址与页表属性组合在一起,由于页表基地值的有效位和页表属性的有效位在不同的位域里面,所以可以认为是缝合在一起。第1行到第16行时注释,大概意思是填充页表项,当前页表的每个页表项的内容是下一级页表的物理地址,所以牵扯到本级页表和下级页表。
2024-08-19 07:57:04
633
原创 慢慢欣赏arm64内核启动15 primary_entry之__create_page_tables代码第四部分compute_indices
第三个参数 shift 入参, 将虚拟地址转换为索引需要偏移的位数,调用者传过来的参数是 PGDIR_SHIFT,该参数我们在以前的章节中分析过,为39。第二个参数 vend 入参,虚拟地址的结束地址,在上一章节中我们是将 vend 自减1的,恰好符合注释描述的区间概念,否则就多分配了一个页表项。对于全局页表来说,最多就一个页,不会超过512,但是后面级别的页表就不好说了,只要全局页表的有效索引超过1,下一级的页表肯定是跨多个页表。根据注释,出参统计有效页表项的数目,包括了跨多个页表的场景。
2024-08-18 08:50:40
485
原创 慢慢欣赏arm64内核启动14 primary_entry之__create_page_tables代码第四部分map_memory
第二个参数 rtbl 是下一级页表的起始地址,根据刚才的描述,下一级页表的起始地址其实是不用传达的,注释也做了说明,由于全局目录只占有1个页面,所以在函数的内部是通过 tbl + PAGE_SIZE 传递的。第九个参数 iend,注释里没有说明,根据意思以及上下文代码的实现,应该是 index of end 的缩写,就是下一级页表的终止地址在该级页表的索引值,由于可能存在多个页表的可能性,第十二个参数 sv,也是出参,对应 x14,也是 临时变量,用于存储计算出来的下一级页表的起始物理地址。
2024-08-17 16:42:31
1041
原创 慢慢欣赏arm64内核启动13 primary_entry之__create_page_tables代码第三部分
所以最终 PGDIR_SHIFT 的值为 ((PAGE_SHIFT - 3) * 4 + 3) == 39这就是 L0 索引的偏移PTRS_PER_PGD 的值为 1
2024-08-17 15:18:41
825
原创 慢慢欣赏arm64内核启动12 primary_entry之__create_page_tables代码第二部分
【代码】慢慢欣赏arm64内核启动12 primary_entry之__create_page_tables代码第二部分。
2024-08-11 15:35:36
485
原创 慢慢欣赏arm64内核启动11 primary_entry之__create_page_tables代码第一部分
【代码】慢慢欣赏arm64内核启动11 primary_entry之__create_page_tables代码第一部分.txt。
2024-08-10 10:14:28
496
原创 慢慢欣赏arm64内核启动10 primary_entry之set_cpu_boot_mode_flag
上面的文章我们分析完毕el2_setup函数,该函数虽长但不啰嗦。主要作用就是如果bootloader把控制权交给内核时,如果内核是EL1异常模式,则按照EL1模式初始化一些系统寄存器,然后返回w0为EL1;如果内核当前为EL2模式,则判断硬件是否支VHE,如果不支持,则切换到EL1;如果支持,则继续以EL2模式启动,这两种情况返回w0均为EL2。
2024-08-10 08:49:34
571
原创 慢慢欣赏arm64内核启动9 primary_entry之el2_setup代码第七部分
【代码】慢慢欣赏arm64内核启动9 primary_entry之el2_setup代码第七部分。
2024-08-07 13:53:50
311
原创 慢慢欣赏arm64内核启动8 primary_entry之el2_setup代码第六部分
【代码】慢慢欣赏arm64内核启动8 primary_entry之el2_setup代码第六部分。
2024-08-06 13:43:59
901
原创 慢慢欣赏arm64内核启动7 primary_entry之el2_setup代码第五部分
【代码】慢慢欣赏arm64内核启动7 primary_entry之el2_setup代码第五部分。
2024-08-06 08:51:25
882
原创 慢慢欣赏arm64内核启动6 primary_entry之el2_setup代码第四部分
【代码】慢慢欣赏arm64内核启动6 primary_entry之el2_setup代码第四部分。
2024-08-02 18:48:19
544
原创 慢慢欣赏arm64内核启动5 primary_entry之el2_setup代码第三部分
解析完虚拟化部分,我们继续分析启动过程中,对中断控制器的处理。
2024-08-02 05:15:52
802
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅