自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 使用代码对PID相关源码进行验证

Linux 进程创建与遍历机制分析 核心发现 统一的进程创建路径:Linux 6.1及后续版本中,所有可调度任务(包括用户进程、内核线程)都通过copy_process()创建,唯一的例外是初始的swapper/0(PID 0)。 进程/线程组织方式: 线程组长通过init_task.tasks链表纳入全局进程视图 普通线程通过thread_group和signal->thread_head链表关联到所属线程组 遍历机制: 内核提供do_each_thread/while_each_thread宏遍历

2025-10-17 18:00:50 953

原创 Linux进程-PID

摘要 Linux系统中的PID(进程标识符)不仅是用户空间看到的整数标识,在内核中它被抽象为struct pid数据结构,以解决PID复用、进程引用管理等问题。随着多线程、容器技术的引入,PID的复杂性增加,包括线程组ID、进程组ID等不同语义,以及跨命名空间的PID隔离机制。PID命名空间允许不同容器中的进程拥有独立的PID空间,实现进程隔离。内核通过nsproxy结构管理命名空间,并采用延迟生效策略确保新命名空间的正确初始化。这种设计既保证了进程管理的灵活性,又支持了容器化技术的资源隔离需求。

2025-10-14 17:18:36 1037

原创 区分一下用户进程,用户线程,内核线程

Linux内核通过任务结构体(task_struct)统一管理进程、线程和内核线程。进程拥有独立用户空间,线程是共享用户空间的轻量级进程,而内核线程则没有用户空间。三者区别在于:1)普通进程(如bash)通过fork创建;2)线程(如pthread)通过clone共享地址空间;3)内核线程(如kswapd)通过kthread_create创建运行纯内核代码。内核采用这种分层设计实现了对硬件资源的统一管理和高效调度。

2025-10-10 15:50:39 767

原创 GDB调试内核 常用指令

2、查看内存管理信息 查看当前系统​的​内存信息​: cat /proc/meminfo 查看​NUMA​节点的内存信息​: numactl -H 查看​NUMA​节点的内存分布​: cat /sys/devices/system/node/node*/meminfo 查看​NUMA​节点的内存使用情况​: cat /proc/zoneinfo 查看​NUMA​节点的内存访问延迟​: numactl --show 查看​NUMA​节点的内存分配策略​: cat /proc/sys/vm/numa_balan

2025-09-16 15:37:26 976

原创 Linux内核调试-gdb篇

这篇文章介绍了QEMU的编译安装和Ubuntu文件系统的制作方法。主要内容包括: QEMU源码编译安装步骤: 安装依赖库 下载源码(提供wget和git两种方式) 编译安装(注意配置问题和locale错误解决方法) Ubuntu文件系统制作流程: 下载ubuntu-base镜像 安装必要的依赖软件 配置DNS解析和软件源(使用清华镜像源) 添加qemu-aarch64-static支持仿真运行 提供挂载脚本用于管理根文件系统挂载 文章详细说明了每个步骤的具体操作命令和可能遇到的问题解决方法,适合需要在ARM

2025-09-15 09:44:24 833

原创 使用 GDB 调试 QEMU 虚拟机:完整指南

本文详细介绍了如何利用QEMU的GDB调试功能进行系统级代码的开发与调试。主要内容包括:1)配置QEMU启动参数启用GDB调试支持;2)连接GDB进行基本调试操作;3)实用调试技巧(断点设置、多核调试、物理内存查看等);4)高级选项(单步执行调整、内存模式切换);5)安全注意事项。文章重点讲解了如何克服KASLR、多核调试等复杂场景下的调试挑战,并对比了不同模拟模式下的调试特性差异,为开发操作系统内核和底层系统软件提供了全面的调试指导。

2025-09-12 13:47:58 1504

原创 Linux内核中的双向链表

本文介绍了Linux内核中双向链表的基本实现和相关操作宏。首先解释了双向链表的结构体定义和初始化方法,然后详细分析了几个关键宏的实现原理,包括list_first_entry、list_next_entry和list_entry_is_head等。重点讲解了container_of宏的工作原理和使用限制,强调了它只能通过成员地址反向查找结构体地址,而不能通过指针指向的内容查找。最后通过list_for_each_entry的遍历示例,展示了如何通过这些宏实现链表的遍历操作。这些宏定义都基于container

2025-08-26 14:19:12 340

原创 编写第一个BPF程序

摘要:eBPF技术自2014年发展以来,已成为内核顶级子系统,在观测、安全和网络领域广泛应用。本文介绍了eBPF的起源和发展,重点阐述了如何开发eBPF程序。eBPF程序由内核态BPF代码和用户态加载器组成,开发方式包括BCC框架、bpftrace等工具,以及基于libbpf的现代开发模式。文章详细讲解了使用libbpf-bootstrap框架开发"Hello World"级BPF程序的完整流程,包括环境搭建、程序编写、编译和运行。随着BTF和CO-RE技术的引入,eBPF程序的可移植性

2025-08-26 14:10:38 809

原创 打开linux内核的企鹅log

通过配置选项增加企鹅log

2024-05-11 09:54:06 1287

原创 fb设备驱动框架分析

在Linux中,每个字符设备都有一个唯一的主设备号。你可以静态地分配一个主设备号,或者动态地从内核获取一个未使用的主设备号(一般使用动态获取即可)。

2024-05-10 19:14:42 1685

原创 设置LCD为第二终端

使用LCD作为第二个终端

2024-05-09 10:04:46 552

原创 IMX6Ull驱动学习-“原汁“kernel

通过官方的内核源码,修改一份自己的方便之后做驱动开发的学习。

2024-05-08 11:56:14 476

原创 Linux内核中的内联汇编

内联汇编是一种在高级编程语言(如C或C++)中直接嵌入汇编代码的技术。这种方法允许程序员在源代码中直接插入汇编指令,从而实现对底层硬件的更直接控制和优化。内联汇编通常使用asm关键字将汇编代码嵌入到C/C++源代码中。

2024-05-06 13:27:33 1267

原创 Linux内核中的链表浅析

Linux内核中经常使用双向链表数据结构来管理各种资源和数据。双向链表允许双向遍历,即可以从头到尾,也可以从尾到头。每个链表节点都包含指向前一个节点和后一个节点的指针。

2024-05-05 17:10:29 314

原创 Linux内核中的进程调度-调度器基础

本文全面探讨了Linux内核的调度器机制,首先从基础概念入手,阐述了调度器在操作系统中扮演的角色——负责管理和协调系统中各个进程对CPU资源的访问,确保系统整体性能和响应能力。文章深入解析了Linux内核对调度器的具体实现。

2024-04-01 12:01:28 2786 2

原创 Linux内核中的进程调度-进程调度基础

在深入探讨Linux内核的精妙世界中,进程调度无疑是最具挑战性也最为关键的一个环节。它作为操作系统核心功能的一部分,犹如交响乐团中的指挥家,精准而高效地协调着系统中各个进程的执行顺序和时间分配,确保整个系统的性能表现与资源利用达到最佳平衡。Linux内核的进程调度器不仅负责决定哪个进程将在CPU上运行,何时运行,还涉及到优先级管理、实时性保证、多处理器调度策略等诸多复杂问题。

2024-03-26 21:20:02 1702 1

原创 Linux内核架构和基础概念

随着Linux内核在全球市场份额的持续扩大,其影响力已深深渗透至各行各业,尤其在服务器领域乃至我们所熟知的前沿行业,更是彰显出无可匹敌的重要性。因此,本系列文章旨在系统性地记录我深入探索与学习Linux内核过程中的心得体会与关键笔记。本文主要是描述一下内核学习过程中的一些常用的概念,宏内核和微内核,内核架构等等。

2024-03-26 11:29:53 2142

原创 Qt中对主窗口的一些基本操作

一,给主窗口添加背景我们在做Qt项目的时候,难免需要在主场口上面添加背景图片,一般有两种方法来实现这一功能,可以在主窗口上面粘贴一个很大的QLabel然后在QLabel上面绘制图片,一般不会这样做,另外一种放法我们就需要重写绘制事件函数。paintEvent事件是在窗口状态改变之后处罚的,窗口的状态改变,可以是大小改变,也可以是别的。如下:头文件:protected: //只要窗口状态改变自动调用此函数 //需要绘制窗口必须通过此函数实现 //重新绘图函数 void

2021-06-18 18:51:48 607

原创 深度CV基础——图像噪声和滤波

一,图像噪声1.图像噪声的概念:图像噪声是图像在获取或是传输过程中受到随机信号干扰,妨碍人们对图像理解及分析处理的信号。很多时候将图像噪声看做多维随机过程,因而描述噪声的方法完全可以借用随机过程的描述, 也就是使用随机过程的描述,也就是用它的高斯分布函数和概率密度分布函数。图像噪声的产生来自图像获取中的环境条件和传感元器件自身的质量,图像在传输过程中产生图像噪声的主要因素是所用的传输信道受到了噪声的污染。2.信噪比:在噪声的概念中,通常采用信噪比(Signal-Noise Rate, SNR)衡量

2021-05-02 15:45:10 3205

原创 深度学习基础——使用keras全连接实现mnist

概述:一,数据集介绍:Mnist数据集分为两部分,分别含有60000张训练图片和10000张测试图片,图片内容就是0-9的数字。每一张图片包含28*28个像素。注:对于mnist数据集在keras的datasets里面存在直接导入即可,第一次可能需要下载有点慢。二,使用全连接层实现mnist数据集的分类1.导入需要的模块# 常用的科学计算库import numpy as np# 导入我们所用到的mnist数据集from keras.datasets import mnist# 导入所用

2021-04-06 00:34:45 842

原创 Qt中的线程详解

概述:在多核时代,CPU 的主频已经进入瓶 颈,另辟蹊径地提高程序运行效率就是使用线程,充分利用多核的优势。线程可以看做是“轻量级进程”,线程即可以由操作系统管理,也可以由应用程序管1.为什么要使用线程:我们都知道,进程线程的概念是非常重要的,也可以看看Linux下的线程,一般是在多任务的时候需要用到线程进程,说简单一点处理多核可以跑多个while(1)之外,进程线程也可以跑多个while(1)我们使用一个定时器和LCD显示定时器的计数.比如以下示例:Widget::Widget(QWidget

2021-02-27 13:50:44 10587 1

原创 STL中的算法简述

1.函数对象:概述:重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是 行为类似函数的对象,也叫仿函数(functor),其实就是重载“()”操作符,使得类对象 可以像函数那样调用。1.1注意:.函数对象(仿函数)是一个类,不是一个函数。函 数对象(仿函数)重载了”() ”操作符使得它可以像函数一样调用。1.2分类:假定某个类 有一个重载的 operator(),而且重载的 operator()要求获取一个参数,我们就将这 个类称为“一元仿函数”(unary

2021-02-25 22:14:27 239

原创 STL中常用的容器——stack,queue和list容器

一,stack容器1,stack容器概述:stack 是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口,形式 如图所示。stack 容器允许新增元素,移除元素,取得栈顶元素,但是除了最顶端 外,没有任何其他方法可以存取 stack 的其他元素。换言之,stack 不允许有遍历 行为。 有元素推入栈的操作称为:push,将元素推出 stack 的操作称为 pop.如下:2.stack迭代器Stack 所有元素的进出都必须符合”先进后出”的条件,只有 stac

2021-02-21 19:13:51 984

原创 STL中常用的容器——deque容器

1.基本概念:Vector 容器是单向开口的连续内存空间,deque 则是一种双向开口的连续线性空 间。所谓的双向开口,意思是可以在头尾两端分别做元素的插入和删除操作,当 然,vector 容器也可以在头尾两端插入元素,但是在其头部操作效率奇差,无法被 接受。2.Deque容器和vector容器比较:Deque 容器和 vector 容器最大的差异,一在于 deque 允许使用常数项时间对头端 进行元素的插入和删除操作。二在于 deque 没有容量的概念,因为它是动态的以 分段连续空间组合而成,随时

2021-02-21 11:39:58 290

原创 STL中常用的容器——vector容器

1,基本概念vector 的数据安排以及操作方式,与 array 非常相似,两者的唯一差别在于空间的 运用的灵活性。Array 是静态空间,一旦配置了就不能改变,要换大一点或者小一 点的空间,可以,一切琐碎得由自己来,首先配置一块新的空间,然后将旧空间的 数据搬往新空间,再释放原来的空间。Vector 是动态空间,随着元素的加入,它 的内部机制会自动扩充空间以容纳新元素。2,vector的迭代器:Vector 维护一个线性空间,所以不论元素的型别如何,普通指针都可以作为 vector 的迭代器,因为

2021-02-20 12:56:18 319

原创 STL中常用容器——string容器

概述:

2021-02-19 10:18:04 271

原创 STL中的迭代器举例详解

介绍了STL中的迭代器访问容器和迭代器配合算法去访问容器,容器介绍了存储基础类型的容器和存储自定义类型的容器以及存储容器的容器。

2021-02-19 08:00:10 662

原创 C++中的STL简单介绍

一,STL基础概念STL(Standard Template Library,标准模板库),是惠普实验室开发的一系列软件的 统 称。现在主要出现在 c++中,但是在引入 c++之前该技术已经存在很长时间 了。STL 从广义上分为: 容器(container) 算法(algorithm) 迭代器(iterator),容器 和算法之间通过迭代器进行无缝连接。STL 几乎所有的代码都采用了模板类或者 模板函数,这相比传统的由函数和类组成的库来说提供了更好的代码重用机会。 STL(Standard Templa

2021-02-18 18:50:41 8096 1

原创 Python中的numpy模块简述

简要说明了Python语言的numpy模块的基本用法,概括了一些矩阵的操作,元素操作和利用索引值操作最后介绍了矩阵的合并和分割。

2021-01-23 21:54:17 677 3

原创 Python基础简单概述

简单概述了Python基础,其中的一些内容和C中的或者C++中进行了对比,理解更容易。

2021-01-22 21:00:14 526

原创 Qt中使用Tcp传输文件

概述:TCP提供一种面向连接的、可靠的字节流服务。面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据包之前必须先建立一个TCP连接。这一过程与打电话很相似,先拨号振铃,等待对方摘机说“喂”,然后才说明是谁。在一个TCP连接中,仅有两方进行彼此通信。TCP传输数据的时候是很少出现丢包情况的,因为它本身的特点,看百度输出文件的过程:实现服务端选择文件给客户端发送:过程如下:...

2021-01-16 21:26:44 3560 8

原创 Qt中的简单tcp通信

使用Qt中tcp实现简单的字符发送

2020-12-28 19:19:49 770

原创 Qt中使用流读写文件

总结了二进制数据流和文本流的文件读写方法以及注意的地方最后加上了QBuffer来配合数据流读写数据

2020-12-28 13:22:20 5376

原创 Qt中的QFile读写文件

概述:文件操作是应用程序必不可少的部分。Qt 作为一个通用开发库,提供了跨平台 的文件操作能力。Qt 通过 QIODevice 提供了对 I/O 设备的抽象,这些设备具有 读写字节块的能力。下面是 I/O设备得类图(Qt5):1,QIODevice:所有 I/O 设备类的父类,提供了字节块读写的通用操作以及基本接口;2,QFileDevice:Qt5 新增加的类,提供了有关文件操作的通用实现。3,QFlie:访问本地文件或者嵌入资源;4,QTemporaryFile:创建和访问本地文件系统的临时

2020-12-27 20:41:33 2446 1

原创 Qt中的事件(一)

总结了事件的基本概念和用法并且举例了基本的鼠标事件和一个自身产生的定时器事件。

2020-12-24 19:09:41 694 1

原创 Qt中的对话框(二)——文件对话框

编写一个简单的文本 文件编辑器,我们将使用 QFileDialog 来打开一个文本文件,并将修改过的文件 保存到硬盘。

2020-12-23 20:37:28 1189

原创 Qt中的对话框(一)

对话框概述:对话框是 GUI 程序中不可或缺的组成部分。很多不能或者不适合放入主窗口的 功能组件都必须放在对话框中设置。对话框通常会是一个顶层窗口,出现在程序 最上层,用于实现短期任务或者简洁的用户交互。Qt中对话框实现使用的是 QDialog 类。就像主窗口一样,我们通常会设计一个类继 承 QDialog。关于QDialog(及其子类,以及所有 Qt::Dialog 类型的类)其 parent 指针:如果 parent 为 NULL,则该对话框会作为一个顶 层窗口,否则则作为其父组件的子对话框(

2020-12-23 17:27:38 890

原创 Qt中的布局管理器

概述:所谓 GUI 界面,归根结底,就是一堆组件的叠加。我们创建一个窗口,把按钮放上面,把图标放上面,这样就成了一个界面。在放置时,组件的位置尤其重要。我们必须要指定组件放在哪里,以 便窗口能够按照我们需要的方式进行渲染。这就涉及到组件定位的机制。Qt 提供了两种组件定位机制:绝对定位和布局定位。绝对定位:绝对定位就是一种最原始的定位方法:给出这个组件的坐标和长宽值。这样,Qt 就知道该把组件放在哪里以及如何设置组件的大小。但是这样做带来的一个问题是,如果用户改变了窗 口大小,比如点击最大化按钮或者使

2020-12-22 19:46:16 345 1

原创 Qt中的QMainWindow学习

概述:QMainWindow 是 Qt 框架带来的一个预定义好的主窗口类。一些经典的主窗口,通常是由一个标题栏,一个菜单栏,若干工具栏和一个任务栏。在这些子组件之间则是我们的工作区(文本编辑器的文本编辑区)。事实上QMainWindow 就是这样的 布局。比如下面的EditPlus布局1,QMainWindow的组成其实对于QMainWindow主要是下面的几部分<1>主窗口的最上面是 Window Title,也就是标题栏,通常用于显示标题和控制按钮,比如最大化、最小化和关闭等。

2020-12-22 19:14:16 635

原创 Qt中的QlineEdit

概述:QLineEdit 类代表编程框,它可以让用户输入一个单行文本。类似于登录窗口中的账号和密码的输入框(行编辑)1,构造函数:QLineEdit (QWidget *parent = 0); QLineEdit(const QString &contents, QWidget *parent = 0);其中 contents 表示编辑框中显示的内容。2,属性(1)alignment 属性表示显示文本的对齐方式,相关成员函数如下:int maxLength() const; //

2020-12-17 11:18:51 3883 2

空空如也

空空如也

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

TA关注的人

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