自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

czw

吾魂兮无求乎永生,竭尽兮人事之所能

  • 博客(279)
  • 资源 (3)
  • 收藏
  • 关注

原创 我的博客同步

种种原因,选择在博客园作为主要记录平台,这里仅作为同步。

2026-03-12 23:26:48 298

原创 Linux 多进程编程基础

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。通俗点讲,进程是一段程序的执行过程,是个动态概念。程序运行必须加载在内存中,当有过多的就绪态或阻塞态进程在内存中没有运行,因

2026-03-01 20:20:18 1004

原创 Linux多线程编程基础

根据POSIX标准,

2026-03-01 19:59:11 803

原创 死锁问题分析

所谓死锁,就是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力作用,它们都将无法推进下去,此时,系统处于死锁(Dead Lock)状态或系统产生了死锁,这些永远在相互等待的进程称之为死锁进程。由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下将会因为永远分配不到所必需的资源而无法继续运行下去,这就产生了死锁这一特殊现象。

2026-03-01 16:23:27 1136

原创 Linux内核学习——内存管理

PID: 进程IDUSER:进程所有者PR:进程优先级NI:进程nice值VIRT:进程使用的虚拟内存,单位KBRES:进程使用的并且未被换出的物理内存大小,单位KBSHR:共享内存大小,单位KBS:进程状态(D=不可中断睡眠状态,R=运行,S=睡眠,T=跟踪/停止,z=僵尸进程)%CPU:上一次更新到现在的CPU时间占用百分比%MEM:进程使用物理内存的百分比TIME+:进程使用CPU事件总计,单位10msCOMMAND:进程名或命令行。

2026-03-01 13:29:22 1088

原创 Linux内核学习——内核启动流程

实模式main函数:arch/x86/boot/main.c:main。检测并挂载procfs, sysfs: /proc/mounts。挂载真正根文件系统启动用户空间的/sbin/init。从CS:IP=FFFF:0000入口处载入BIOS。保护模式内核入口函数 0x100000处。从/etc/fstab挂载硬盘各个分区。Linux 内核启动函数 体系结构无关。载入GRUB到0x07C00处。读取/proc/cmdline。载入内核镜像vmlinuz。head.o偏移512处。创建内存rootfs。

2026-02-26 19:11:57 761

原创 Linux内核学习——模块机制

模块是内核中非常重要的机制,它为Linux内核向外提供了一个接口,其全称为动态可加载内核模块(Loadable Kernel Module)。Linux内核之所以提供模块机制,是因为它本身是一个单内核(monolithic kernel)。单内核的最大有点是效率高,其缺点是扩展性和维护性相对较差,模块机制就是为了弥补这一缺点。模块是具有独立功能的程序,他可以被单独编译但是不能单独运行。他在运行时被连接进内核作为内核的一部分在内核空间运行。

2026-02-26 19:07:32 410

原创 Linux内核学习——进程管理

写时复制(copy on write,COW)技术就是父进程在创建子进程时,不需要复制进程地址空间的内容给子进程,只需要复制父进程的进程地址空间的页表给子进程,这样父子进程就共享了相同的地址空间。start_kernel()上来就会运行 set_task_stack_end_magic(&init_task)创建初始进程。内核线程(Kernel Thread)其实就是独立运行在内核空间的进程,它和普通用户进程的区别在于内核线程没有独立的进程地址空间,它只能运行在内核空间,和普通进程一样参与到系统的调度中。

2026-02-26 19:07:00 893

原创 Linux内核学习——同步管理

u8 pending;u8 locked;#endif。

2026-02-26 19:02:48 1027

原创 Linux驱动学习——进程管理

编写一个用户进程,使用setpriority()来修改进程的优先级,然后使用getpriority()函数验证。编写一个用户程序,限制该程序的一些资源,比如进程的最大虚拟内存空间等。使用daemon函数,创建一个守护进程。会在指定的目录下每5s转存下内核日志。关于进程管理的介绍参考。

2026-02-26 11:38:00 384

原创 Linux驱动学习——内存管理

mem_map[]`数组来统计当前系统有多少个空闲页面、保留页面、swapcache页面、slab页面、脏页面、活跃页面、正在回写的页面等。分配一个物理页面,然后输出该物理页面的物理地址,并输出该物理页面在内核空间的虚拟地址。Linux 内核对每个物理页面都采用struct page。在Linux内核中,可以通过。来分配物理页面,也可以通过。

2026-02-09 23:59:08 481

原创 lubancat-A1

LubanCat-A1是野火科技基于全志(Allwinner) H618设计的一款低功耗、高性能单板电脑。LubanCat-A1使用了一颗包含四核Cortex-A53处理器、Arm Mali-G31 MP2图形处理器的SOC, 搭配千兆网口、HDMI、USB2.0等外设接口。LubanCat-A1板载了AW869A双频WiFi6+BT5.0无线模块,支持1*1 IEEE 802.11a/b/g/n/ac/ax WLAN 标准和BT 5.0。

2026-01-25 19:55:33 179

原创 香橙派 Orange Pi Prime

Orange Pi Prime采用了全志H5 Cortex-A53四核64位高性能处理器,集成2GB DDR3内存、WiFi+蓝牙、DC供电等。Orange Pi Prime集成了千兆以太网,RJ45板载网络、板载存储、LED指示灯,Low-Level外设,并且兼容树莓派GPIO口,拥有独特的调试串口等。参数。

2026-01-19 22:00:43 171

原创 C++杂记——Name Mangling

编程语言组织程序,都有一定的可见范围,比如Java的包、C/C++的文件。就像我们平时使用的文件夹一样,有了这些组织机制,变量、函数的命名在一定程度上就可以重复。但在程序链接时,这些机制多少都要失效一些,就像每个小朋友在家都叫宝宝,到了幼儿园就没办法通过宝宝来区分彼此了。为了解决名字的唯一性,就需要Name Mangling技术。其实说白了就是对名字进行重新编码的一种规则。这就是经过Name Mangling处理后的符号。

2026-01-18 16:10:31 398

原创 C++杂记——构造函数

有4种情况,会造成编译期必须为未声明constructor的类合成一个default constructor.C++标准把那些合成物称为implicit nontrivial default constructors.被合成出来的constructor只能满足编译期(非程序)的需要。

2026-01-18 15:32:16 746

原创 万象奥科HD-RK3506-MINI

RK3506G 是一款高性能的三核 Cortex A7 应用处理器,专为智能语音交互、音频输入/输出处理、图像输出处理以及其他数字多媒体应用而设计。内置 2D 硬件引擎和显示输出引擎,以最小化 CPU 负载,满足图像显示需求。内置丰富的外设接口,如 SAI、PDM、SPDIF、音频 DSM、音频 ADC、USB2 OTG、RMII、CAN 等,可以满足不同的应用开发需求,降低硬件开发复杂性和开发成本。RK3506G 具有高性能的存储器接口,能够支持高要求的存储器带宽。

2026-01-15 22:58:51 365

原创 Emacs 笔记

学习Emacs。

2026-01-13 00:14:31 88

原创 Linux内存分析工具

本文旨在介绍Linux下分析内存的各种工具及其背后的原理。

2026-01-13 00:04:46 825

原创 Yocto简介

这些资源可用于为嵌入式设备和物联网设备,或任何需要定制化 Linux 操作系统的场景,构建量身定制的 Linux 镜像。Yocto 项目(YP)是一个开源协作项目,它帮助开发者创建基于 Linux 的自定义系统,且不受硬件架构的限制。第一次过程比较慢,考虑到它需要从外网拉取包,同时也需要为其预留足够的磁盘空间(这个看项目,几十到上百G都有可能)。简单说,Yocto提供一个统一的框架工具,能够让我们定制自己的Linux 镜像。还有一个 config 目录,用于存放当前构建环境所使用的配置信息。

2026-01-03 14:20:01 468

原创 Linux内核学习——源代码

声明的函数(可以称之为接口)。同样的,我们的模块中如果有些函数可能需要被其他模块访问,也要EXPORT。内核中一般可供模块调用的函数主要包含在模块内部自行开发的函数和其他模块中被。

2025-10-14 22:58:57 1101

原创 TCP/IP RFC

TCP/IP 标准是在一系列称为 RFC 的文档中发布的。RFC 是目前仍在发展的描述 TCP/IP 和 Internet 内部工作的一系列报告、协议的提议以及协议标准。虽然 TCP/IP 标准通常由 RFC 发布,但不是所有的 RFC 都被最终指定为标准。RFC 是由个人编写的,这些人自愿编写某一新协议或规范的提议草案,并提交给“Internet 工程任务组 (IETE)”和其他工作组。提交的草案先由技术专家、任务组或 RFC 的编辑进行审阅,然后给出一个评估状态。如果草案通过初审阶段,则传播到更大的 I

2025-10-14 22:23:25 1083

原创 C++杂记——虚函数之构造函数和析构函数

如果析构函数不是虚函数,那么在调用该函数时(对象被删除时)则只会调用当前对象对应的类的析构函数,这对于直接定义的对象是没有什么影响的,但是对于使用基类指向派生类的指针而言,因为基类指针实际上是基类类型,所以析构时自然只会调用基类的析构函数,这就可能产生内存泄漏(因为派生类的析构函数不被调用)。所以如果确定程序中有基类指针指向派生类的问题,则必须将基类的析构函数指定为虚函数,如此才能确保NEW出来的对象被正确的DELETE。因此,为了保持类的构造过程的清晰与一致性,C++规定基类的构造函数不能是虚函数。

2025-10-14 22:20:19 765

原创 Google C++ Style Guide

Google C++ Style GuideGoogle 开源项目风格指南——中文版

2025-09-14 23:18:07 234

原创 RS485简介

RS-485(目前称为EIA/TIA-485,RS是Recommend Standard的缩写)是通信物理层的标准接口,是一种信号传输方法,是OSI(开放系统互联)模型的第一级。RS-485是为了扩展RS-232接口的物理能力而创建的。串行EIA-485连接使用两根或三根电缆完成:一根数据线、一根反向数据线,以及通常的一根零线(地,0V)。通过这种方式,发射器和接收器使用22或24 AWG实心电缆的双绞线交换数据。这里的主要思想是通过两根电线传输一个信号。

2025-09-14 23:10:37 2152

原创 C++ 面向对象基本概念

我们都知道以前学习的C语言是面向过程的程序设计,它是由过程定义以及过程调用组成的,(简单来说,过程就是实现一个算法的一段代码)而C++是面向对象的程序设计,它是由对象和消息组成。对象是面向对象程序的基本元素。

2025-09-02 23:54:46 424

原创 C++的演化历史

C++是一门这样的编程语言:C++是自由的,支持5种编程风格:纵观C++的整个发展和演化的历史,C++经历了5个重要的时期://

2025-09-02 23:42:32 1064 2

原创 C++杂记——闭包Closure

维基百科解释:在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是在支持头等函数的编程语言中实现词法绑定的一种技术。闭包在实现上是一个结构体,它存储了一个函数(通常是其入口地址)和一个关联的环境(相当于一个符号查找表)。环境里是若干对符号和值的对应关系,它既要包括约束变量(该函数内部绑定的符号),也要包括自由变量(在函数外部定义但在函数内被引用),有些函数也可能没有自由变量。

2025-03-03 20:17:16 626

原创 排序算法——快速排序

快速排序(Quicksort),又称分区交换排序(partition-exchange sort),是一种排序算法,最早由东尼·霍尔提出。在平均状况下,排序nn个项目要Onlog⁡nOnlogn(大O符号)次比较。在最坏状况下则需要On2On2次比较,但这种状况并不常见。事实上,快速排序Θnlog⁡nΘnlogn通常明显比其他算法更快,因为它的内部循环可以在大部分的架构上很有效率地达成。

2025-03-03 09:47:19 1225

原创 排序算法——冒泡排序

冒泡排序(Bubble Sort)又称为泡式排序,是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

2025-03-02 23:35:53 786

原创 排序算法——选择排序

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对nn个元素的表进行排序总共进行至多n−1n−1次交换。

2025-03-02 23:23:35 934

原创 排序算法——插入排序

插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O1O1的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

2025-03-02 23:10:28 463

原创 C++杂记——RAII (Resource Acquisition Is Initialization)

RAII(Resource Acquisition Is Initialization,资源获取即初始化)是一种C++编程习惯和原则,旨在通过资源的生命周期管理来保证资源的安全和有效使用。RAII的核心思想是将资源的获取和释放绑定到对象的生命周期。当对象被创建时,它会分配相应的资源;当对象的生命周期结束(例如超出作用域时),其析构函数会自动被调用,从而释放资源。它使得我们得以规避“裸new操作”和“裸delete操作”的风险,避免裸new和裸delete可以使我们的代码远离各种潜在风险,避免资源泄漏。

2025-03-02 13:29:50 590

原创 C++杂记——返回值优化(RVO,Return Value Optimization)、具名返回值优化 (NRVO,Named Return Value Optimization)

返回值优化(RVO):当函数返回一个对象的临时副本时,编译器可能会调用移动构造函数来优化性能,尤其是在对象较大的情况下。

2025-03-02 13:11:13 615

原创 C++11新特性

c++11新增了几种数据类型:、、等原始字符串简单来说,“原生的、不加处理的”,字符表示的就是自己(所见即所得),引号、斜杠无需 “\” 转义,比如常用的目录表示,引入原始字符串后,非常方便。格式如下:类型别名声明C++11标准规定了一种新的方法,使用别名声明(alias declaration)来定义类型的别名:这种方法用关键字using作为别名声明开始,后面紧跟别名和等号,其作用是把等号左侧的名字规定成等号右侧类型的别名。类型别名和类型的名字等价,只要是类型的名字能出现的地方,就能使用类型别名。

2025-03-02 13:02:53 1375

原创 C++杂记——RTTI

RTTI(Runtime Type Information)是C++中的一个特性,允许程序在运行时获取类型信息。它主要用于多态(尤其是基于类的多态)时,帮助判断对象的实际类型。RTTI的主要功能RTTI的原理 RTTI的实现依赖于编译器在编译时生成一些额外的信息。注意事项。

2025-03-02 00:51:10 543

原创 C++杂记——尾递归

编译器可以做到这一点,因为递归调用是当前活跃期内最后一条待执行的语句,于是当这个调用返回时栈帧中并没有其他事情可以做,因此也就没有保存栈帧的必要了,通过覆盖当前的栈帧而不是在其之上重新添加一个,这样所使用的栈空间就大大缩减了,这使得实际的运行效率会变得更高。注意,后面这段代码的递归也发生在函数末尾,但它不是尾递归。使用尾递归可以带来一个好处:因为进入最后一步后不再需要参考外层函数(caller)的信息,因此没必要保存外层函数的stack,递归需要用的stack只有目前这层函数的,因此避免了栈溢出风险。

2025-03-01 23:53:09 856

原创 ramdisk 运行虚拟机

接下来,我们需要指定RAM disk的大小,文件系统和设备名,然后将它挂载到一个目录下。从上面的截图可以发现,我的系统还有大量可用的内存空间,所以我完全可以分配1G给RAM disk。内核有个模块叫brd,这个ko可以在系统中创建多个ramdisk 设备,通过modeinfo brd可以查看该模块的具体信息和参数。现在,如果我将一个文件复制到/tmp/ramdisk目录下,我的内存使用量就会上升对应的大小。如果采用方法一创建的ramdisk,那么直接把镜像文件拷贝到ramdisk的文件夹中。

2025-02-24 23:34:34 1093

原创 C++术语

本文总结下C++中的一些术语。

2025-02-24 18:58:36 964

原创 C++杂记——Overload、Override和Overwrite

重载的概念最好理解,在同一个类声明范围中,定义了多个名称完全相同、参数(类型或者个数)不相同的函数,就称之为Overload(重载)。重载的特征如下:(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual 关键字可有可无。也称为改写,覆盖的概念其实是用来实现C++多态性的,即子类重新改写父类声明为virtual的函数。Override(覆盖)的特征如下:(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(3)参数列表完全相同;(4)基类函数必须有v

2025-02-24 12:12:22 2615

原创 C++对象模型

C++一个对象所占的内存空间是多大?

2025-02-24 12:12:04 390

vmware workstation用户文档

vmware workstation用户文档

2024-12-24

virtualbox用户文档

virtualbox用户文档

2024-12-24

spice vd interface接口

spice vd interface接口

2024-12-22

lshw: HardWare LiSter for Linux

lshw: HardWare LiSter for Linux

2024-12-19

Mathematics for Computer Science

This text explains how to use mathematical models and methods to analyze problems that arise in computer science.

2018-05-07

USB/IP - a Peripheral Bus Extension for Device Sharing over IP

USB/IP - a Peripheral Bus Extension for Device Sharing over IP

2023-01-30

USB/IP: A Transparent Device Sharing Technology over IP Network

USB/IP: A Transparent Device Sharing Technology over IP Network

2023-01-30

rpm打包手册(RPM Packaging Guide)

rpm打包手册(RPM Packaging Guide)

2022-09-03

rpm教程(Understanding RPM Package Management Tutorial)

理解rpm包管理

2022-09-03

最优化课件

最优化讲义

2017-06-30

计算机网络课件

计算机网络 课件

2017-06-30

空空如也

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

TA关注的人

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