网卡与网络栈
前言偶然看到了arthurchiao大佬写的Linux 网络栈接收数据(RX):原理及内核实现(2022)文章,从中学习到了许多中断子系统和网络子系统的知识,收获颇丰,特别记录一下。
数据包处理流程下图是一个数据包从网卡通过内核网络栈到达用户空间的流程
网卡通过DMA写入数据到设备驱动预留的ring buffer中
网卡产生IRQ硬件中断
软中断处理线程ksoftirq基于ring buffer生成内核协议栈的数据包skb
内核链路层协议栈处理
内核网络层协议栈处理
内核传输层协议栈处理
参考
Linux 网络栈接收数据(RX):原理及内核实现(2022)
Linux 内核网络栈
qemu基本知识
前言这里简单介绍一些QEMU相关的基本知识,从而方便后续更深入的研究QEMU
QOM(QEMU Object Model)QEMU提供了一套面向对象编程的模型,从而实现各种具有继承关系的设备的模拟。
面向对象编程通常涵盖了类和对象这两个关键概念,其中类是对象的抽象定义,而对象则是类的具体实例。在QOM中,这些概念得到了实现和体现。12345678910111213141516171819202122232425 struct OjbectProperty ┌────────────┐ │ │ └─────▲──────┘ │ ┌──┬──────────────┬──┐ │ │ │ class ├──┼──────►┌──┬──────────────┬──┐ │ │ ├──────────────┤ │ │ │ type ├──┼────►┌──────────────┐◄──────── ...
Linux终端
前言之前就对TTY、PTY和PTS等概念比较迷惑,但因为知识储备问题并没有细究。最近刚好看到几篇相关的文章,觉得讲的非常不错,打算整理一下。
终端架构目前Linux中终端的整体架构如下所示
其基本的工作流程如下所示:
终端模拟器(Terminal Emulator)打开/dev/ptmx(pseudo terminal master multiplexer)设备,分配一个可用的ptm(pseudo terminal master)设备的文件描述符。如ptmx_open()所示,Linux内核在打开ptm设备时,也会自动的创建一个pts(pseudo terminal slave)设备,与该ptm一一对应。
终端模拟器fork()子进程。子进程打开之前ptm设备对应的pts设备,并使用dup()将打开的pts设备的文件描述符设备为子进程的标准输入、标准输出和标准错误输出。
子进程执行bash程序。此时,bash和终端模拟器通过伪终端(pty, pseudo terminal)进行通信,即终端模拟器通过ptm设备读取的数据是bash通过pts设备写入的数据,而bash通过pts设备读取 ...
linux内核硬中断分析
前言最近几天的面试刚好问到了内核中断子系统的相关问题,发现自己对这部分了解的不是非常清晰,因此面试后就读了读Linux 6.5-rc6相关代码。结果发现这部分的代码逻辑并不是非常清楚,所以记录下这篇博客,帮助梳理一下Linux内核的x86-64架构的中断子系统的硬中断部分的逻辑,方便以后快速查阅这部分代码细节。
整个内核中断子系统,简单可以分为上半部(硬中断)和下半部。上半部中断可以理解为从CPU被中断到CPU从中断栈中退出的部分,一般处理一些中断任务中非常紧急的工作;其余工作会推迟到下半部中断,包括softirq、tasklet和workqueue等。
这篇文章主要分析上半部中断,也就是硬中断。
整体流程硬件中断整体流程如所示,整体可以分为硬件保存/恢复现场,保存/恢复上下文等步骤。
硬件保存/恢复现场这部分实际上完全是硬件的工作,我们阅读Intel® 64 and IA-32 Architectures Software Developer’s Manual 3A手册的6.12 EXCEPTION AND INTERRUPT HANDLING章节即可。
对于保存现场来说,硬件主要做 ...
xv6-十一
前言这篇博客研究xv6的设备驱动机制
Lab networking本次lab用来实现xv6的E1000(Network Interfact Card)的设备驱动
要求
You’ll use a network device called the E1000 to handle network communication. To xv6 (and the driver you write), the E1000 looks like a real piece of hardware connected to a real Ethernet local area network (LAN). In fact, the E1000 your driver will talk to is an emulation provided by qemu, connected to a LAN that is also emulated by qemu. On this emulated LAN, xv6 (the “guest”) has an IP address of 10.0.2.15. Qe ...
xv6-十
前言这篇博客研究xv6的虚拟内存的管理机制
Lab mmap本次lab用来实现xv6的虚拟内存的管理机制
要求
mmap can be called in many ways, yet this lab requires only a subset of its features relevant to memory-mapping a file. You can assume that addr will always be zero, meaning that the kernel should decide the virtual address at which to map the file. mmap returns that address, or 0xffffffffffffffff if it fails. length is the number of bytes to map; it might not be the same as the file’s length. prot indicates whether the memory should be map ...