- 博客(676)
- 资源 (29)
- 收藏
- 关注
原创 linux内核 - 内核不是一个进程,而是一个系统。
内核代码在三个主要上下文中执行:(1) 通过用户进程发起的系统调用,(2) 通过硬件触发的中断处理程序,以及 (3) 在完全在内核空间中运行的长期内核线程中执行。引导加载程序加载后,内核开始在 start_kernel() 中执行,在那里它初始化内存管理、设备接口和核心子系统。相反,它成为一个响应式执行层,仅在需要时调用——由用户进程、硬件事件或它自己的内部线程调用。相反,它始终存在(在启动时加载到内存中),并控制硬件和软件之间的所有交互。简而言之,内核不是系统内的一个进程,而是系统的核心。
2025-09-02 10:36:21
106
原创 linux内核 - 文件系统相关的几个概念介绍
Ext2是Linux核心文件系统,设计优化了与Linux的互操作性,也可用于其他系统。其后续版本Ext3在保持兼容性的基础上增加了日志功能,提升了系统崩溃后的恢复能力。两者基本原理相同,但Ext3提供了更多实用选项。本章将重点介绍Ext3的日志机制及其优势。
2025-09-01 23:48:37
52
原创 CUDA编程11 - CUDA异步执行介绍
CUDA Stream 是一条GPU命令队列,同一条GPU命令队列中的任务按顺序执行,比如下面这个调用会严格按顺序执行。不同Stream之间(stream0, stream1,...)的任务,可能并行执行(取决于GPU硬件)。CUDA Event 是插在 Stream 里的“标记点”, 主要用途是“计时”, “查询进度”,“同步” 等。// 一些 GPU 操作// GPU 还没执行到 stopcounter++;
2025-09-01 22:38:00
185
原创 linux 内核 - 常见的文件系统介绍
目前 Linux 最常用,支持大文件、大分区、日志、延迟分配,性能和稳定性都很好。SUSE/openSUSE、Fedora、Ubuntu 都在推广。由 SGI 开发,擅长大文件和高并发场景(日志文件、数据库)。曾经以小文件性能著称,现在基本被 Btrfs/ext4 取代。针对 Flash/SSD 优化,移动设备和嵌入式系统用得多。支持快照、子卷、压缩、数据校验、RAID 等高级功能。IBM 开发,日志文件系统,资源占用小但使用较少。:早期标准文件系统,不支持日志。:增加了日志功能,提升可靠性。
2025-08-31 23:57:41
192
原创 CUDA编程10 - CUDA Samples 在ubuntu 24.04 上编译安装, 解决Unsupported gpu architecture ‘compute_xxx‘的问题
本文介绍了cuda-samples项目的编译安装流程:1)克隆项目仓库;2)安装CMake、FreeImage等依赖库;3)查询GPU架构并修改多处CMakeLists.txt文件以适配当前硬件;4)创建build目录并使用CMake配置构建选项;5)使用make命令进行多线程编译;6)可选执行安装。重点说明了需要修改多处CMakeLists.txt文件来避免GPU架构不兼容问题,并给出了详细的文件列表。
2025-08-31 23:48:53
167
原创 渲染引擎实践 - 如何拉取Unreal Engine 完整代码(所有分支和标签)
本文介绍了下载和编译Unreal Engine源码的完整步骤:1)注册/登录Epic Games和GitHub账号并绑定;2)访问Unreal私有仓库;3)提供三种源码下载方式(ZIP下载、Git克隆、Fork方式);4)最后以Linux为例说明编译流程(运行Setup.sh、GenerateProjectFiles.sh和make命令)。整个过程涵盖了从账号准备到最终编译的完整指南。
2025-08-30 01:10:14
188
原创 驱动开发系列68 - GLSL编译器实现 - 算数指令折叠及访存优化
指令优化技术分析与实现 本文介绍了两种指令优化技术:指令折叠和访存优化。指令折叠通过合并乘法指令(MUL)和乘加指令(MAD),减少指令数量和寄存器占用,提升执行效率。文中给出了具体示例和C++实现代码,展示了如何将3条指令优化为2条。访存优化部分针对GPU内存访问性能问题,提出统一按字节计算偏移、分割大访问为多条burst等技术,特别处理了vec3/vec4等非标准长度向量类型,提供了C++实现方案。这些优化技术可有效减少指令数量、降低寄存器压力、提升内存访问效率。
2025-08-28 23:59:40
829
原创 驱动开发系列67 - NVIDIA 开源GPU驱动open-gpu-kernel-modules分析-驱动初始化
NVIDIA驱动初始化流程涉及两个关键函数:nvidia_init_module和nvkms_init。nvidia_init_module是驱动加载总入口,负责初始化内存调试、procfs节点、GPU设备探测、PCI驱动加载、字符设备注册等核心功能,采用分层错误处理机制确保资源正确释放。nvkms_init专门初始化Kernel Mode Setting子系统,包括资源管理器分配、内核线程队列创建、定时器初始化、字符设备注册和配置文件读取,同样配备完善的错误处理流程。两个函数都包含详细的日志输出和错误检查
2025-08-28 23:40:09
402
原创 linux 环境下 - 切换显卡(intel,nvidia)
使用nvidia-prime切换显卡的方法:首先克隆官方GitHub仓库,进入目录后执行安装命令,最后通过nvidia-prime-select指令选择NVIDIA或Intel显卡。该方案提供官方支持,适合需要稳定切换显卡的用户。
2025-08-25 23:54:51
212
原创 linux环境下 - 如何干净地卸载掉nvidia驱动
本文介绍了彻底卸载NVIDIA驱动的详细步骤:1)对于apt安装的驱动,使用dpkg -l|grep nvidia查看后,执行sudo apt purge 'nvidia-*'卸载;2)对于.run安装包,运行sudo nvidia-uninstall卸载;3)清理步骤包括更新initramfs和grub,重启系统;4)删除残留内核模块,退出图形环境后执行modprobe -r移除模块;5)可选清理用户态驱动库;6)最后更新模块依赖并重启验证。通过完整执行这些步骤,可确保系统完全清除NVIDIA驱动及其相关
2025-08-25 22:45:49
552
原创 linux内核 - I/O 端口和I/O内存
计算机系统中,RAM作为核心外设由内核管理,通过共享总线与其他内存映射设备通信(内存映射I/O)。32位系统中,CPU地址空间部分保留给外设(I/O内存),造成RAM访问空洞。解决方案包括内存映射I/O(统一寻址但地址受限)和端口I/O(专用指令访问,x86架构采用)。内核提供request_region()等函数管理I/O端口,支持in/out指令操作。两种方式各有优劣:内存映射简化编程但限制地址空间,端口I/O保留完整RAM访问但需专用指令。
2025-08-24 07:31:27
605
原创 linux内核 - 内存映射介绍
内核内存有时需要进行 重映射(remap),可能是从内核空间映射到用户空间,也可能是从高端内存映射到低端内存(内核空间内部的映射)。在一个 4 GB 的系统上,内核剩下的 128 MB 地址空间 用于映射剩余的 3.2 GB 高端内存(high memory)。而对于高端内存(超过低端 896 MB 的部分),内核需要将请求的高端内存区域 临时映射到内核地址空间,前面提到的 128 MB 地址空间就是专门为此保留的。内核会将对该映射内存区域的访问,通过常规的指针解引用,转换为对应的文件操作。
2025-08-24 07:30:58
340
原创 linux内核 - vmalloc 介绍
本文介绍了Linux内核中的vmalloc()分配器,它分配虚拟地址连续但物理内存不连续的页帧,适用于分配大块内存(如网络缓冲区)。相比kmalloc(),vmalloc()更慢但能处理更大的内存请求。文章还提供了vmalloc()的基本用法示例模块代码,展示如何分配、初始化和释放vmalloc内存,并输出调试信息。该分配器返回的地址仅适用于内核软件使用,不能用于DMA操作。
2025-08-23 20:59:33
287
原创 linux内核 - slab 分配器
Slab分配器是Linux内核中用于管理小块内存分配的核心机制,主要解决伙伴系统分配小内存时产生的碎片问题。它通过将内存划分为特定大小的Slab(由连续页框组成)来管理对象,每个Slab分为相同大小的块。Cache则是由多个Slab组成的链表,专门存放同一类型的内核对象。Slab有三种状态:空(所有块空闲)、部分使用(含空闲和已使用块)和已满(所有块被占用)。这种设计显著提升了内存分配效率,同时减少了内存碎片。
2025-08-23 20:18:01
350
原创 linux内核 - 内存分配机制介绍
Linux内核采用分层内存分配机制:页分配器以页为单位提供基础内存;其上的slab分配器将内存页分割为更小单元,支持kmalloc API;此外内核还提供直接分配虚拟内存的vmalloc接口。不同分配方式满足各类内存需求,开发者可根据用途选择最合适的机制。
2025-08-21 23:35:54
164
原创 linux内核 - 内存管理单元(MMU)与地址翻译(二)
在 Linux 内核中,struct task_struct 表示一个进程的描述,其中有一个成员 mm,类型为 struct mm_struct,用于描述和表示进程的内存空间。在这样的系统上(32 位),每个进程拥有独立的 3 GB 用户地址空间,我们需要 786,432 个页表项来覆盖并描述一个进程的整个地址空间。当一个进程需要读取或写入某个内存位置时(这里指的是虚拟内存),MMU 会通过该进程的页表进行地址转换,找到对应的页表项(PTE)。直到找到最终的页表项(PTE),获得对应的物理页。
2025-08-20 23:35:52
623
原创 linux 内核 - 内存管理单元(MMU)与地址翻译(一)
它们使用页表作为翻译表,每个页表项的索引就是虚拟页号,而该索引对应的值就是 PFN(页帧号)。当需要通过虚拟内存访问物理内存时,操作系统首先会提取偏移量和虚拟页号,然后遍历该进程的页表,将虚拟页号与物理页匹配。对于一个进程而言,它所需访问的任何页面都必须存在于该进程的某个 VMA 中,因此也必须记录在该进程的页表里(每个进程都有自己的页表)。在一个以 4 KB 为页大小的系统中,字节地址 0 到 4095 属于第 0 页,字节地址 4096 到 8191 属于第 1 页,以此类推。
2025-08-20 23:15:57
305
原创 驱动开发系列66 - GLSL编译器实现 - 如何添加内置函数
本文介绍了在GLSL语言中实现textureSamples内置函数的方法。以ARB_shader_texture_image_samples扩展为例,该扩展允许着色器查询多重采样纹理的样本数。文章详细说明了内置函数的定义过程,包括创建基类Builtin和处理参数、返回值等。通过TextureSamplesBuiltin派生类展示了具体实现,包括LLVM IR生成和GPU硬件指令映射。最后阐述了从GLSL到LLVM IR再到GPU驱动的完整流程,包括参数解析、硬件状态索引获取和最终GPU指令发出的过程,为开发
2025-08-19 22:57:21
328
原创 驱动开发系列65 - NVIDIA 开源GPU驱动open-gpu-kernel-modules 目录结构
NVIDIA显卡驱动架构分析:该驱动分为OS相关和OS无关两部分。OS相关部分包括多个内核模块,分别负责GPU初始化/显存管理(nvidia.ko)、图形接口支持(nvidia-drm.ko)、显示管理(nvidia-modeset.ko)、虚拟内存管理(nvidia-uvm.ko)以及多GPU通信(nvidia-peermem.ko)。OS无关部分包含核心功能代码和与开源驱动Nouveau集成的工具。这种分层设计既保证了与不同操作系统的兼容性,又提供了完整的GPU功能支持。
2025-08-19 21:57:22
535
原创 驱动开发系列64 - GLSL编译器实现 - 添加精度优化pass
glCompileShader将GLSL源码编译为GPU可执行代码的过程包括五个阶段:源码解析、语义检查、生成中间代码、优化(如精度优化、常量折叠等)和最终编译。其中精度优化pass会优化如normalize()函数的精度,通过LLVM pass提升执行效率。这一过程将抽象语法树逐步转换为优化的GPU机器码。
2025-08-18 23:42:23
815
原创 linux 内核 - 进程地址空间的数据结构
本文介绍了Linux内核中进程内存管理的两个关键数据结构:task_struct和mm_struct。task_struct表示进程实例,其中包含指向mm_struct的指针。mm_struct详细描述了进程的内存映射情况,包括页表(pgd)、用户栈(start_stack)、堆区(start_brk/brk)、数据段(start_data/end_data)、代码段(end_code)等关键内存区域的地址信息,以及映射区域基址(mmap_base)等。这些数据结构共同构成了Linux内核的进程地址空间管理
2025-08-18 20:34:36
330
原创 驱动开发系列63 - NVIDIA 开源GPU驱动open-gpu-kernel-modules编译调试
在Ubuntu系统上安装NVIDIA闭源驱动的步骤包括:1)更新系统包;2)添加NVIDIA官方PPA源;3)通过ubuntu-drivers检查可用驱动版本;4)安装指定版本驱动(推荐最新闭源版);5)重启后使用nvidia-smi验证;6)使用prime-select命令切换显卡模式(独显/集显/混合模式)。安装完成后需重启系统使驱动生效。
2025-08-16 09:03:43
212
原创 linux内核 - Linux 文件系统简介
Linux内核通过VFS层实现文件系统模块化设计,核心结构体super_block、inode、dentry和file协同工作:super_block代表文件系统实例,inode描述文件元数据,dentry缓存目录项提升性能,file表示进程打开的文件。VFS抽象统一接口,解耦用户空间与具体文件系统实现,支持多种文件系统共存。
2025-08-14 23:04:29
800
原创 linux 内核 - 内存管理的层次化结构
Linux内核内存管理采用层次化结构:最高层为内存节点(pglist_data),NUMA系统中每个节点对应一个pglist_data,UMA系统则只有一个;每个节点划分为多个内存域,用于处理不同硬件设备的访问限制;最底层是页帧(struct page),作为内存管理的最小单位。这种多级结构实现了对不同架构内存的统一管理。
2025-08-14 23:02:39
329
原创 linux 内核 - 内存管理概念
本文概述Linux内存管理的核心知识,包括主要数据结构和实现逻辑。Linux采用分页式内存管理,通过页表实现虚拟地址到物理地址的转换。关键数据结构包括内存描述符mm_struct、页描述符page、区域描述符zone等。实现逻辑涉及伙伴系统管理物理内存,slab分配器处理小对象分配,以及页面置换算法等机制。文章对这些核心概念进行了简要分析,帮助理解Linux内存管理的基本原理。
2025-08-13 22:54:54
637
原创 驱动开发系列62 - glBufferDataARB实现分析
本文分析了Mesa中glBufferDataARB的实现过程。该函数主要用于OpenGL缓冲区对象的存储分配和初始化,其调用链为:glBufferData → _mesa_BufferData → _mesa_buffer_data → buffer_data → _mesa_bufferobj_data → bufferobj_data → u_transfer_helper_resource_create → iris_resource_create → iris_resource_create_for
2025-08-13 22:50:45
512
原创 CUDA编程9 - 卷积实践
本文介绍了CUDA API中用于图像处理和纹理内存操作的关键组件。主要包括:1)cudaArray和cudaTextureObject_t用于纹理内存管理;2)cudaChannelFormatDesc描述数据格式;3)cudaMallocArray和cudaMalloc分配GPU内存;4)cudaResourceDesc和cudaTextureDesc定义纹理资源;5)cudaCreateTextureObject创建纹理对象;6)cudaMemcpyToSymbol用于主机到设备的数据传输;7)cuda
2025-07-30 23:13:51
132
原创 OpenGL进阶系列22 - OpenGL SuperBible - bumpmapping 例子学习
法线贴图是一种通过改变表面光照效果来模拟细节的技术,它不会增加模型的多边形数量。通过在贴图中存储表面法线信息,它能制造凹凸、划痕等视觉细节,使简单模型看起来更精细。这种"视觉欺骗"技术既能保持性能,又能提升画面真实感,广泛应用于游戏和图形渲染中,是效果与效率兼顾的优化方案。
2025-07-28 22:06:20
110
原创 linux 内核: 遍历当前所有进程
本文介绍了在Linux内核中安全遍历进程链表的方法。由于传统的tasklist_lock机制已被废弃,建议使用RCU(Read-Copy-Update)机制来实现并发安全的进程遍历。核心实现包括:1)使用rcu_read_lock()/rcu_read_unlock()保护进程链表;2)通过for_each_process宏遍历所有进程;3)使用get_task_struct()/put_task_struct()确保进程结构安全;4)打印进程信息(名称、TGID、PID、UID、EUID)。文章提供了完整
2025-07-15 23:31:38
241
原创 驱动开发系列61- Vulkan 驱动实现-SPIRV到HW指令的实现过程(2)
本文介绍了SPIR-V到LLVMIR转换的核心机制,重点分析了关键转换步骤。主要内容包括:1)创建llvm::Module模块,初始化LLVM上下文;2)定义目标架构,详细说明了LLVMTargetMachine、TargetSubtargetInfo和TargetLibraryInfoImpl三个辅助类的作用,分别用于表示目标架构配置、子架构特征描述和内置函数支持。这些步骤为后续SPIR-V到LLVMIR的语义转换奠定了基础。
2025-07-15 21:47:58
231
原创 linux 内核: 访问当前进程的 task_struct
文章摘要:本文介绍了在Linux内核模块中如何通过current宏获取当前进程信息。Linux采用单内核架构,所有模块运行在内核态,current宏指向task_struct结构体,可获取进程上下文信息。示例代码展示了如何显示进程名称、PID、TGID、UID、EUID、状态等关键信息,并区分进程上下文和中断上下文。模块初始化时打印进程信息,退出时再次显示。该技术可用于内核开发中的进程状态监控和调试。
2025-07-14 23:52:31
228
原创 驱动开发系列60- Vulkan 驱动实现-SPIRV到HW指令的实现过程(1)
1. vkCreateShaderModule 作用: 将已编译好的SPIR-V着色器代码加载到Vulkan中供GPU使用/*参数:device Vulkan 逻辑设备句柄(VkDevice)pCreateInfo 指向 VkShaderModuleCreateInfo 结构体,描述 SPIR-V 数据和大小pAllocator 自定义内存分配器(通常传 nullptr 使用默认分配器)pShaderModule 返回创建好的 VkShaderModule 句柄*/
2025-07-14 22:30:56
266
原创 C++ dijkstra 最短路径算法
Dijkstra算法是荷兰科学家Edsger W. Dijkstra于1956年提出的单源最短路径算法。该算法采用贪心策略,通过优先队列选择当前距离起点最近的节点,更新其邻居的最短路径。文章详细介绍了算法步骤:初始化距离、使用最小堆、松弛操作等,并提供了C++实现代码,包括邻接表构建、Dijkstra核心算法和测试用例。代码展示了如何计算两点间最短路径,处理不可达情况,并通过三个测试案例验证了算法的正确性(可达路径计算、更优路径选择及不可达情况处理)。
2025-07-08 21:59:39
360
翻译 AI论文阅读-注意力就是你所需的一切(Attention Is All You Need)
《Attention Is All You Need》 翻译 + 自己的理解
2025-07-07 20:37:47
73
1
原创 C++ 基于广度优先搜索(BFS)的拓扑排序算法
Kahn拓扑排序算法通过广度优先搜索处理有向无环图,时间复杂度O(V+E)。该算法不断选择入度为0的节点加入结果序列,若最终节点数不足则检测到环。摘要代码实现了一个Graph类,包含添加边和拓扑排序方法,并通过多个测试用例验证功能:包括多路径合并、复杂DAG、独立链合并及环检测。测试结果显示算法正确实现了拓扑排序,并能有效识别环结构。
2025-07-06 21:49:24
219
原创 C++ 语言特性31 - 协程介绍(2)
摘要:协程是一种可挂起与恢复执行的"高级函数",用于处理异步操作和数据生成等复杂场景。C++20引入协程支持,通过co_await和co_yield关键字实现非阻塞等待和生成器功能。协程概念早在1963年提出,现已被Python、JavaScript等现代语言广泛采用。C++函数的演进从基础函数到模板、lambda,最终在C++20迎来协程,实现了惰性求值和更灵活的流程控制能力。协程为C++带来了资源友好的异步编程方式,特别适合系统级开发需求。
2025-07-05 21:00:08
907
原创 C++ 基于深度优先搜索(DFS)的拓扑排序算法
本文介绍了基于深度优先搜索(DFS)的拓扑排序算法实现。算法通过递归遍历有向图的节点,在回溯时将节点压入栈中,最终获得拓扑排序的逆序。同时使用onstack数组检测图中是否存在环(回边)。文章提供了C++实现代码,包括Graph类、DFS函数和拓扑排序函数,并通过三个测试案例验证了算法的正确性:前两个测试展示了正常有向无环图的拓扑排序结果,第三个测试验证了环检测功能。当检测到环时,算法会抛出"cycle detected in graph"异常。
2025-07-05 11:25:57
192
OpenGL Programming Guide (Red Book) 9th Edition Source Code
2024-10-07
Learn LLVM 17 A beginners guide to learnin - Kai Nacke.pdf
2024-07-08
Power and Performance Software Analysis and Optimization pdf
2024-04-09
计算机图形学经典书籍资料-建模部分
2014-11-06
计算机图形学经典书籍资料-渲染部分
2014-11-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人