- 博客(256)
- 收藏
- 关注
原创 Linux 内核中的软件包路径
在 `<netcast_name>` 中进行一些后处理(例如计算以太网校验和或添加 VLAN 标签)后,内核调用 `<netcast_name>`并将数据包相应地添加到网卡的 TX 环中。最后,在添加额外的元数据后,它将数据包分配到用于直接内存访问 (DMA) 的固定内存位置。然后,验证数据报的校验和。尤其值得注意的是,即使作者描述了数据包在多个网络层中的路径,他们也往往忽略了UDP协议——这与本文截然不同。但是,例如,当建立 TCP 连接时,由于内核必须跟踪新连接,因此无法使用快速路径。
2026-01-05 10:37:38
549
原创 利用进程间通信(IPC)和共享内存实现高效的进程间通信
当多个进程运行在同一台机器上,且这些进程需要交换数据时,使用基于共享内存的进程间通信是合理的。例如,实时设备控制系统(一个进程读取数据,另一个进程处理数据)、使用计算机视觉技术处理数据的视频监控系统、多媒体数据处理系统,以及需要对传入数据流做出即时响应的金融系统。使用共享内存时,务必记住,即使创建它的进程终止,共享内存也不会自动释放。第一个程序(生成器)用 0 到 255 之间的随机值填充缓冲区,而第二个程序(分析器)在缓冲区中搜索长度为 n 的升序序列,并将它们打印到控制台。——适用于本地和网络通信。
2026-01-05 10:36:07
683
原创 Unix 工作实战。第二部分:软件
由于上述 Unix 理念、源代码的可用性以及(坦白说)缺乏真正的商业兴趣,所有基本的类 Unix 软件早已与依赖项混杂在一起,并合并成一个几乎单一的平台,该平台现在是统一的,并且在所有现代 *BSD 和 Linux 系统上或多或少都能以相同的方式运行。就我个人而言,我很难判断完全取代 Adobe 或 Autodesk 产品的可能性,因为我从未从事过专业的图形设计工作,但我越来越注意到,至少学生和初级作者正在充分利用开源图形软件的潜力,并取得了相当鼓舞人心的成果。
2026-01-05 10:33:52
1005
原创 Unix 工作实战。第一部分:举重
虽然所描述的原则适用于您可能想在工作站上使用的任何 UNIX 系统,但在某些地方会有特定于操作系统的解释,因为即使是 BSD “圣三位一体”(FreeBSD/OpenBSD/NetBSD)的运行方式也截然不同。碰巧的是,从我职业生涯的最初阶段开始,我就在实际工作中使用 Linux、*BSD 和 Solaris 等“大型”商业 UNIX 系统,包括在工作站上使用。有些制造商是官方公开支持 Unix 系统的(联想和戴尔),有些制造商至少知道他们的笔记本电脑使用的是 Unix 系统(惠普),但不幸的是,
2026-01-05 10:33:32
740
原创 为什么在Linux系统中进行身份验证时,密码比密钥更危险?
第二种方法——使用 SSH 密钥进行身份验证——允许用户无需输入密码即可访问服务器,它使用预先创建的一对关联的加密密钥:私钥和公钥。例如,与其在 CI/CD 脚本中存储 SSH 密钥,不如在部署期间通过 API 从密钥管理器请求密钥——密钥以加密形式传输,并可立即用于集成。需要注意的是,在基于 Debian 的发行版中,OpenSSH 服务器默认允许除 root 用户之外的所有用户使用密码登录。这对于服务器尤其重要——在系统中重复使用管理员面板密码或电子邮件密码,即使是最小的漏洞,也会让攻击者有机可乘。
2026-01-04 08:27:35
618
原创 Linux进程间通信(IPC)指南 - 第3部分
前面讨论的例子表明,客户端和服务器可以交换完全任意的数据,其中请求的消息会被返回给客户端。配置为流的套接字(如下所述)是双向的,并基于客户端-服务器原理运行:客户端通过尝试连接到服务器来发起通信,服务器则尝试接受连接。语言(Java、C#、Go)已经非常流行,进程间通信(IPC)仍然是一种极具吸引力的机制,因为通过多进程实现并行处理相比多线程具有明显的优势:每个进程默认拥有自己的地址空间,从而消除了。服务器按顺序处理已连接的客户端,一次处理一个:首先,从头到尾处理第一个客户端,然后处理第二个,依此类推。
2026-01-04 08:16:43
826
原创 DHCP:在 Wireshark 中配置服务器、中继和流量分析
因此,地址池、子网掩码和 DNS 服务器是 DHCP 配置的关键要素,可确保为所有客户端分配正确、唯一且易于管理的 IP 地址。后,客户端会立即停止使用旧的 IP 地址,并开始从头开始获取新地址:首先,它发送 Discover 消息,然后接收 Offer 消息,确认 Request 消息,最后接收包含新 IP 地址的 ACK 消息。首先,客户端发送地址请求(发现),服务器响应并提供一个空闲 IP 地址(提供),客户端确认地址选择(请求),最后服务器确认 IP 地址分配(确认)。
2026-01-04 08:14:13
741
原创 Linux进程间通信(IPC)指南 - 第1部分
共享文件和共享内存的示例演示了进程如何通过共享存储(一种是文件,另一种是内存段)进行通信。然而,共享文件可以表示大量任意字节(例如,一段数字化电影),这使得共享文件成为一种极其灵活的进程间通信(IPC)机制。在下面的例子中,使用共享内存而不是共享文件将带来相应的性能提升。使用 POSIX API 的缺点在于它仍在开发中,并且依赖于已安装的内核版本,这会影响代码的可移植性。——一个正整数,用于标识进程内的文件(同一个物理文件在其他进程中可能对应不同的文件描述符)。来获取系统与共享内存关联的后备文件的句柄。
2026-01-04 08:09:34
412
原创 C语言多线程编程
大家好!我是!是一种特殊的并行编程形式,它可以有多个线程,也可以只有一个。这意味着单个进程可以同时执行多个操作。多线程主要用于优化资源利用率和界面编程——正如前面提到的,它可以同时执行多个操作。当图形界面需要在处理信息的同时保持对用户操作的响应时,多线程是必不可少的。事不宜迟,让我们开始吧。我写了一个小程序,它可以创建一个数据流,并用它来打印从 1 到 10 的数字,但会有轻微的延迟。按下按钮后,会创建一个只显示 1 到 10 数字的数据流。也就是说,如果同时按下两次按钮,输出结果将如下所示。
2026-01-04 08:05:36
448
原创 Linux进程间通信(IPC)指南 - 第2部分
在这种情况下,如果不采取预防措施,子进程会变成僵尸进程,并且进程表中会保留一个对应的条目。在我们的示例中,发送器按 1-1-2-2-3-3 的顺序发送消息,但接收器将按 3-1-2-3-2 的顺序接收消息,以说明消息队列不限于先进先出 (FIFO) 顺序。:进程的执行指的是其某个线程的执行,由于同一进程的线程之间不会发生竞态条件,因此不同进程的线程之间也不会发生竞态条件。通道严格遵循先进先出(FIFO)原则:写入的第一个字节是读取的第一个字节,写入的第二个字节是读取的第二个字节,依此类推。
2026-01-04 07:58:23
620
原创 Systemd:管理员完整指南及示例
我认为正是这些问题催生了其他替代方案(例如 Upstart 和 OpenRC),但真正成为许多主流发行版(例如 Fedora、Debian、Ubuntu 和 Arch 等)事实上的标准的是 Lennart Potterling 于 2010 年推出的 systemd。保证终止所有服务进程:停止服务时,systemd 保证终止其 cgroup 中的所有进程,从而消除僵尸进程的问题。因此,任务如下:创建一个服务,该服务在 Python 中运行一个简单的回声服务器,并保证其运行(崩溃后重新启动)。
2026-01-04 07:51:47
761
原创 一个简单高效的 C++ 监控程序,带有一个通用的 Makefile
其余的 .cpp 文件用于创建目标文件,这些目标文件存储在 obj 文件夹中。值得注意的是,C++ 本身已经是一种相当健壮的编程语言。问题在于,教育机构通常先教授 C 语言,再教授 C++,而且 C++ 的编码风格往往是带有类的 C 语言。随着语言模型的出现,C++ 代码的健壮性已显著提高。我在生成的代码中没有遇到任何内存错误,逻辑错误虽然常见,但代码本身却堪称典范。此外,如果程序在没有报错的情况下退出,则不会重启,也不会生成任何日志。主线程留空以便于自定义,被监控的程序则运行在单独的线程中。
2026-01-04 07:40:35
281
原创 编写您自己的 Linux 操作系统引导加载程序
Limine 的源代码对我帮助很大(它让我确信使用 Linux 启动协议的 UEFI 引导加载程序是可行的),rEFInd 的源代码也给了我很大的帮助(我弄清楚了如何在通过 Chainload 启动时传递内核参数)。现代引导加载程序是复杂的程序,能够以多种方式加载多个操作系统,并考虑到各种软硬件的细微差别。它会根据指定的设置,找到可引导的内核和相应的初始文件系统映像文件(initramfs/initrd),将它们加载到 RAM 中,然后启动内核,并将包括根文件系统信息和其他设置在内的命令行参数传递给内核。
2026-01-04 07:34:48
626
原创 Docker 内幕详解:全面指南。容器化机制 + 示例、实验和实现
例如,在物理设备的上下文中,这种方法的妙处在于,我们只需通过两个系统调用 `read()` 和 `write()`(就像操作存储在硬盘上的普通文件一样)即可从代码中与所有设备通信。在这个人们更看重对工具及其使用场景的基本理解,而非了解其所有选项和在开发过程中可能出现的各种场景下的行为的世界里,那种如同孩童拆开圣诞树下礼物般真挚而浓厚的兴趣,充其量会被遗忘,最坏的情况则是彻底消失。底层技术,它的真正价值不在于运行容器的能力(当然,这方面也很重要),而在于它的基础设施、与其他众多工具的向后兼容性以及便利性。
2026-01-04 07:24:58
594
原创 了解 Linux 系统中用于流量管理的 libnl 库
如果您直接使用 tc 库而不使用 C++,则可以使用 tc flower 过滤器来实现 VLAN 过滤。因此,您可以使用防火墙(例如,支持 VLAN 的 nftables)标记数据包,然后通过 tc 管理标记后的数据包。value 字段对应于 IP 地址,mask 字段对应于 IP 地址掩码,offset 字段对应于相对于 IP 数据包起始位置的偏移量(因为协议是 IP),在本例中即为方向,keyoffmask 字段是偏移量的掩码。创建两个子类,一个用于由过滤器分类的数据包,另一个用于未分类的数据包。
2025-12-30 20:58:41
372
原创 使用 Shell 脚本生成配置文件的 6 种方法
为了避免重写模板,我们将搜索与变量名($IP、$NETMASK、$GATEWAY)对应的字符串,并将其替换为相应的值。请注意,要搜索字符串“$IP”,我们需要转义“$”字符,并搜索字符串“\$IP”(其他变量也适用相同的规则)。细心的读者可能会注意到,我们在脚本主体中设置了变量值,这意味着要生成具有不同设置的下一个配置文件,仍然需要修改脚本。在上面的例子中,模板文件非常小,可以快速扫描(经过适当的训练)。这使您可以构建复杂的模板,这些模板不仅可以替换值,还可以根据指定的条件输出(或不输出)整个部分。
2025-12-30 20:54:47
1029
原创 使用 Linux 命令轻松构建数据库
数据库是许多应用程序的核心,从功能齐全的企业网站到购物清单和财务跟踪器等相对简单的工具,都离不开它。Linux 拥有完善的生态系统和许多强大的工具,可以轻松地合并文本文件,并通过操作文本文件实现各种功能。这些命令大多充当过滤器的角色,通过标准输入接收数据,对数据进行操作,并生成标准输出。通过此命令,我们可以提取数据库中所有列,使其高度与所有行的高度相同。使用 -1 和 -2 选项,我们可以指定要合并的每个文件中的字段编号。关系型数据库的本质是描述不同表之间的关系,其中一个表的字段引用另一个表的字段。
2025-12-30 18:36:30
712
原创 Linux:通往惰性抢占的漫长道路
为了防止这种情况,长时间运行的循环中穿插着 `cond_resched()` 调用,每个调用都相当于一个额外的任意抢占点,即使在 模式下也保持有效。早在 2023 年 9 月,关于调度器运行的讨论就开始了,并由此产生了“惰性抢占”的概念。所以,目前积压了很多工作,但完成后,最终成果应该是一个非常紧凑简单的内核,延迟可预测,而且无需在代码中到处插入调度器调用。几乎可以在任何位置进行抢占,除非内核明确禁止抢占,例如持有自旋锁的位置。,内核中还设置了多个抢占点,必要时可以在每个抢占点执行抢占操作。
2025-12-30 18:33:09
902
原创 关于 Linux 中的软链接和硬链接
它是原始文件的镜像副本。软链接(符号链接)是一个单独的文件,其中包含指向另一个文件或目录的路径。与硬链接不同,软链接不直接引用目标文件的 inode,而是拥有自己的 inode,并包含指向目标文件或目录的路径。由于软链接是逻辑链接且不会重复,因此符号链接可以指向远程计算机上的整个目录或文件。正如我们所看到的,软链接变成了悬挂链接,因为它指向的对象已被移动到另一个位置(或者如果文件已被删除,则不再存在)。:多个硬链接可以共享同一个 inode 和数据块,这意味着创建指向同一文件的多个硬链接不会浪费磁盘空间。
2025-12-30 18:23:06
550
原创 在 Linux 6.8 中创建自定义系统调用
在这里,我们复制当前加载内核的配置文件,告诉构建系统使用与配置文件中相同的值,其他所有参数保持默认值。但是,这里描述的说明也应该适用于更新的内核版本(当然,除非内核开发人员再次更改整个过程)。请记住,您只能为其分配一个当前未被使用的编号,并且切勿使用表注释中禁止使用的编号。现在我们的系统调用已经集成到内核中,让我们重新启动系统,并确保在启动时从 grub 中选择新的(修改过的)内核。这里,462 映射到我们的系统调用,这是两种架构的常见做法。理想情况下,克隆版本的内核版本应该与当前安装的内核版本不相上下。
2025-12-30 18:20:31
763
原创 关于 systemd 和桌面应用程序自动启动
在清理过的环境中也会出现同样的情况(这是 Basatin 的常见问题)。如果不是机缘巧合,我或许会长时间惊叹于这种奇特的新“魔法”。升级到 openSUSE 15.5 后,我遇到了一些奇怪的问题:设置为开机自动启动的应用程序在尝试重启时开始崩溃。这里需要指出的是,自重启的概念(至少在 POSIX 系统中)非常简单原始。--` 是一个不同的、虽然类似但更新的系统调用,它可以用来将子进程放置在不同的命名空间中。系统更新后,它就彻底崩溃了。是一个系统调用,它源于内核尚不支持命名空间的时代,并且不接受任何参数。
2025-12-30 18:17:34
237
原创 Linux 下的 C 语言编程:创建命令行 shell:第二部分
大家好!我是大聪明-PLUS!我最近决定通过编写项目来提升我的 C 语言技能。首先想到的就是命令行解释器,或者简称为 shell。我还会谈到 Make 构建系统以及如何正确地编写和记录 C 代码。在第一部分中,我们定义了基本代码结构,介绍了读取输出和创建进程。在这一部分,我们的目标是从 alpha 版本过渡到 beta 版本——也就是说,实现其他重要功能,例如基本的插件支持、自动补全、语法高亮、环境变量以及新的内置实用程序。没错,我们要把自行车改装成轻便摩托车!我已经总结了上一篇文章的发现,并尝试解决所有问
2025-12-30 17:34:25
820
原创 Linux 下的 C 语言编程:创建你自己的命令 shell
根据大小的不同,其取值范围为 -2,147,483,648 到 2,147,483,647(4 字节),或 -9223372036854775807 到 +9,223,372,036,854,775,807(8 字节)。根据处理器架构的不同,它可以占用 2 个字节(16 位)或 4 个字节(32 位),因此,最大值的范围可能会有所不同:从 0 到 65535(对于 2 个字节),或从 0 到 4,294,967,295(对于 4 个字节)。UNIX 最初是为一台计算机设计的,其用途是创建一个文档填写系统。
2025-12-30 16:19:32
628
原创 Linux 网络和流量加密完整指南(第一部分)
你买了什么,何时买的。传输控制协议/互联网协议(TCP/IP协议栈)简而言之,是一组在不同网络层级相互作用的协议,用于管理网络上的数据交换。该模型未能完整描述网络,也未能获得互联网早期架构师的支持,后来在互联网工程任务组 (IETF) 的指导下,演变成了规范性较低的 TCP/IP 协议。网络是由相互连接的设备(计算机、服务器、手机以及任何其他连接到网络的设备,甚至包括洗衣机)组成的集合,这些设备可以交换数据。本质上,数据是通过 TCP/IP 协议传输的,但关键在于数据是加密的,只有建立连接的机器才能解密。
2025-12-30 15:40:12
838
原创 如何在 Docker 中优化容器镜像大小
在这个例子中,镜像大小的差异并不显著,但随着你向镜像添加更多依赖项,镜像体积会迅速增大。应用程序构建完成后,会创建第二个镜像,即“发布”镜像,并将依赖项从“构建”镜像复制到其中。其次,虽然重要性稍逊,但同样重要的是将构建镜像和发布镜像分成两个阶段,分别包含在各自的 Dockerfile 中。最后,在构建过程的某个阶段,Docker 会丢弃“构建”镜像,因为只保留 Dockerfile 中定义的最终镜像。在这种情况下,最重要的任务是选择合适的基础镜像,因为它的大小最终决定了最终镜像的大小。
2025-12-29 19:03:21
706
原创 Linux固件:简明扼要,用您自己的语言阐述
例如,Wi-Fi/蓝牙模块中的蓝牙部分就是如此(是的,同一个模块中,蓝牙和 Wi-Fi 模块通常使用不同的固件版本)。蓝牙最初的设计是让主机通过 UART 上的 HCI 协议与控制器通信,而这正是 Linux 内核中蓝牙驱动程序的平台无关部分(我指的是内核源代码中 net/bluetooth 目录下的部分)所依赖的。然而,更多时候,厂商并不在意这一点,也没有明确声明主机和设备之间使用的协议版本。当然,这个话题还有很多其他方面,但这些都是需要进一步研究的特殊情况,通常在调试更具体的问题时才会变得有趣。
2025-12-29 18:59:54
870
原创 Linux 实时应用程序检查清单
这份清单并不详尽,但这里列出的前十点信息量很大,可以帮助您设计出一个最坏情况下延迟不超过 200 微秒的系统——正如我在本文开头提到的那样。实际上,延迟还可以进一步降低,但这需要对 Linux 系统进行精细调优,仔细选择硬件,以及精心设计、实现和组装实时应用程序。为了解决这个问题,可以限制硬件中断,使其仅调度到与依赖于该中断的实时任务相同的核心上。在实时系统中,这种非实时操作的压力测试应该对应用程序本身的影响最小。如果待解决的任务对响应时间有严格的要求,则必须对其进行适当的优先级排序并选择合适的调度策略。
2025-12-29 18:56:00
512
原创 如何编写你的第一个 Linux 内核模块
如果你在Spotify上听音乐,首先必须与他们的服务器建立连接,然后你电脑上的某个程序必须监控网络数据包,从中检索数据,并将其传输到你的扬声器或耳机,这样你才能听到声音。如果你想从磁盘读取一个文件,会调用带有多个参数的读取函数,这些参数会被压入内核栈,然后再次调用读取函数,从磁盘检索文件(或其部分内容)。幸运的是,我们的模块不会太复杂,所以不用担心。目录下的一个条目时,它看起来会是这样:我们读取第一个数据块,将问候语写入缓冲区,并将 13(问候语字符串的长度)返回给应用程序,因为读取了 13 个字节。
2025-12-29 18:50:19
2146
原创 深入 initrd
Linux 初始启动 RAM 磁盘 (initrd) 是一个块设备,在操作系统中以镜像形式存在,在系统启动过程中被挂载到 RAM 中,以支持两阶段启动模型。挂载完成后,initrd 会被卸载,内存也会被释放。然后,利用分区和引导数据的信息,加载引导加载程序(例如 GRUB)的初始部分,该部分负责加载 GRUB 的第二阶段,而 GRUB 的第二阶段负责加载操作系统内核并切换到其执行。从第一行消息可以看出,在系统启动阶段,内核尝试解包根文件系统映像(如 initramfs),以初始化文件系统。
2025-12-29 18:37:28
830
原创 内核开发 – 固件 API
唯一的区别可能在于文件名,正如我上面提到的,文件名是在设备树中定义的。因此,我们可以提供一个统一的包装器,通过它来填充固件结构,并以这种形式提供要传输到设备的数据。我还有几个补丁准备提交,但就本文而言,最重要的是,针对 这个特定设备的固件传输功能已经实现了。之后,您可以查看 tps25750 的实现,如果您的设备支持批量传输(即,将整个固件作为一个单元发送),那么您可能会对此感兴趣。让我们专注于本文的主题。我们都知道,更新机制是设备特定的,前面提到的文章解释了如何在驱动程序中提供设备特定的数据和功能。
2025-12-29 18:34:08
742
原创 FUSE:如何编写自己的文件系统
fuse_session_process_buf() 函数解析缓冲区中的请求,并执行在创建 libfuse 会话时`struct fuse_lowlevel_ops`中指定的处理程序。文件描述符可以被复制,因此一次open()调用可能会导致多次调用flush(),例如,当一个进程打开一个文件并创建子进程时。在我最初启动系统时,FUSE 的性能是一个特别紧迫的问题。主要区别在于,在高级 API 中,文件系统通过路径名来操作文件,而在低级 API 中,它直接操作 inode 和 dentry。
2025-12-29 18:19:46
625
原创 性能分析:如何使用 Linux 系统收集程序性能信息
从 percona-toolkit 3.5.8 版本(目前正在开发中,必要的修复已包含在3.x分支中)开始,pt-pmp 允许您选择用于收集堆栈跟踪信息的工具。让我们一起来探讨一下。需要注意的是,它们是按顺序启动的,以避免对模块性能造成显著影响。关键在于,在初始分析阶段,全面了解系统性能至关重要,这样才能得出准确的结论。是一款优秀的性能分析工具,它允许你在不显著影响性能的情况下,相当准确地评估应用程序的算法。因此,我们获得了有关该程序运行情况的足够信息,然后我们对其进行分析,并利用这些信息来识别问题领域。
2025-12-29 17:00:01
1020
原创 Linux 操作系统中的进程内存布局。使用虚拟机管理程序收集转储文件。
Maple_range_64 和 maple_leaf_64 单元结构相同,但树的叶子存储的是指向正在搜索的虚拟内存区域的指针,而不是指向子节点的指针。除了叶节点之外,遍历其他单元格的函数仅在可能的单元格数量及其在结构中的偏移量上有所不同,因此它们使用同一个子函数。我们没有使用 mm_struct 中的双向链表,而是访问 maple_tree 的根节点,其叶子节点包含有关虚拟内存区域的所需信息。Linux 内核中的每个进程都有自己的结构体来描述它——task_struct,定义在sched.h文件中。
2025-12-29 16:53:19
650
原创 数字与字节:Linux 中的内存是如何工作的?
大家好!我是大聪明-PLUS! 在操作系统开发过程中,内存的使用始终是关注的重点。内存是计算机中存储程序和数据的组件,没有它,现代计算机将无法运行。内存中数据存储的关键单位是位(bit),它可以取两个值:0 或 1。内存由单元(cell)组成,每个单元都有自己的地址。单元可以包含不同数量的位,可寻址单元的数量取决于地址中的位数。内存还包括随机存取存储器(RAM),可用于读写信息。RAM 分为静态 RAM(SRAM)和动态 RAM(DRAM),它们在信息存储方式上有所不同。SRAM 会一直保持信息直到
2025-12-29 15:49:34
746
原创 使用 Asio 库解决异步 I/O 问题
所以,虽然我们不相信魔法,但我们还是想了解一下这个库是如何实现对随机访问文件的异步操作的。在一个项目中,我和我的团队使用了Asio,这是一个用于网络和底层 I/O 编程的 C++ 库。下面,我将解释我考虑过的异步 I/O 解决方案,以及我最终选择 Asio 的原因。例如,如果异步操作是用“cocktail”创建的,它将存储一个函数,该函数将在操作完成时被调用。太好了,一切似乎都很正常,我的同事们都在用,而且毫不在意。该对象对库用户不可见,但如果我们决定将 Asio 与我们的基本操作一起使用,则需要定义它。
2025-12-28 10:13:33
844
原创 使用 Yocto 进行开发
然而,Yocto 的独特之处在于:它提供了一个灵活而强大的平台,用于创建定制的 Linux 系统。在使用 Yocto 或 OpenEmbedded 的项目中,BSP 层为自定义 Linux 镜像的构建添加了对特定设备或设备系列的支持。Yocto 的核心理念是提供构建自定义 Linux 镜像的工具,从源代码到可直接使用的镜像,完全根据特定项目的需求进行定制。使用 BSP 可以简化开发,因为它提供了现成的工具和设置,使您可以快速上手特定的硬件平台,避免从头开始创建所有必要的软件和设置。
2025-12-28 10:12:31
759
原创 企鹅网:Linux 网络
大家好!我是大聪明-PLUS!今天我将继续我们的 Linux 内核系列文章。在本文中,我们将探讨服务器领域的网络组织方式,以及它如何从使用传统的 Linux 内核网络堆栈演变为使用 OVS 的网络虚拟化,再到使用 NFV 和 SR-IOV 处理电信工作负载。本文将探讨 Linux 内核中基本的 IPv4/TCP 流量流程,在深入探讨流量路径之前,我们应该先熟悉一些辅助工具和概念:当网络适配器启动且其驱动模块被内核加载时,驱动程序首先会在设备内存中分配接收 (Rx) 和发送 (Tx) 队列或缓冲区(称为环形缓
2025-12-28 10:11:24
705
原创 在 Linux 中为 DMA 分配内存
该子目录的名称包含可分配到此巨型页表中的巨型页的大小。在后来的 PCI 模型中,北桥解码地址并识别自身为 PCI 事务的目标,并且在整个总线周期的数据传输阶段(至少包括数据和地址传输阶段),数据在设备和北桥之间传输,北桥进而发出 DRAM 总线周期以与系统内存通信。此外,由于我们可能需要比标准内存页(通常为 4 KB)更大的空间,因此我们需要使用更大的内存页来分配内存。既然我们已经知道如何设置与虚拟地址对应的物理地址,那么问题仍然存在:我们需要获取的是连续物理内存的地址,而不仅仅是单个页面的物理地址。
2025-12-28 10:10:46
875
原创 在Linux系统中,是否可以使用DMA代替memcpy?
如果您打算使用从先前已使用或计划在复制后由 DMA 控制器使用的内存中复制的数据,则必须执行与硬件相关的函数,以将内存中的数据与处理器或 DMA 控制器将从缓存中读取的数据同步。5. 这一点本质上重复了前一点的观点,清楚地表明,使用 ktime_get() 函数进行测量以进行比较分析是完全不可接受的,因为它非常不准确,尤其是在像示例中分析的复制这样短暂的操作的情况下。如果调用此函数的应用程序是多线程的,则此调用会停用执行它的当前线程,从而允许其他应用程序线程与此处启动的当前数据复制操作并行执行。
2025-12-28 10:10:09
668
原创 如何在 Linux 的虚拟机管理程序层实现行为分析
由于所有这些事件均由系统中的同一进程发起,因此可以通过它们的 ID 进行关联,从而得出结论:该进程是由 Mirai 发起的。它显示被分析的进程发起了一个写入系统调用,但由于我们拦截的是内核函数,vfs_write 方法会向 tmp 目录写入一个随机名称的文件。如今,它不仅是一套数据包过滤器,更是一个功能齐全的虚拟机,允许您使用 C 语言编写任意复杂度的程序——从网络流量监控到系统性能和安全分析,无所不能。恶意软件分析是一项耗时的工作,因此在演示中,我重点关注了恶意软件的关键行为特征。
2025-12-28 10:09:47
587
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅