自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(127)
  • 资源 (2)
  • 收藏
  • 关注

原创 linux_binprm

Linux_binprm结构体是exec()系统调用的核心数据载体,负责存储可执行文件加载过程中的所有关键信息。该结构体定义在<linux/binfmts.h>中,主要承担四个角色:数据存储容器、临时缓存区、安全上下文载体和加载器传参工具。其核心字段分为进程上下文、文件信息、临时缓存和权限安全四类,贯穿创建、填充、传递、使用和释放的完整生命周期。作为do_execve()与二进制加载器之间的桥梁,linux_binprm简化了参数传递,确保程序加载的高效性和安全性,具有"临时有效、按需

2026-01-31 08:45:38 6

原创 start_kernel

start_kernel()是Linux内核C语言层面的核心入口,定义在kernel/init/main.c中。它作为内核初始化的总调度器,按顺序调用各子系统初始化函数,完成从裸机环境到可运行进程的转变。主要执行流程包括:早期环境准备、架构适配、核心子系统初始化、辅助系统设置、日志调试系统启动,最终通过rest_init()激活idle进程并创建init/kthreadd进程。start_kernel()具有无返回值、架构无关性等关键特性,其初始化后的内存区域会被释放以节省资源。idle进程(PID=0)是

2026-01-31 08:45:19 9

原创 init 进程

Linux内核中的init进程(PID=1)是用户空间的第一个进程,负责启动和管理所有用户服务。它由内核的rest_init()函数创建,经过kernel_init()初始化后进入用户态执行/sbin/init等程序。作为系统的核心进程,init具有三个关键功能:回收孤儿进程资源、启动系统服务和管理运行级别切换。现代Linux系统主要采用systemd实现init功能,支持并行启动和服务监控。init进程的生命周期贯穿系统运行,无法被普通命令终止,确保系统稳定运行。其从内核态到用户态的过渡过程体现了Linu

2026-01-31 08:44:59 6

原创 idle 进程

摘要:idle进程是Linux内核中最特殊的系统进程(PID=0),作为进程调度的兜底机制,当CPU无任务时运行低功耗循环并处理内核底层任务。其核心特点包括:静态编译定义、无用户空间、最低优先级、生命周期贯穿系统运行全程。初始化过程跨越汇编和C代码,通过cpu_idle()函数实现"处理软中断→调度检测→低功耗休眠"的循环逻辑。多核系统中每个CPU核有独立idle线程,通过架构相关指令(x86的hlt/ARM的wfi)实现节能。该进程不可终止,可通过内核参数和工具(Ftrace/eBPF

2026-01-31 08:44:43 28

原创 kthreadd 进程

摘要:kthreadd是Linux内核中负责管理所有内核线程的守护进程(PID=2),由rest_init()函数创建并全程运行于内核态。作为内核线程的"父进程",它通过无限循环处理线程创建请求、调度优先级和回收资源,防止内核态僵尸进程。kthreadd与idle进程(PID=0)和init进程(PID=1)共同构成Linux进程体系的三大基石,分别负责CPU空闲管理、用户态进程管理和内核态线程管理。该进程无法被终止,仅在系统关机时退出。

2026-01-31 08:44:25 25

原创 do_execve()

do_execve()是Linux内核实现exec()系统调用的核心函数,用于替换当前进程的用户态资源(代码、数据、堆栈等),保持PID不变。其流程包括:参数校验与数据拷贝、打开可执行文件并解析格式、销毁旧用户态资源、加载新程序资源(如ELF文件解析、内存映射)、更新进程上下文。成功执行后原用户态内容被完全覆盖,仅保留内核态资源。该函数通常与fork()配合使用,前者创建新进程,后者实现"进程重生",是启动新程序的经典组合。关键结构体包括linux_binprm(加载描述符)、task_

2026-01-31 08:41:06 13

原创 dup_task_struct()

摘要:dup_task_struct()是Linux内核进程创建的关键底层函数,负责为新进程分配并浅拷贝父进程的task_struct结构体及内核栈。它位于kernel/fork.c中,采用内存打包分配策略(task_struct+thread_info+内核栈连续分配),仅复制数值字段而不处理底层资源(如mm_struct)。该函数初始化新进程内核栈元数据,但不修改进程唯一性字段(如PID)。作为copy_process()的前置步骤,其核心特点是高效简洁,仅提供基础载体,后续资源处理由上层函数完成。

2026-01-31 08:40:46 21

原创 copy_process()

Linux内核中copy_process()函数是进程创建的核心实现,负责初始化新进程的task_struct结构体并处理资源复制/共享。该函数根据clone_flags参数决定资源共享策略(如CLONE_VM共享地址空间创建线程),通过严格的"校验→分配→复制→初始化"流程完成进程创建。核心功能包括:参数校验、task_struct分配、资源复制(虚拟内存、文件描述符等)、PID分配和进程关系建立。特别实现了写时复制机制优化内存使用,并确保线程与进程创建差异、vfork特殊处理等功能。

2026-01-31 08:40:31 13

原创 do_fork()

摘要:do_fork()是Linux内核中进程创建的核心入口,统一处理fork()/vfork()/clone()的系统调用差异。其流程分为四步:1)参数校验与标志位处理;2)调用copy_process()创建task_struct并复制/共享资源;3)通过wake_up_new_task()激活新进程,处理vfork()阻塞等特殊逻辑;4)返回子进程PID。关键设计包括模块化分离(do_fork负责流程,copy_process负责资源)、vfork()阻塞机制、写时复制(COW)延迟内存分配,以及新进

2026-01-31 08:40:14 14

原创 fork()/vfork()/clone()

摘要:Linux进程创建接口fork()、vfork()和clone()均基于内核do_fork()实现,主要区别在于CLONE_*标志和资源管理策略。fork()采用写时复制(COW)创建独立进程,是标准用法;vfork()直接共享内存且强制子进程先执行,现已被优化后的fork()取代;clone()通过标志位灵活控制资源共享程度,可创建线程或容器进程。日常开发推荐使用fork(),特殊场景才考虑clone(),三者差异主要体现在内存处理方式和执行顺序上。

2026-01-31 08:39:50 98

原创 linux 进程启动流程

Linux进程启动的核心流程可分为三个阶段:1.用户态通过fork()/clone()系统调用触发进程创建;2.内核态完成task_struct分配和资源复制;3.execve()加载可执行文件并初始化用户态环境。整个过程依赖fork()+execve()两个核心系统调用,以task_struct作为进程管理的基本单元。特殊进程如0号(idle)、1号(init)和2号(kthreadd)由内核直接创建,不遵循常规流程。调试时可使用strace、ftrace等工具跟踪系统调用和内核函数执行链。

2026-01-30 14:49:45 272

原创 Linux 性能优化全指南

本文系统介绍了Linux性能优化的方法论与实践指南。主要内容包括:1)性能瓶颈定位工具链,涵盖CPU、内存、磁盘I/O和网络的监测工具及判定标准;2)四大核心资源调优策略,包括CPU调度与NUMA适配、内存管理优化、磁盘I/O调度器选择和网络参数调优;3)应用层优化原则,强调减少系统调用、优化内存分配和锁竞争;4)调优验证方法,建议建立性能基线并采用单变量调优。文章特别指出国产化环境下需注意架构适配问题,并强调性能优化是"定位-调优-验证-监控"的持续过程。

2026-01-30 11:31:39 264

原创 CPU 性能调优

【摘要】CPU性能调优需精准定位瓶颈类型(计算密集型/内核态开销/I/O阻塞/调度切换),通过核心绑定、优先级调整、中断隔离等策略提升性能。重点关注NUMA架构优化,国产CPU需绑定本地节点并关闭均衡策略。内核态瓶颈需使用perf工具分析热点函数。不同场景调优重点各异:计算密集型应关闭超线程并均衡负载,高并发需优化中断和线程池,低延迟场景采用实时调度策略。调优后需验证CPU利用率、负载均衡等指标,建立长期监控机制。注意避免实时进程优先级过高、过度中断隔离等常见误区,确保系统稳定性。

2026-01-30 11:31:07 430

原创 ARM64 MMIO

本文介绍了ARM64架构下的MMIO(内存映射I/O)机制。与x86不同,ARM64仅支持MMIO,通过将外设寄存器映射到物理地址空间,CPU可直接使用内存访问指令操作外设。文章详细阐述了MMIO的关键特性:设备内存属性(如Device-nGnRnE)禁止缓存和重排序,确保操作直接作用于外设;访问方式包括裸机环境下的volatile指针和内核态的ioremap映射;并强调了内存屏障、地址对齐等注意事项。最后指出必须参考SoC手册获取外设地址,且用户态需通过内核驱动间接访问MMIO。

2026-01-30 10:39:50 257

原创 ARM64 VFIO

ARM64架构下的VFIO技术是实现设备直通的关键虚拟化特性,通过SMMUv3实现地址隔离、GICv3/v4处理中断虚拟化,让虚拟机直接访问物理PCIe设备。其核心流程包括设备绑定、资源隔离、虚拟机映射、设备操作和中断处理五个步骤,依赖ARMv8-A虚拟化扩展、SMMUv3和GICv3/v4等硬件支持。相比X86架构,ARM64 VFIO在设备树配置和生态成熟度方面存在差异,但已在鲲鹏920等高端服务器上具备生产可用性。该技术通过解耦设备资源管理与访问控制,在保证安全隔离的同时提供接近物理机的性能表现。

2026-01-30 10:39:35 404

原创 DMA 核心结构

摘要:CPUDMA采用三层协同设计,包括硬件DMA控制器、软件描述符和内核抽象结构。硬件层由多通道DMAC实现无CPU参与的数据传输;软件层通过描述符存储传输参数,支持链表/环形传输;内核层封装硬件差异,提供统一接口。工作流程为:驱动配置描述符→内核提交任务→DMAC执行传输→中断处理回调。不同架构实现各异:ARM64采用PL330控制器,x86通过PCIe设备实现,而Cortex-M直接操作寄存器。该设计显著降低CPU负载,提升数据传输效率。

2026-01-30 10:39:18 504

原创 ARM64 DMA 与 SMMUv3

本文深入解析了ARM64平台中DMA与SMMUv3的核心机制。SMMUv3作为ARM64的IOMMU实现,通过IOVA地址转换实现设备与CPU的地址隔离、权限控制和虚拟化支持。文章详细阐述了IOVA的定义与管理机制,对比了dma_alloc_coherent与dma_map_single两种映射方式的区别,并提供了驱动开发规范。同时,针对常见IOVA问题给出了排障方法,帮助开发者优化DMA性能与稳定性。通过内核标准接口和调试工具,可有效管理SMMUv3的IOVA地址空间。

2026-01-30 09:00:05 331

原创 IOMMU Domain

摘要:IOMMU Domain是IOMMU的核心隔离单元,为设备组提供独立的DMA地址转换上下文,包含专属IO页表、地址映射规则和访问权限。其主要功能包括:实现设备间DMA地址隔离、32位设备访问64位内存的地址转换、虚拟化场景下的设备直通等。Linux内核将其分为五种类型(如恒等映射域、虚拟域等),通过struct iommu_domain统一管理。工作流程涉及设备绑定、地址转换和权限校验三个关键步骤,由IOMMU硬件与内核驱动协同完成。典型应用场景包括嵌入式设备隔离、大内存访问、虚拟化设备直通等,是保障

2026-01-30 08:59:49 412

原创 PCIe DMA

PCIeDMA是一种基于PCIe总线的高速直接内存访问技术,广泛应用于服务器和高端嵌入式设备中。其核心特点包括:1)外设自带DMA引擎,独立完成数据传输;2)依托PCIe总线实现GB/s级高带宽传输;3)支持硬件SG列表解析和MSI-X中断;4)与IOMMU深度集成实现地址虚拟化。PCIeDMA采用四层硬件架构,支持外设到内存和内存到外设两种传输模式,通过PCIe Memory TLP包实现数据交互。相比传统片上DMA,PCIeDMA具有64位地址支持、低延迟中断等优势,但X86_64和ARM64平台在缓存

2026-01-30 08:59:32 580

原创 SMMUv3硬件 PTW

SMMUv3硬件PTW是ARM64 IOMMU实现地址转换的核心机制,通过专用硬件模块自动完成页表遍历,相比软件PTW具有显著性能优势。其触发条件是TLB未命中,执行过程完全独立于CPU,仅在出现IOPF异常时通过事件队列上报内核。硬件PTW遵循ARMv8-A页表规范,支持4KB/2MB/1GB页粒度,能高效处理高速DMA设备的地址转换请求。内核在初始化时自动配置PTW相关参数,开发人员可通过调试日志和寄存器操作排查PTW相关问题。该机制是ARM64平台实现高性能IO虚拟化的关键技术之一。

2026-01-30 08:59:13 430

原创 内存控制器颗粒并行与软 NUMA

摘要: ARM64平台的内存控制器通过多物理DRAM芯片并行读写提升带宽,但单NUMA节点的无序访存会限制其性能。软NUMA通过逻辑分组(核心组-内存区-物理芯片组绑定)实现有序访存,激活硬件并行能力:1)核心组分群,避免请求混杂;2)内存分区映射到不同芯片组;3)亲和性调度确保本地化访存。配置时需匹配物理芯片并行数,适用于多线程连续访存场景,在ARM64的DynamIQ集群中还能优化缓存局部性。软NUMA本质是软件策略引导硬件高效并行,而非创造新能力。

2026-01-29 09:07:42 483

原创 PCIe 驱动调试

PCIe 驱动调试的核心是分层定位设备未枚举 → 优先查硬件 / 链路(lspci + dmesg 链路日志);驱动不加载 → 查设备 ID 匹配(lspci -nn + 驱动 device_id 表);probe 失败 → 查配置空间 / BAR / 中断(添加打印 + lspci 验证);功能异常 → 查中断 / 总线主模式 / DMA(proc/interrupts + dma 地址);所有问题先看内核日志(dmesg),再用 lspci 验证配置空间,最后定位代码逻辑。

2026-01-29 09:07:27 491

原创 DDR 单 / 双通道与NUMA

摘要:DDR单/双通道的核心差异在于内存控制器架构与总线位宽,单通道采用64位总线,双通道通过两组独立控制器实现128位并行传输(2×64位),理论带宽翻倍。所有DDR系列原理一致,单通道串行传输易遇带宽瓶颈,双通道并行传输显著提升数据吞吐效率,但需内存条规格匹配。DDR5引入32位子通道优化非对称配置性能。在NUMA架构中,双通道作为节点内带宽优化手段,与多CPU间的内存管理架构协同工作,服务器平台通过多通道扩展(如8通道)实现更高带宽。操作系统需通过NUMA亲和性调度确保本地内存访问,以充分发挥多通道带

2026-01-29 09:07:00 542

原创 PCIe 中断机制:INTx / MSI / MSI-X

PCIe中断机制演进:从INTx到MSI-X的架构升级 摘要:PCIe总线中断机制经历了从传统INTx到现代MSI/MSI-X的技术演进。INTx作为兼容方案通过模拟方式实现4条共享中断线,存在延迟高、扩展性差等缺陷。MSI采用消息TLP传输,支持64个独占向量,显著降低中断延迟。MSI-X进一步扩展至2048个独立向量,支持动态配置和精细化管理,成为高端设备的标配。三者底层均通过事务层消息TLP传输,由Linux内核统一抽象为IRQ接口。实际开发应遵循"优先MSI-X,其次MSI,最后INTx&

2026-01-29 09:06:38 650

原创 PCIe 配置空间

PCIe配置空间是设备与主机交互的关键接口,包含256字节的传统配置空间和最大4KB的扩展空间。主机通过配置读/写TLP访问设备寄存器,实现设备识别、资源分配和参数配置。核心功能包括读取设备ID、配置BAR寄存器、设置中断参数和管理PCIe链路。配置空间采用三层架构设计,兼容x86/ARM等不同平台。驱动开发中需关注BAR寄存器、命令/状态寄存器等关键区域,用于设备初始化和故障诊断。该机制保证了主机能统一管理不同厂商的PCIe设备,是PCIe体系结构的重要基础。

2026-01-29 09:06:12 557

原创 SERDES 编码

摘要:SERDES编码是高速串行传输的核心技术,通过解决时钟恢复、直流平衡、错误检测和帧同步四大问题,确保可靠传输。主流编码方式包括8b/10b(低速)、64b/66b(中高速)和128b/130b(超高速),编码效率依次提升。8b/10b编码严格保证直流平衡和跳变密度,但效率较低;64b/66b和128b/130b通过帧头和扰码简化设计,提高效率。编码需与协议(如PCIe、以太网)适配,并与扰码协同工作,避免长串0/1和EMI问题。未来趋势包括更高编码效率、与调制深度融合及低功耗实现。常见问题包括编码配置

2026-01-28 09:02:16 738

原创 PCIe 事务层(TL)

PCIe事务层是协议栈最上层,负责主机与设备间的事务交互。它将软件请求转换为标准事务层报文(TLP),处理响应、排序和地址翻译等核心功能。事务层采用软硬件协同实现,硬件处理报文组装/拆解,软件负责配置管理。支持四大地址空间(内存/IO/配置/消息)和三类事务(发布/非发布/完成),通过TLP实现端到端传输。关键机制包括:严格的事务排序规则、BAR地址映射、基于MPS/MRRS的流量控制、8级TC优先级调度以及分级异常处理。Linux内核通过PCI子系统封装TLP操作,提供标准设备访问接口,完成枚举、初始化和

2026-01-28 09:01:35 1078

原创 PCIe 数据链路层(DLL)

PCIe数据链路层(DLL)作为协议栈中间层,主要承担可靠数据传输功能。它通过CRC校验、自动重传(ARQ)和按序交付机制,确保事务层报文(TLP)的无差错传输。该层采用硬件实现核心功能,包括:1)差错检测(CRC32校验);2)差错恢复(基于ACK/NAK的重传机制);3)流量控制(信用值管理);4)多通道调度。与物理层和事务层不同,数据链路层完全由硬件实现,软件仅负责参数配置和状态监控。从PCIe1.0到6.0版本,其核心机制保持稳定,主要在缓存容量和硬件并行化方面进行优化以适应速率提升。在Linux内

2026-01-28 09:01:11 764

原创 PCIe 物理层

PCIe物理层(PCIe PHY)是PCIe协议栈的最底层实现,负责将数据链路层报文转换为高速串行差分信号。其核心功能包括时钟同步、等化补偿、链路训练和多通道聚合等,完全遵循PCIe 1.0-6.0标准。物理层采用分层架构(PCS/PMA/PMD),与SERDES深度集成,向上通过PIPE接口对接数据链路层。关键模块包括编码/扰码模块、自适应等化模块、多通道对齐模块等。链路训练状态机(LTSSM)是物理层的核心,自动完成链路建立和维护。在Linux内核中,PCIe PHY驱动主要负责硬件初始化、参数配置和状

2026-01-28 09:00:42 546

原创 SERDES 高速接口

SERDES(串行器/解串器)是一种实现高速数据传输的关键硬件模块,通过并串转换将低速并行信号转为高速串行信号传输,再通过串并转换还原。其核心架构分为物理编码子层(PCS)处理低速并行域编码,物理介质附件层(PMA)处理高速串行域信号转换。SERDES采用时钟嵌入、自适应均衡和编码技术(如8b/10b、64b/66b)解决信号衰减、时钟同步等问题,支持多通道聚合(如4×25Gbps=100Gbps)。该技术广泛应用于PCIe、以太网、USB等高速接口,显著提升传输速率、减少线路数量并降低干扰,是现代计算机、

2026-01-28 09:00:23 791

原创 SERDES 自适应等化

摘要:SERDES自适应等化是高速串行传输(≥25Gbps)中的关键技术,通过动态调整TX/RX等化参数补偿链路损耗和码间干扰。它采用"检测-计算-调整"闭环机制,包含信号质量检测、参数决策和调整三大模块,支持TX+RX联合自适应。该技术能自动适配不同介质和长度的物理链路,解决固定参数无法应对链路多样性和动态变化的问题。典型实现包括CTLE、DFE等基础等化模块,并与链路训练深度联动。性能指标包括补偿损耗、收敛时间等,调试时需关注眼图质量、BER和寄存器状态。

2026-01-27 10:21:49 862

原创 SERDES 时钟同步

SERDES时钟同步技术是高速串行传输的核心挑战,需解决单通道时钟恢复、多通道相位对齐及系统级同步三大问题。其关键技术包括:通过线路编码保证跳变密度、发送端时钟嵌入数据流、接收端CDR提取及PLL/DLL闭环锁定。多通道同步需采用公共参考时钟和通道对齐标记,系统级同步则依赖全局时钟架构或协议层同步机制。常见问题包括CDR未锁定、通道失步等,需通过信号质量检测、寄存器状态分析及环回测试进行排查。该技术性能指标直接影响传输质量,是高速互联设计的关键难点。

2026-01-27 09:59:46 562

原创 PCIe 整体浅析

PCIe是一种高速串行计算机扩展总线标准,取代传统并行PCI/PCI-X接口,具有串行差分传输、点对点拓扑、可扩展通道数等优势。其四层协议架构(物理层、数据链路层、事务层、应用层)确保兼容性,接口类型包括板卡插槽、M.2/U.2和工业连接器。PCIe供电能力随接口类型变化,从25W到300W+不等,广泛应用于消费电子(显卡、SSD)、服务器(网卡、加速卡)、工业设备(采集卡、控制卡)等领域,凭借高带宽、低延迟特性成为高速外设的核心接口标准。

2026-01-27 08:55:50 1095

原创 MIPI DSI/MIPI CSI-2/LVDS高速串行接口

MIPI DSI/MIPI CSI-2/LVDS高速串行接口

2026-01-27 08:55:20 872

原创 CAN/CAN FD/LIN车载 / 工业串行通信总线

CAN/CAN FD/LIN车载 / 工业串行通信总线

2026-01-27 08:54:58 813

原创 SPI/QSPI/OctoSPI/MICROWIRE串行同步通信总线

SPI/QSPI/OctoSPI/MICROWIRE串行同步通信总线

2026-01-26 11:18:13 452

原创 UART/RS232/RS485/RS422/USART串行通信总线

UART/RS232/RS485/RS422/USART串行通信总线

2026-01-26 10:50:08 816

原创 嵌入式常用通讯接口

嵌入式常用通讯接口,uart/rs232/rs485,spi/qspi/octoSPI,i2c/smbus,can/can fd/lin,mipi/lvds,pcie,以太网/RJ45,mdio,mii/gmii/rmii/rgmii/2.5g rgmii/sgmii/xgmii/xaui/sfp+

2026-01-26 09:08:57 910

原创 Linux 内核IO调度器 交互式进程检测

本文介绍了Linux I/O调度器中交互式进程检测机制,重点分析了CFQ和BFQ调度器的实现原理。CFQ通过thinktime阈值识别交互式进程,给予更优的I/O资源分配。BFQ则采用更先进的多维度动态评估机制,通过预算、权重等参数实时调整调度策略,并引入动态标签机制实现更精准的进程分类和资源分配。文章详细比较了两者的差异,指出BFQ在识别精度、自适应能力和公平性方面的优势,最后提供了关键可配置参数及其优化建议。该机制有效解决了用户交互进程与后台批量I/O的资源竞争问题,显著提升了系统响应速度。

2026-01-26 09:06:35 710

原创 Linux 内核 kyber调度器

Kyber是Linux内核4.13引入的极简IO调度器,专为NVMe SSD等低延迟存储设备设计。它采用按IO类型分队列的极简架构,通过延迟控制器动态调整派发速率,在保证延迟目标(读1ms/写10ms)的前提下最大化吞吐量。相比CFQ/BFQ,Kyber摒弃了进程级队列和交互式检测,CPU开销降低30%以上,完美适配多队列SSD的并行特性。目前已成为主流Linux发行版对NVMe设备的默认调度器,特别适合数据库、云服务器等高并发场景,但在HDD和需要进程级公平性的场景仍推荐使用BFQ。

2026-01-26 09:06:17 626

Cortex-M3权威指南Cn

Cortex-M3权威指南Cn,Cortex-M3,m3,arm,

2010-12-17

MFC类库详解中文版

MFC类库详解中文版,MFC的MSDN library,

2010-12-17

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

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