- 博客(191)
- 收藏
- 关注
原创 【DeepSeek】 IO 多路复用在网络编程中的作用
IO 多路复用是解决高并发连接的终极方案。优点:一个线程管理海量连接,CPU 利用率极高,不需要频繁切换线程上下文。缺点:编程逻辑复杂,代码不能写成线性的(发一个包等一个回包),必须把逻辑拆散成“收到数据->处理->发送”的回调模式。终极形态实际的高性能服务器(如 Nginx)通常结合IO 多路复用和线程池主线程:只用 epoll 监控连接的建立和读写(IO 密集型)。工作线程池。
2026-05-07 11:41:24
194
原创 【DeepSeek】线程池在网络编程中的作用
互斥锁是必须的,因为主线程和所有子线程都在操作同一个队列,不加锁会导致数据混乱。条件变量是为了省 CPU。如果没有任务,子线程不应该疯狂死循环检查队列(这叫忙等待),而应该睡觉,等主线程signal唤醒。长连接的特殊性在这个模型里,如果一个子线程拿到了client_fd并进入了长连接循环,那这个线程就被这个客户“霸占”了。如果线程池只有 4 个线程,当第 5 个客户连上来时,它的fd会在队列里排队,直到前 4 个里有一个断开连接,线程才会回到队列取第 5 个任务。这其实也是一种保护机制。
2026-05-07 11:37:34
179
原创 【DeepSeek】经典的多线程并发服务器模型
你的想法是对的:多线程确实解决了“不 close 导致无法 accept”的矛盾。适用场景:适合连接数不多、逻辑比较复杂的场景。进阶思考:如果连接数成千上万,记得用线程池或epoll来优化。
2026-05-07 11:33:27
200
原创 【DeepSeek】TCP/IP Socket 编程
宏观上:基于模型,通过三次握手建立全双工管道。微观上:基于内核缓冲区的生产者-消费者模型,用户程序与内核通过recv/send进行数据交互。演进上:从一问一答发展到多线程,最终演变为I/O 多路复用的事件驱动架构。,核心是基于客户端-服务端模型。我们可以从“代码流程视角”和“内核数据流视角”两个维度来理解它的架构。宏观上:基于模型,通过三次握手建立全双工管道。微观上:基于内核缓冲区的生产者-消费者模型,用户程序与内核通过recv/send进行数据交互。演进上:从一问一答发展到多线程,最终演变为。
2026-05-07 11:09:22
213
原创 【DeepSeek】Socket API 支持的协议族
Socket 是“通用插座”Socket API 的设计精髓在于抽象。它把“通信”这个动作抽象为sendrecvbindaccept等标准接口,而底层的具体实现(是走网线、走蓝牙、还是走内存)则由不同的协议族来驱动。TCP/IP 只是“默认选项”我们平时最常用AF_INET(IPv4) 和AF_INET6(IPv6),所以大家容易产生“Socket 就是 TCP/IP”的误解。实际上,表格里的其他协议在特定领域(如嵌入式开发、高性能计算、系统管理)同样非常重要。编程模型一致。
2026-05-07 11:04:13
198
原创 【DeepSeek】linux 内核kallsyms 动态符号表文件
是 Linux 内核提供的一个文件,它包含了当前运行内核中所有内核符号(函数、变量)的地址和名称。这个文件对于内核调试、性能分析(如 perf、ftrace)和系统监控工具至关重要。
2026-04-30 17:48:44
185
原创 【DeepSeek】文件系统损坏
断电也可能影响引导程序(如 GRUB、Windows Boot Manager),导致系统无法启动,但严格来说这不属于“文件系统异常”。这是最通用的说法,指文件系统的元数据(如超级块、inode表、目录结构等)或数据区域因非正常关机(如断电)而出现不一致或错误。特指文件系统核心管理数据(超级块、inode、位图等)的损坏,可能导致整个分区无法识别或挂载失败。强调文件系统内部结构(如元数据与实际数据块之间的关联)出现逻辑矛盾,是“损坏”的一种具体表现。(针对日志文件系统)或。(针对核心结构损坏)。
2026-04-30 17:10:36
220
原创 【DeepSeek】英伟达H2D思考
Pin Memory:驱动将 Host 内存锁定,获取物理页映射。构建描述符:驱动根据物理页生成 Scatter-Gather 列表(处理物理不连续),或根据 Pitch 参数生成 2D 拷贝指令(处理逻辑不连续)。硬件接管:CPU 将描述符写入 GPU 的命令缓冲区,随即撤出。DMA 传输:GPU Copy Engine 直接读取系统内存,通过 PCIe 高速写入显存。这就是为什么你在任务管理器里看到 GPU 在疯狂搬运数据,而 CPU 占用率却只有 1-2% 的原因。
2026-04-22 17:43:41
18
原创 【DeepSeek】OverlayFS 是一项什么样的技术
面包底:只读的系统镜像(安全、压缩、掉电无损)。肉饼:OverlayFS 驱动(负责分发读写请求)。面包顶:用户的修改数据(可读写、掉电可能丢失但可修复)。这样,你既拥有了 Linux 系统丰富的文件操作能力,又拥有了像 RTOS(实时操作系统)那样刷不死的“金刚不坏之身”。
2026-04-22 17:24:13
22
原创 【DeepSeek】文件系统掉电保护的设计
分区隔离:把“命”(系统)和“身外之物”(日志)放在不同的物理区域。只读挂载:系统区加上“写保护锁”,杜绝误操作和掉电写损坏。日志文件系统:数据区使用带日志功能的文件系统(ext4/f2fs),配合fsck(文件系统检查工具),在启动时自动修复可能的掉电损坏。这样设计,你的设备就成了“小强”,随便暴力断电,只要硬件不坏,系统都能自启动恢复。
2026-04-22 17:18:17
18
原创 【DeepSeek】Uboot为什么需要那么多文件系统
U-Boot 支持这么多文件系统,本质上是因为它是 PC BIOS 和 操作系统引导程序(如 GRUB)的结合体。在 PC 上,BIOS 只负责硬件初始化,读取硬盘 MBR;真正的文件系统读取和内核加载是由 GRUB 完成的。在嵌入式系统中,U-Boot 一把梭了:既做硬件初始化(BIOS 的活),又做文件系统解析和内核加载(GRUB 的活)。所以,你的内核镜像躺在哪种文件系统里,U-Boot 就得学会哪种文件系统的“语言”把它抱出来。
2026-04-22 17:11:00
21
原创 【DeepSeek】dtb在kernel 和uboot的传递
特性U-Boot 的 DTBLinux Kernel 的 DTB数据来源同一个.dts源文件同一个.dts源文件主要用途驱动 U-Boot 自身的外设(如初始化 DDR、读取 Flash)驱动 Linux 内核的所有设备驱动存在形式通常嵌入在 U-Boot 二进制文件内部通常作为独立文件加载到内存是否可修改U-Boot 运行时一般只读(用于初始化)U-Boot 会动态修改它(填入 bootargs 等),然后传给内核独立性:Kernel DTB 是静态文件,描述的是“默认情况”。关联性。
2026-04-22 17:05:33
22
原创 【DeepSeek】BL2为什么不直接加载kernel
组件角色运行位置核心能力为什么需要它?BL2安全启动桩Trusted SRAM (极小)初始化 DDR、加载安全固件、建立信任链打地基。把最难的 DDR 跑通,把安全环境搭好,代码必须极简。U-Boot通用引导器DDR (极大)文件系统、网络、命令行、设备树处理装修与搬运。从复杂的存储中找到内核,配置好参数,灵活地引导系统。Kernel操作系统DDR驱动管理、进程调度、内存管理入住。专注于业务逻辑。BL2 负责把“路”修好(DDR 初始化),把“门”看好(安全监控);
2026-04-22 16:55:36
17
原创 【DeepSeek】BL2加载BL3x
BL2 加载 -> 跳 BL31 -> 跳 BL33。BL31 不会像普通函数那样“退出”,它是系统的“守门员”,在把控制权交给 BL33 后,它依然在后台待命,随时准备处理来自非安全世界的安全请求。
2026-04-22 16:46:22
15
原创 【DeepSeek】ARM架构中的时钟与定时器分布
类型时钟分布定时器分布典型用途时钟簇级共享(主流)全局共享每核独立CPU运行频率控制系统计数器全局唯一提供时间基准每核私有接口核内调度、中断外设定时器芯片级共享系统服务、看门狗核心设计理念时钟:按功耗域划分(簇级共享最常见)定时器“共享源头 + 私有接口”的混合架构保证全局时间同步(共享计数器)避免跨核竞争(私有比较器)
2026-04-22 16:22:53
70
原创 【DeepSeek】ARM MMU 控制器有几套?
靠物理切换。当CPU从EL1切换到EL2时,硬件会自动使用TTBR0_EL2而不再是TTBR0_EL1。这是完全隔离的,每个级别都有自己独立的控制寄存器组。靠地址范围划分。高地址-> 自动路由到TTBR1_EL1(内核页表)。低地址-> 自动路由到TTBR0_EL1(用户页表)。EL0 进程切换时,OS 只需要更新TTBR0_EL1的值,而TTBR1_EL1保持不变。所以,EL3、EL2、EL1(内核部分) 各有一套独立的MMU配置,而EL0(用户) 是依附在 EL1 的 TTBR0 机制下的。
2026-04-22 16:05:35
138
原创 【DeepSeek】Pointer Authentication (PAuth)介绍
在传统的程序执行中,攻击者利用缓冲区溢出漏洞覆盖栈上的返回地址,从而劫持控制流,执行恶意代码。签名:在将指针(如返回地址、函数指针)存入内存之前,CPU 利用密钥和上下文信息计算出一个加密签名,并将其填充到指针未使用的高位比特中。验签:当指针从内存中读出并准备使用时,CPU 重新计算签名并与指针中的签名比对。失败处理:如果签名不匹配(说明指针被篡改),CPU 会触发异常,阻止恶意跳转。是 ATF 中用于开启指针认证功能的开关。
2026-04-22 15:32:08
123
原创 【DeepSeek】ARM PSCI (Power State Coordination Interface) 服务介绍
ARM PSCI 是现代 ARM SoC 电源管理的基石。它通过定义标准的 SMC 接口,成功地将操作系统的电源管理策略与底层硬件的具体实现分离开来。这不仅简化了 Linux 内核的维护工作,也促进了 ARM 生态中固件(如 ATF)与操作系统之间的协同标准化。
2026-04-22 15:03:09
310
原创 【DeepSeek】SMC 调用约定
EL3 (BL31)EL1/EL2 (调用者)EL3 (BL31)EL1/EL2 (调用者)fill:#333;important;important;fill:none;准备参数 x0=FuncID, x1-x7=Args1. 读取 x02. 解析服务类型3. 查表找到 Handler设置返回 x0=RetCode, x1-x4=Out检查 x0 判断结果SMC执行服务逻辑ERET核心规则:x0 是身份证:EL3 靠它识别你要干什么。x1-x7 是快递包:里面装着具体的参数。
2026-04-22 14:58:01
291
原创 【DeepSeek】BL31 的服务,都必须通过 SMC 指令进入
fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;EL3想要调用 BL31 服务当前在哪个EL?必须使用 SMC 指令直接函数调用触发同步异常硬件切换到 EL3BL31 处理请求ERET 返回✅BL31 常驻 EL3,是安全世界的守门人✅SMC 是唯一标准入口,从非 EL3 进入 BL31 必须用 SMC✅遵循 SMCCC 规范。
2026-04-22 11:52:45
313
原创 【DeepSeek】ARM 异常级别切换机制详解
方向切换机制触发方式典型场景低→高异常进入同步异常/异步异常系统调用、中断、陷阱高→低异常返回ERET指令返回用户态、返回Guestfill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;低→高高→低调用请求调用方向?✅ 允许❌ 禁止直接调用通过异常进入机制只能通过ERET返回执行高特权代码返回低特权继续执行。
2026-04-22 11:42:55
365
原创 【DeepSeek】RISC-V 跳转指令与重定位机制详解
场景指令使用机制近距离调用(±1MB 内)单条指令,将 20 位偏移量编码在指令内部。速度快,密度高。远距离调用(超过 ±1MB)双指令组合。AUIPC设置高位地址,JALR完成最终跳转。可覆盖整个地址空间。伪指令写法call func汇编器会自动判断距离。如果近,生成jal;如果远,生成auipcjalr。特性JAL(近距离跳转)AUIPCJALR(远距离跳转)重定位类型(或的简化版)(标准函数调用)地址计算公式(单一偏移)(拼接偏移)重定位修补时机链接时主要确定偏移量。如果溢出则报错或转换。
2026-04-22 11:23:43
390
原创 【DeepSeek】RISC-V 的跳转指令
分支范围限制:条件分支 (Bxx) 只能跳±4KB±4KB,无条件跳转 (JAL) 能跳±1MB±1MB。更远的跳转需要组合AUIPCJALR。无立即数分支:不能直接写,必须先加载 100 到寄存器。寄存器间接跳转JALR是实现函数指针调用、虚函数调用和函数返回的核心机制。
2026-04-22 10:34:53
395
原创 【DeepSeek】引导加载程序与系统组件的安全级别分析
组件运行异常级别安全状态主要功能BL1EL3安全世界初始启动、硬件初始化、加载BL2BL2EL3安全世界加载后续阶段、硬件初始化、镜像管理BL2UEL2非安全世界加载非安全镜像BL31EL3安全世界安全监视器、运行时服务、异常处理BL32EL1安全世界可信执行环境、安全服务U-BootEL2非安全世界加载操作系统内核、设备初始化操作系统内核EL1非安全世界系统资源管理、提供系统调用应用程序EL0非安全世界执行用户代码、提供用户功能。
2026-04-20 11:41:04
301
原创 【DeepSeek】U-Boot 目录结构与功能总结
本文档详细总结了u-boot目录的结构和功能,以便于理解和使用 U-Boot 引导加载程序。
2026-04-20 11:18:34
292
原创 【DeepSeek】U-Boot 引导加载流程详细分析
硬件初始化阶段:初始化 CPU、内存、时钟等基本硬件设备初始化阶段:初始化各种外设,如串口、存储设备、网络设备等引导准备阶段:加载环境变量、解析配置信息内核加载阶段:从存储设备或网络加载操作系统内核启动参数准备阶段:准备内核启动参数和设备树控制权转移阶段:将控制权转移给操作系统内核U-Boot 的引导加载流程是一个复杂但有序的过程,从硬件初始化到内核启动,每个阶段都有其特定的功能和职责。理解这个流程对于嵌入式系统开发和调试非常重要。
2026-04-20 11:17:33
306
原创 【DeepSeek】Trusted Firmware-A 加载 U-Boot 过程详解
TFA 采用分阶段引导的方式,从 BL1 到 BL2,再到 BL31,最终跳转到 BL33(U-Boot)。BL1:从 SPI Flash 加载,初始化基本硬件,然后加载 BL2 到安全 SRAMBL2:加载 BL31(EL3 运行时)和 BL33(U-Boot,非安全)到指定内存位置BL31:初始化 EL3 运行时环境,然后跳转到 BL33(U-Boot)BL33:U-Boot 启动,继续引导操作系统TFA 加载 U-Boot 的过程是一个精心设计的多阶段引导流程,确保了系统的安全性和可靠性。
2026-04-20 11:15:51
390
原创 【DeepSeek】Ramdisk 目录内容与功能说明
提供完整的系统功能和工具,适用于开发和调试环境:最小化设计,仅包含基本系统组件,适用于资源受限的嵌入式设备:平衡了功能和大小,适用于需要基本系统功能但资源有限的场景这些根文件系统配置为引导加载程序提供了灵活的选择,确保系统能够在各种环境下正常启动和运行。
2026-04-20 11:14:43
358
原创 【DeepSeek】BusyBox 机制、功能与使用指南
进入 BusyBox 源码目录 cd busybox- # 配置 BusyBox make menuconfig # 编译 BusyBox make # 安装 BusyBox make installBusyBox 是一个强大的工具,特别适合嵌入式系统和资源受限的环境。它通过单一可执行文件提供了大量常用命令,大大减少了系统的体积和复杂度。在本项目的 ramdisk 中,BusyBox 作为核心组件,为不同类型的根文件系统提供了基础命令集,确保系统能够正常启动和运行。
2026-04-20 11:13:30
353
原创 【DeepSeek】
特性.data 段.bss 段全称存储内容已初始化的全局变量和静态变量(初始值非零未初始化的全局变量和静态变量,或显式初始化为零的变量。磁盘占用占用磁盘空间。可执行文件中必须保存变量的初始值。不占用磁盘空间(仅记录段的大小和位置)。内存加载程序加载时,直接从磁盘映射内容到内存。程序加载时,操作系统分配内存空间,并自动清零。读写属性可读可写 (RW)可读可写 (RW)速度加载速度略慢(需从磁盘读取数据)。加载速度极快(无需读取数据,仅需清零内存)。
2026-04-16 17:31:58
364
原创 【DeepSeek】汇编指令:tp寄存器
寄存器编号x4。别名tp性质:它是一个专用寄存器,在标准调用约定中,它由操作系统或运行时环境管理,用于实现线程本地存储或多核 Per-CPU 数据机制。在代码中定义一个 Per-CPU 变量(通常放在自定义段,如.percpu// 定义一个每个CPU核心都有的变量gp是“共享的锚点”:大家共用一个地图中心,为了走得快(指令少)。tp是“私有的钥匙”:每人拿不同的钥匙,打开属于自己的房间(数据副本),为了互不干扰。在 RISC-V 操作系统开发(如 Linux 内核移植)中,tp。
2026-04-15 10:44:30
225
原创 【DeepSeek】汇编指令学习:gp 寄存器
寄存器编号x3。别名gp性质:它是一个专用寄存器,但在标准 ABI 中,它通常不用于传递参数或保存临时变量,而是固定用于指向全局数据区。特性描述寄存器名x3gp指向目标.sdata段的中心位置有效范围±2KB (共 4KB)初始化者启动代码 (crt0.S受益对象小全局变量指令开销1 条指令 (vs 普通全局变量的 2 条)gp是 RISC-V 为了加速小全局变量访问而预留的一个“锚点”,它把原本需要“绝对地址”的访问变成了“相对地址”访问,从而节省了一条指令的开销。
2026-04-15 10:42:22
231
原创 【DeepSeek】ELF中的动态符号表
定义DT_SYMTAB条目存储的是一个虚拟内存地址。指向目标:该地址指向.dynsym段。本质:它告诉动态链接器:“所有的动态符号信息(如导入的函数名、导出的函数名)都在这个地址开始的地方”。DT_SYMTAB指向的符号表,通过st_info区分数据与代码:通过STT_OBJECT和STT_FUNC告诉链接器,解析后填入 GOT 的是数据指针还是函数入口地址。区分导入与导出:通过Ndx(段索引) 配合GLOBAL绑定。UND是进口,具体段号是出口。区分强弱:通过GLOBAL与WEAK。
2026-04-13 11:14:39
77
原创 【DeepSeek】ELF中的dynamic段
dynamic段是 ELF 文件中用于动态链接的核心信息段。它就像程序的“施工图纸”,告诉动态链接器如何加载和初始化程序。
2026-04-13 10:52:09
161
原创 【DeepSeek】ELF中的GOT
GOT (Global Offset Table,全局偏移表)是 ELF 可执行文件和共享库数据段中的一个特殊表结构。位置:位于数据段(.data或.got段),属性为可读写(RW)。本质:是一个指针数组。作用:作为**“地址中转站”**。由于代码段是只读的,不能在运行时直接修改指令中的地址,因此编译器将指令中对变量/函数的引用改为对 GOT 表项的引用。动态链接器会在运行时修改 GOT 表中的值,从而实现间接跳转或间接访问。GOT 就是一个运行时地址字典。系统保留字。
2026-04-13 10:37:44
137
原创 【DeepSeek】ELF中的.got.plt
你可能会问,既然都是存地址,为什么不直接叫.got?其实.got和.got.plt.got:存放全局变量的地址。程序启动时通常就必须解析好(因为访问变量不能像函数那样有“跳板”逻辑)。.got.plt:存放外部函数的地址。专门配合.plt实现“延迟绑定”。一句话概括.got.plt它是.plt跳板的“着陆点记录本”。初始时里面是陷阱(指回 PLT),触发解析后变成桥梁(指向真实函数),保证后续调用光速直达。
2026-04-13 10:33:52
130
原创 【DeepSeek】ELF 中的plt
fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;第二次调用第一次调用GOT指向下一条指令查找libc中printf地址GOT已存真实地址用户代码: call printfPLT条目: jmp *GOT执行解析器 Resolver更新GOT表跳转到printf真实代码直接跳转到printf真实代码性能优化。
2026-04-13 10:24:04
209
原创 【DeepSeek】ELF 中的代码段
Section 名称类型关键作用.text代码存放main及其他函数的机器指令。.init代码main 执行前的环境初始化(如全局对象构造)。.fini代码main 退出后的资源清理(如全局对象析构)。.plt代码动态链接跳板,实现外部函数的延迟绑定。.rodata数据存放字符串常量和const全局变量。.interp数据告诉内核用哪个动态链接器来加载程序。.eh_frame数据支持C++ 异常处理和栈回滚。
2026-04-13 10:15:41
154
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅