
linux-开发
文章平均质量分 88
hanpfei
实时音视频开发。
展开
-
Linux 蓝牙音频软件栈实现分析
蓝牙协议栈是实现蓝牙通信功能的软件架构,它由多个层次组成,每一层负责特定的功能。蓝牙协议栈的设计遵循蓝牙标准 (由蓝牙技术联盟定义),支持多种蓝牙配置文件 (Profiles),以满足不同的应用场景 (如音频传输、文件传输、健康设备、键盘鼠标这样的输入输出设备等)。蓝牙各个应用场景的实现,如音频传输、文件传输和键盘鼠标这样的输入设备,与系统中常规的这些功能的实现大为不同。原创 2025-03-15 18:42:00 · 912 阅读 · 0 评论 -
深入 PipeWire
随着它的成熟,PipeWire 项目正在慢慢地变得流行。它的文档依然相对稀少,但正在逐渐增长。然而,让项目外部的人尝试用他们自己的语言来理解和解释它总是一个好主意,重申想法,从他们自己的角度来看待它。在之前的一篇文章中,我讨论了 Unix 上的通用音频栈,并有一节提到了 PipeWire。不幸的是,因为当时我没有找到足够的文档,并且无法理解一些概念,我认为我没有对项目进行公正的处理,甚至可能混淆了某些部分。原创 2025-03-04 23:19:22 · 834 阅读 · 0 评论 -
深入浅出 Linux 中的 ARM IOMMU SMMU I
在计算机系统架构中,与传统的用于 CPU 访问内存的管理的 MMU 类似,IOMMU (Input Output Memory Management Unit) 将来自系统 I/O 设备的 DMA 请求传递到系统互连之前,它会先转换请求的地址,并对系统 I/O 设备的内存访问事务进行管理和限制。IOMMU 将设备可见的虚拟地址 (IOVA) 映射到物理内存地址。不同的硬件体系结构有不同的 IOMMU 实现,ARM 平台的 IOMMU 是 SMMU (System Memory Management)。原创 2023-11-22 19:01:21 · 2900 阅读 · 0 评论 -
在 Linux 程序中使用 breakpad
本文概述在 Linux 平台的可执行程序或动态链接库中使用 Breakpad 的方法。原创 2022-06-24 14:04:37 · 1523 阅读 · 0 评论 -
ALSA 音频 API 使用入门
文章目录理解音频接口典型的音频应用做了什么最小的播放程序最小的采集程序最小的中断驱动程序最小的全双工程序术语如何做 . . .打开设别设置参数硬件参数软件参数为什么你可以忘掉这里的一切本文尝试提供一些对 ALSA 音频 API 的介绍。它不是 ALSA API 的完整参考手册,它也不包含更复杂的软件需要解决的许多特有问题。然而,它确实尝试为技能娴熟,但对 ALSA API 不熟悉的程序员提供充足的背景和信息,来编写使用 ALSA API 的简单程序。理解音频接口让我们先回顾一下一个音频接口的基本原创 2022-05-28 21:35:37 · 2421 阅读 · 0 评论 -
一次 ASAN 找不到 symbolizer 问题的分析与解决
AddressSanitizer(简称 ASAN)一直是一个检测分析 C/C++ 内存问题很方便的工具。WebRTC 工程集成了 ASAN,只要配置一个简单的选项即可对整个工程打开或关闭 ASAN,具体来说是 is_asan 选项。is_asan 选项的默认值为 false,在 args.gn 文件中写入 is_asan = true 行可以对整个工程打开 ASAN,在 args.gn 文件中写入 is_asan = false 行或者不配置 is_asan 选项可以对整个工程关闭 ASAN。OpenRT原创 2022-05-01 13:34:52 · 2965 阅读 · 1 评论 -
inotify 机制
inotify 是 Linux 平台特有的一种文件系统事件监视机制。inotify API 提供了一种监视文件系统事件的机制。Inotify 可以被用于监视单独的文件,或监视目录。当监视一个目录时,inotify 将返回目录本身的事件,以及目录内的文件的事件。这组 API 使用了如下这些系统调用:inotify_init(2) 创建一个 inotify 实例并返回一个文件描述符指向该 inotify 实例。更近一些的 inotify_init1(2) 与 inotify_init(2) 类似,但它可以原创 2022-01-25 22:51:33 · 3662 阅读 · 0 评论 -
Linux 平台 C/C++ 代码中设置线程名
一般来说,Linux 平台的 C/C++ 程序可以用 prctl() 或 pthreads 的 pthread_setname_np() 接口为一个线程设置线程名。prctl() 可以用于为当前线程设置线程名,pthread_setname_np() 则可以用于为当前进程的任意线程设置线程名。prctl() 的函数声明如下: #include <sys/prctl.h> int prctl(int option, unsigned long arg2, unsig原创 2021-12-28 22:38:45 · 2588 阅读 · 0 评论 -
用 70 行代码给你自己写一个 strace
基本上任何使用了一段时间 Linux 的人,最后都会知道并爱上 strace 命令。strace 是系统调用跟踪器,它跟踪程序执行的进入内核以与外面的世界交互的调用。如果你还不熟悉这个令人惊奇的多才多艺的工具,我建议你看一下我的朋友和合作伙伴 Greg Price 的出色的博客 blog post 中关于这一主题的内容,然后再回到这里。我们都爱 strace,但你是否曾经好奇它是如何工作的呢?它是如何把它自己注入到内核和用户空间程序之间的呢?这篇博客将用大约 70 行 C 代码走查一个小小的 strace翻译 2021-11-18 21:04:37 · 218 阅读 · 0 评论 -
strace 哇,好多系统调用
我不敢在没有认真考虑后果的情况下在生产环境中运行 strace(1),而是首先尝试它的替代品。尽管广为人知的是(并且不断被重新发现)strace 是一个神奇的工具,但少得多的人知道的是,它目前是 — 且一直以来都是 — 很危险的。strace 是 Linux 的系统调用追踪器。它当前使用了神秘的 ptrace() (进程追踪)调试接口,后者以一种很暴力的方式运作:每次系统调用都暂停目标进程以使得调试器可以读取状态。且执行两次:系统调用开始时一次,结束时一次。这意味着每次系统调用 strace 都暂停你的原创 2021-11-13 22:48:57 · 1503 阅读 · 2 评论 -
ptrace 系统调用
ptrace 是 Linux 环境下,许许多多分析调试工具,如 strace,ltrace 等,所使用的最核心的系统调用。ptrace,即 process trace,指进程追踪。它能让一个进程控制及影响另一个进程的行为,比如让另外一个进程停止运行,获取另外一个进程内存地址空间中的值,设置另外一个进程内存中的值,获取另外一个进程的寄存器的值,设置另外一个进程的寄存器的值,等等等等。ptrace 系统调用的 C 库接口原型如下: #include <sys/ptrace.h>翻译 2021-09-02 23:25:21 · 718 阅读 · 0 评论 -
ELF 文件格式
<elf.h> 头文件定义了 ELF 可执行二进制文件的格式。这些文件包括普通的可执行文件,即可以直接执行的应用程序文件;可重定位目标文件,即 *.o 文件;核心转储 core 文件;和共享目标文件,即共享库 *.so 文件。使用 ELF 文件格式的可执行文件的组成是这样的:一个 ELF 文件头,后面是一个程序头表,或者是一个节(即 section,后文也用节指代 section,用段指代 segment)头表,或两者都有。ELF 文件头总是位于文件中偏移量为 0 的位置。程序头表和节头表在文原创 2021-08-21 08:40:49 · 1696 阅读 · 0 评论 -
Googletest 实现简要分析
借助于 Googletest 测试框架,我们只需编写测试用例代码,并定义简单的 main() 函数,编译之后并运行即可以把我们的测试用例跑起来。(更详细的内容可参考 Googletest 入门)。但 main() 函数调用 RUN_ALL_TESTS() 时,是如何找到并运行我们编写的测试用例代码的呢?本文尝试找寻 Googletest 框架背后隐藏的这些秘密。(代码分析基于 git@github...原创 2019-08-23 20:29:54 · 1010 阅读 · 0 评论 -
Linux 下的 AddressSanitizer
AddressSanitizer 是一个性能非常好的 C/C++ 内存错误探测工具。它由编译器的插桩模块(目前,LLVM 通过)和替换了 malloc 函数的运行时库组成。这个工具可以探测如下这些类型的错误:对堆,栈和全局内存的访问越界(堆缓冲区溢出,栈缓冲区溢出,和全局缓冲区溢出)UAP(Use-after-free,悬挂指针的解引用,或者说野指针)Use-after-return(无效...原创 2019-05-19 21:08:29 · 5842 阅读 · 4 评论 -
LXC C API 使用
LXC 提供了稳定的 C API 以及大量不同语言的绑定。LXC 版本中的 liblxc1 API 的接口可能会增加,但不会在不调用 liblxc2 的情况下删除或更改现有符号。与稳定的 API 一起发布的第一个 LXC 版本是 1.0.0。只有 lxccontainer.h 头文件中列出的符号是 API 的一部分,所有其它的都是 LXC 的内部符号,且可能在任何时间点改变。API 用法最好的示例是原创 2017-12-07 14:29:02 · 1632 阅读 · 0 评论 -
Anbox 容器管理服务
Anbox 安装过程分析Anbox 是在像 Ubuntu 这样的普通 GNU/Linux 系统上,基于容器启动完整 Android 系统的方案。当前安装过程由多个步骤组成,这些步骤将向主机系统中添加额外的组件,这些组件包括:由于没有发行版内核同时启用 binder 和 ashmem,因此需要它们的源码树之外的内核模块为 /dev/binder 和 /dev/ashmem 设置正确权限的 udev原创 2017-12-01 11:38:44 · 5550 阅读 · 1 评论 -
将应用打包为 Snaps
在 Linux 上分发应用不总是那么简单。你有不同的打包格式,基础系统,可用的库,和发行版本节奏,它们都让人头疼。但是现在我们有了更简单的东西:Snaps。Snaps 是开发者打包他们的应用的一种新的方式,相对于更多传统的打包格式,比如 .deb,.rpm 和其它的那些,它具有许多优势。Snaps 是安全的,相互隔离的,主机系统使用 AppArmor 这样的技术,它们是跨平台的,且它们是自包含的,这翻译 2017-11-30 17:11:27 · 442 阅读 · 0 评论