自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(445)
  • 收藏
  • 关注

原创 git 切换用户和邮箱的方法

【代码】git 切换用户和邮箱的方法。

2026-06-02 15:57:52 42

原创 细节描写的六种方法

对比细节法:前后差异,突出变化 / 感悟。道具串联法:小物品藏住情感 / 故事。感官细节法:看、听、闻、触、尝。特写镜头法:关键瞬间,放大细节。动作拆分法:大动作拆成小动作。环境烘托法:小景物衬大情绪。

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

原创 答题套路5 简要概括文章内容题型和理解句子题型

时间地点人物干什么结果怎么样。几段写几句。

2025-05-19 09:51:20 387

原创 作文笔记17 点面结合

呼画面感结尾 含蓄深刻引人深思意犹未尽。首尾呼应 加深印象,强调主题。排比反问开头 激发读者兴趣。开门见山开头 简洁明了。

2025-04-11 21:43:59 452

原创 作文笔记16 点面结合

在写真情实感的文章的时候,一般以第一人称视角来写,这样别人会觉得你写的是真实的,不是编的故事。第二,你写的这个故事一定要合乎常理,不能有前后矛盾的地方。有的作文里边儿的要求比较详细,比如说给你一幅图片,让你根据这个图片来描述你的什么样的心情有可能是开心的,有可能是不开心的。不同的人有不同的反应,哪一种反应平静的也好,或者是特别兴奋的也好,比如说同样是考了100分,有的人就会特别兴奋的蹦起来,有的人就会习以平常的这种内敛的。内心的喜悦,每个人的表现是不一样的,也就是说,你写描写心情的时候,你可以是不一样的。

2025-03-31 06:22:05 495

原创 慢慢欣赏ELF 初步认识

奔跑吧 Linux内核 第二版 卷1 基础架构。Linux 二进制文件格式 ELF 入门。

2024-11-01 08:58:36 275

原创 慢慢欣赏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关注的人

提示
确定要删除当前文章?
取消 删除