Linux list.h 浅析
# Linux 中的 list.h 基于内核版本5.15.158分析,该文件位于/include/linux/list.h,是在 Linux 中的众多数据结构中使用的双向链表结构。 原理架构 /include/linux/types.h中定义了链表节点struct list_head,包含了指向前后两个节点的双向指针。 123struct list_head { struct list_head *next, *prev;}; 区别于常用的 List 节点存储节点对象地址的形式,list.h这个双向链表的使用方式是将struct list_head声明为节点数据结构的变量成员。这种方式的好处是不再需要单独的一个链表头对象才能访问到各个节点。当索引到某个节点时,通过成员相对节点数据结构的结构体地址的偏移来从struct list_head还原这个节点的地址。 例如,在 Linux 的 pcb 结构struct task_struct中就有多个struct list_head成员,将一个 pcb...
PCIE学习笔记(一)PCI
PCI是 Peripheral Component Interconnect (外设部件互连标准)的缩写,它曾经是个人电脑中使用最为广泛的接口,几乎所有的主板产品上都带有这种插槽。目前该总线已经逐渐被PCI Express总线所取代。 PCI 总线 PCI 总线是一种树型结构,并且独立于 CPU 总线,可以和 CPU 总线并行操作。PCI总线上可以挂接 PCI 设备和 PCI 桥, PCI 总线上只允许有一个 PCI 主设备(同一时刻),其他的均为 PCI 从设备,而且读写操作只能在主从设备之间进行,从设备之间的数据交换需要通过主设备中转。 PCI 配置空间 PCI 配置空间为256字节的固定空间,负责设备的信息提供和管理等。头部最开始的 deviceID 和 vendorID 寄存器由 pcisig 分配,只读,vendorID 代表 pci 设备的厂商,deviceID 代表厂商的具体设备。 Header Type 0xE偏移处是设备的 header type,决定了 PCI 配置头的布局和设备的类型。头类型有三种,在 PCIE 中只保留了前两种。 Type 0设备代表...
F2FS 文件流程浅析
本文简要梳理了 f2fs 文件系统的组织方式和操作流程。 f2fs 文件组织形式和典型流程 重要结构 文件结构 文件数据的组织方式一般时被设计为inode-data模式,即 每一个文件都具有一个inode,这个inode记录data的组织关系,这个关系称为文件结构。例如用户需要访问A文件的第1000个字节,系统就会先根据A文件的路径找到的A的inode,然后从inode找到第1000个字节所在的物理地址,然后从磁盘读取出来。那么F2FS的文件结构是怎么样的呢? 如上图,F2FS中的一个inode,包含两个主要部分: metadata部分,和数据块寻址部分。我们重点观察数据块寻址部分,分析inode时如何将数据块索引出来。在图中,数据块寻址部分包含direct pointers,single-indirect,double-indirect,以及triple-indirect。它们的含义分别是: direct pointer: inode内直接指向数据块(图右上角Data)的地址数组,即inode->data模式。 single-indirect pointer:...
编译调试内核方法
编译内核 一、从官网上下载源码,解压。 建议下载的内核与本机内核版本一致,这样可以直接使用本机的配置文件/boot/config-{version_name}进行编译。{version_name}字符串与本机的linux内核版本相关,如/boot/config-5.4.0。 二、编译之前,首先安装编译需要的依赖包 ubuntu下: 1sudo apt install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison pkg-config dwarves 三、进入下载的源码根目录,并将本机的配置信息拷贝到此处,命名为.config 1cp -v /boot/config-`uname -r` .config 使用这种方式可以沿用本机很多适合的配置,不必在接下来的配置过程中去处理过多不熟悉的配置项。 四、额外配置 配置文件中的额外配置 1make...
深度学习笔记II 多层感知机
玩樱之诗玩的 隐藏层与激活函数 隐藏层 我们通过矩阵X∈Rn×d\mathbf{X} \in \mathbb{R}^{n \times d}X∈Rn×d来表示nnn个样本的小批量, 其中每个样本具有ddd个输入特征。 对于具有hhh个隐藏单元的单隐藏层多层感知机, 用H∈Rn×h\mathbf{H} \in \mathbb{R}^{n \times h}H∈Rn×h表示隐藏层的输出, 称为隐藏表示(hidden representations)。 在数学或代码中,H\mathbf{H}H也被称为隐藏层变量(hidden-layer variable) 或隐藏变量(hidden variable)。 因为隐藏层和输出层都是全连接的, 所以我们有隐藏层权重W(1)∈Rd×h\mathbf{W}^{(1)} \in \mathbb{R}^{d \times h}W(1)∈Rd×h和隐藏层偏置b(1)∈R1×h\mathbf{b}^{(1)} \in \mathbb{R}^{1 \times h}b(1)∈R1×h以及输出层权重W(2)∈Rh×q\mathbf{W}^{(2)}...
深度学习笔记I 线性回归
为了进组开始机器学习 唉,不想练车 线性回归 线性模型 y^=w⊤x+b\hat{y} = \mathbf{w}^\mathbf{\top}\mathbf{x} +b y^=w⊤x+b 损失函数 样本iii的预测值为y^(i)\hat{y}^{(i)}y^(i),其相应的真实标签为y(i)y^{(i)}y(i) l(i)(w,b)=12(y^(i)−y(i))2l^{(i)}(\mathbf{w}, b) = \frac{1}{2} \left(\hat{y}^{(i)} - y^{(i)}\right)^2 l(i)(w,b)=21(y^(i)−y(i))2 总误差为 L(w,b)=1n∑i=1nl(i)(w,b)=1n∑i=1n12(w⊤x(i)+b−y(i))2L(\mathbf{w}, b) =\frac{1}{n}\sum_{i=1}^n l^{(i)}(\mathbf{w}, b) =\frac{1}{n} \sum_{i=1}^n \frac{1}{2}\left(\mathbf{w}^\top \mathbf{x}^{(i)} + b -...
2023-5-7-OOCPC学习笔记
嗯学英文Object-oriented programming with ansci-c Chapter 4 C结构体的储存结构取决于结构体定义中成员的排列顺序,柔性数组必须排列在最后。父类的内存应放在子类的最前面,以保证类型的向上转换后的内存访问是合法的。 类的标识符以及能被重写的函数都写在class结构体里面,但是无法适用于多种类型的继承 只有构造器逐层向上构造各子类延伸部分时会调用同层函数,即使这个函数会被下层子类继承并重写 重写过程发生在new函数的一开始,因此这种调用可能无法实现。在本层构造器中应调用本层函数的原名而不是标识名。 基于信息隐藏原则,子类不应直接访问父类信息,父类应提供静态函数接口或者宏来提供访问(宏本身并不是完全安全的) Chapter 6 classOf和sizeOf的作用是进行错误检查后分别返回类描述和类大小。 seletor传入的参数是实例指针,作用是调用classOf返回的类描述中储存的多态函数并调用。 紫辰presentation大纲 1. 什么是OOP捏 oop的特性(多态,继承……) 数据结构的定义 老生常谈的编程原则 2....
2023-2-24-病毒学习笔记~文件系统
病毒前置:文件系统相关的学习笔记 硬盘的物理结构 低级格式化 低级格式化的主要目的是将盘面划分成磁道、扇区和柱面 文件系统 基本INT 13H调用 BIOS INT...
2023-1-28画板制作笔记一
进bitman时写的画板,现在写一个笔记回忆下当时的思路。 任务内容 写一个类似于windows画图的画板程序,要求至少提供直线,正方形和圆三种图形,支持拖拽以及文件保存读取。 用到的Qt特性 基于知道啥用啥的原则,选择Qt作为sdk编写。Qt的特性决定了这个程序怎么架构。 信号和槽 属于Qt元对象机制的内容。 信号与槽(Signal & Slot)是 Qt 编程的基础,也是 Qt 的一大创新。因为有了信号与槽的编程机制,在 Qt 中处理界面各个组件的交互操作时变得更加直观和简单。 信号(Signal)就是在特定情况下被发射的事件,例如 PushButton 最常见的信号就是鼠标单击时发射的 clicked() 信号,一个 ComboBox 最常见的信号是选择的列表项变化时发射的 CurrentIndexChanged() 信号。 槽(Slot)就是对信号响应的函数。槽是一个函数,与一般的 C++ 函数一样,可以定义在类的任何部分(public、private 或...