
Linux内核
文章平均质量分 96
Liuqz2009
不念过去不畏将来,全心活在当下!
寒窗二十载,人生再出发!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
中断控制器及处理
是Linux中断子系统应对硬件多样性和复杂拓扑的核心机制,通过类型标签实现中断域的精准标识与隔离,保障了中断处理的灵活性与高效性。其设计体现了内核对可扩展性和硬件抽象的深刻考量。// 全局链表节点// 域名称// 回调函数集// 私有数据(如中断控制器状态)// 对应设备树节点// 最大 HW IRQ 号// 基数树根节点(用于树形映射)// 线性映射大小// 线性映射表(直接索引 HW IRQ)关键成员解析ops:指向,包含映射、解除映射、设备树解析等回调函数。例如:map()原创 2025-04-24 10:53:39 · 944 阅读 · 0 评论 -
xHCI 上 USB 读写分析
函数用来处理发送给 RootHub 的控制传输。其通过 MMIO 直接获取相关的信息,如此处的设备描述符。USB 可以进行批量传输、中断传输、实时传输、控制传输。将URB提交给USB核心,后者根据URB的端点类型和设备地址路由请求。对于外接的 USB 设备(如 U 盘)的设备描述符获取,则走。其初始化两个有优先级的工作队列,工作队列执行函数为。函数来添加 HCD ,该函数中有如下代码来初始化工作队列。,该函数实现了成功发送完 URB 后的清理及通知工作。函数来对 URB 清理,同时通知。原创 2025-04-10 18:24:57 · 1317 阅读 · 0 评论 -
DMA 概念与讲解
但是,您可以再次将整个过程视为“从设备请求中收到 32 个字节的响应”。,理论上可以直接访问 ZONE_NORMAL 的物理内存(如 0x80000000 ~ 0x7FFFFFFFFF)。的关键技术,其核心目标是通过中间缓冲区实现数据的安全传输。(4GB),高端设备(如 NVMe SSD、GPU)可能支持。老旧设备(如 ISA 总线设备)的 DMA 控制器仅支持。但实际可用范围受限于设备硬件、控制器和操作系统的实现。PCIe 的 DMA 支持的内存寻址范围取决于。TLP 遍历层次结构。原创 2025-04-07 18:39:38 · 1440 阅读 · 0 评论 -
IO 端口与 IO 内存
IO端口:当寄存器或内存位于IO空间时,称为IO端口。一般寄存器也俗称I/O端口,或者说I/O ports,这个I/O端口可以被映射在Memory Space,也可以被映射在I/O Space。IO内存:当寄存器或内存位于内存空间时,称为IO内存。原创 2025-04-02 18:17:54 · 465 阅读 · 0 评论 -
Ubuntu 下 systemd 介绍
以下是systemd用途 :存放由软件包安装的systemd单元文件,包括各种服务(.service)、目标(.target)、挂载(.mount)等单元文件。特点 :该目录下的配置文件是由软件包管理器(如 apt、rpm 等)安装软件时自动放置的,通常不需要用户手动修改。它为系统提供了各种预定义的服务和功能配置。用途 :存放系统运行时动态生成的单元文件。这些文件通常是在系统运行过程中,由各种服务或进程根据需要创建的。原创 2025-02-17 17:10:59 · 1462 阅读 · 0 评论 -
制作Ubuntu根文件
qemu-user-static 是一个用于在 x86 主机上运行 ARM 或其他非 x86 操作系统的工具。它是一个静态版本的 QEMU,因此它可以直接从磁盘运行,而无需安装 QEMU 或任何其他软件.PS: LightDM 和 GDM 都是 Linux 系统的显示管理器,负责显示登录界面,并允许用户登录系统。安装它用于在PC主机上运行下载下来的UBUNTU镜像, 方便修改镜像的内容。最终生成的镜像文件:linuxroot.img。PC 上替换源好像有些问题,也许源不对。原创 2025-02-15 11:54:08 · 893 阅读 · 0 评论 -
QEMU 通过网络实现共享文件
在启动 QEMU 时,使用 -netdev user 和 -device virtio-net 参数来配置 NAT 网络。为了在虚拟机重启后自动挂载共享文件夹,可以将挂载命令添加到 /etc/fstab 文件中。选项用于指定共享目录的路径、安全模型以及挂载点等参数。是一种高效且灵活的文件共享方式,它基于 9p 文件系统协议。如果能够成功 ping 通,说明虚拟机已经可以访问外网。虚拟机启动后,QEMU 会自动为虚拟机分配一个。将需要共享的文件放入此目录中。原创 2025-02-14 18:01:22 · 1266 阅读 · 0 评论 -
Linux 文件系统挂载
虚拟根文件系统中没有/init在initrd阶段,如果虚拟根文件系统中没有/init文件,则会执行函数来挂载真实根文件系统。为了识别根文件系统所在的介质(如 SD、SCSI 等),内核会通过函数加载相关的介质驱动。这些驱动程序确保内核能够正确识别和访问根文件系统所在的设备。虚拟根文件系统中有/init在initrd阶段,如果虚拟根文件系统中有/init文件,则不执行函数来挂载真实根文件系统,真实根文件系统挂载将在/init脚本中进行。原创 2025-02-14 13:58:59 · 883 阅读 · 0 评论 -
Linux 下注册分析(4)
用于创建设备并在 sysfs 中注册指向该设备应该注册到的结构类的指针。这个函数可以被 char 设备类使用。在 Linux 系统中,是一个非常重要的概念。它是 Linux 内核中用来管理设备驱动程序的一种机制,通过对设备进行分类注册,实现设备间的协作和管理。在 Linux 系统中,设备驱动程序是连接硬件设备和操作系统内核的桥梁,而 class_register 机制可以帮助内核更好地管理这些设备驱动程序,并且提供一种灵活的方式来处理设备的注册和注销。原创 2025-01-24 17:39:07 · 1148 阅读 · 0 评论 -
Linux 下注册分析(3)
用于设备的注册,即将一个设备实例注册到设备模型中,使得系统能够识别和管理该设备。该函数通常由设备驱动的初始化函数调用,用于将设备的相关信息注册到设备模型中,包括设备的名称、设备的操作方法、设备的资源等。设备注册后,系统可以通过设备名称或设备号来访问和操作该设备。原创 2025-01-24 17:08:44 · 792 阅读 · 0 评论 -
Linux 下注册分析(2)
Linux 设备树Linux 下注册分析(1) 首先通过实例来看 bus/class/device/driver 的关系。下图绘制的是 qemu 启动 ARM64 后,sysfs 中 platform 总线下部分目录和文件的关系。框图说明:总结: 添加的 device 会在 /sys/devices 下生成子目录。注册的 driver 会在 /sys/bus 所属的总线目录(如 platform)下的 drivers 生成子目录。 注册的 class 会在 /sys/class原创 2025-01-23 19:12:27 · 933 阅读 · 0 评论 -
Linux 下注册分析(1)
用于驱动的注册,即将一个驱动实例注册到驱动模型中,使得系统能够识别和加载该驱动。该函数通常由驱动的初始化函数调用,用于将驱动的相关信息注册到驱动模型中,包括驱动的名称、驱动的操作方法、驱动支持的设备类型等。驱动注册后,系统可以根据设备类型来匹配并加载对应的驱动,从而实现设备的自动识别和驱动加载。驱动程序的探测函数(probe)将在设备与驱动程序匹配时调用,以便进行设备的初始化。移除函数(remove)将在设备从系统中移除时调用,以进行相关的清理操作。原创 2025-01-22 12:39:42 · 1224 阅读 · 0 评论 -
Linux 设备树
Linux 知识(2) 设备树(Device Tree),将这个词分开就是“设备”和“树”,描述设备树的文件叫做 DTS(Device Tree Source),这个 DTS 文件采用树形结构描述板级设备,也就是开发板上的设备信息,比如CPU 数量、 内存基地址、IIC 接口上接了哪些设备、SPI 接口上接了哪些设备等等,如下图所示: 在以前的内核中,还没有采用设备树,内核源码中有大量的arch/arm/mach-xxx和arch/arm/plat-xxx文件夹,用于存储不同平台的板级信息,原创 2025-01-21 18:42:41 · 833 阅读 · 0 评论 -
树莓派 4B 指南
树莓派,(英语:Raspberry Pi,简写为RPi,别名为RasPi / RPI) [1]是为学习计算机编程教育而设计,只有信用卡大小的微型电脑,其系统基于Linux。随着Windows 10 IoT的发布,用户可以用上运行Windows的树莓派。原创 2025-01-15 15:07:02 · 1448 阅读 · 0 评论 -
Linux 工作队列
可以使用动态分配的也可以使用静态方式定义,最后再调用来初始化 work ,其次是衍生的一些其他接口,大多是标志位的不同,其次是delay_work这才是中断低半部常用的接口。原创 2025-01-09 17:03:31 · 849 阅读 · 0 评论 -
SCSI 简述
SCSI 协议主要是在主机和存储设备之间传送命令、状态和块数据。操作系统对外部设备(如磁盘、磁带、光存储、打印机和扫描仪)的I/O操作,可以通过SCSI协议来实现,一般情况下SCSI协议都嵌入到设备驱动器或者主机适配器的板载逻辑中。因为SCSI协议层位于操作系统和外部资源之间,它具有不同的功能组件。例如,应用程序一般将数据作为文件或者记录来访问。尽管数据最终都将在磁盘或者磁带介质上以数据块的方式存放,但是文件的检索需要一系列功能将未加工的块数据装配成应用程序能够操作的连续文件。原创 2025-01-09 10:04:28 · 497 阅读 · 0 评论 -
Linux 知识(2)
Linux中 /boot 目录介绍Linux中/boot目录当前 Linux 系统的 kernel 配置文件,可以使用下面指令查看。initrd.img-4.14.0-kali3-amd64(cpio格式)initrd 全名 initial ram disk,启动系统所需加载的虚拟磁盘。它是 vmlinuz 的映像文件。linux 的正式内核。内核符号映射表,顾名思义就是将内核中的符号(也就是内核中的函数)和它的地址能联系起来的一个列表。grub引导加载程序相关的文件。原创 2025-01-06 11:00:41 · 1097 阅读 · 0 评论 -
Linux 内核调试
如果你需要在系统启动时自动加载特定的内核模块,你可以编辑/etc/modules-load.d目录下的配置文件或者在/etc/modules文件中直接添加模块名。自动加载驱动程序通常意味着当某些事件发生时,系统会自动加载相应的内核模块。modprobe基于内核配置中的依赖关系和模块参数来决定是否自动加载模块。默认的内核编译命令会编译使能的模块,但生成的ko文件分散在各个文件夹内可在编译时传入参数。在系统下次启动时,这些模块将会自动通过modprobe或insmod加载。原创 2024-12-31 14:32:34 · 676 阅读 · 0 评论 -
Linux内核设备驱动模块自动加载机制解析
现在大多数硬件设备的驱动都是作为模块出现的,Linux启动过程中会自动加载这些模块,本文通过内核源码简要说明这个过程。转载 2024-10-14 11:47:26 · 332 阅读 · 0 评论 -
V4l2 专栏
V4L2(Video for Linux 2)是 Linux 操作系统中用于支持摄像头和视频设备的框架。它提供了一组 API 和驱动程序接口,用于在 Linux 系统中进行视频采集、视频流处理和视频播放等操作。设备抽象层:V4L2 框架提供了一个设备抽象层,使得应用程序可以与各种不同类型的视频设备进行通信,包括摄像头、视频采集卡等。统一的控制接口:V4L2 定义了一套统一的控制接口,可以通过这些接口来配置和调整视频设备的各种参数,比如亮度、对比度、饱和度等。原创 2024-06-25 11:05:25 · 219 阅读 · 0 评论 -
Linux GDB 调试
【代码】Linux GDB 调试。原创 2024-01-04 17:23:32 · 564 阅读 · 0 评论 -
QEMU 虚拟机
gdbtcp::1234开启GDB服务器,端口可以自己指定。cmdline:nokaslr(禁用内核地址空间布局随机)-s开启GDB服务器,端口1234。-S在开始时阻塞CPU执行。CTAL+A,然后按x键。原创 2023-12-15 14:36:58 · 2204 阅读 · 0 评论 -
如何把模块加入内核树中
下面将以一个实例来说明怎样加入内核树的。目标:在Linux内核下的drivers目录下添加一个studydrive目录,并在其内加入globalmem.c,Kconfig,Makefile文件,以便生成globalmem的驱动模块。注意加入内核树,源代码必须放在相应的目录下。以下为globalmen.c 内容:#include #include #include #incl原创 2011-10-31 17:11:14 · 979 阅读 · 0 评论 -
Linux内核模块自动加载机制
思考如 果想让内核启动过程中自动加载某个模块该怎么做呢?最容易想到的方法就是到/etc/init.d/中添加一个启动脚本,然后在/etc/rcN.d/目 录下创建一个符号链接,这个链接的名字以S开头,这内核启动时,就会自动运行这个脚本了,这样就可以在脚本中使用modprobe来实现自动加载。但是我 们发现,内核中加载了许多硬件设备的驱动,而搜索/etc目录,却没有发现任何脚本负责加载这些硬转载 2012-08-30 10:40:45 · 1193 阅读 · 0 评论 -
通过hello world介绍2.6内核模块编译的最基本原理 .
1、makefile的预备知识本文旨在介绍编译模块的原理,不详细介绍makefile。下面是一个简单的没有任何用途的makefile:1 MAKE_TEST = make test 2 3 all: 4 @echo "make all" 5 @echo "MAKE_TEST = $(MAKE_TEST)" 6 7 test: 8转载 2012-08-30 10:39:42 · 1730 阅读 · 0 评论 -
framebuffer驱动全篇(五)
Fb console中的字体/driver/video目录下:font_6x11.c,font_8x8.c,font_8x16.cfont_acorn_8x8.c,font_pearl_8x8.c,font_sun8x16.c,font_sun12x22.cfonts.c这些文件都是用来处理在fbcon中的字体显示问题。其中除最后一个文件fonts.c外,其他都是字模文件由转载 2011-12-21 09:55:15 · 1237 阅读 · 0 评论 -
framebuffer驱动全篇(四)
本文介绍的设备是位于/video目录下面的anakinfb.c驱动程序。虽然我不清楚那个设备的特性,但是从对程序的分析中我们仍然知道如何编写一个frame buffer设备驱动。本文是个标准的fb驱动。共221行,包含函数如下:1. static int anakinfb_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blu转载 2011-12-21 09:53:28 · 956 阅读 · 0 评论 -
Writing Linux LCD drivers—深入分析framebuffer设备驱动的结构
Writing Linux LCD drivers——本文深入地分析了framebuffer设备驱动的结构作者:JimShengWriting Linux LCD drivers Abstract 1 LCD Module\Driver\Controller 2 Linux Frame Buffer Driver 2.1 Why Frame Buffer? 2.转载 2011-12-21 09:56:18 · 1072 阅读 · 0 评论 -
framebuffer驱动全篇(二)
还是要补充点,下面是/linux/fb.h的部分注释,加粗的是常用的,红色是关键的,一般不可少。旁边没有汉字,要么很简单没必要加注,要么就用不到!注释:[email protected]#ifndef _LINUX_FB_H#define _LINUX_FB_H#include#include/* Definitions of frame buff转载 2011-12-21 09:51:29 · 1094 阅读 · 0 评论 -
framebuffer驱动(一)
转自:http://hi.baidu.com/excellentderek/blog/item/f387e64e24b713cdd0c86a59.html在后续的几篇里面会详细介绍如何编写一个显卡的驱动程序。framebuffer device在内核里面作为显卡驱动模型,许多函数和数据结构都是特定,正是这些特定的东西为我们的编程提供了方便。要开发frame buffer devic转载 2011-12-21 09:49:56 · 1029 阅读 · 0 评论 -
深度探索Linux操作系统 —— Linux图形原理探讨
本质上,谈及图形原理必会涉及渲染和显示两部分。但是显示过程比较简单和直接,而渲染过程要复杂得多,更重要的是,渲染牵扯到操作系统内部的组件更多,因此,本章我们主要讨论渲染过程。我们不想只浮于理论,结合具体的GPU进行讨论更有助于深度理解计算机的图形原理。相比于 NV 及 ATI 的 GPU ,我们选择相对更开放一些的Intel的 GPU 进行讨论。Intel 的 GPU 也在不断的演进,本书写作时主要针对的是用在和Ivy Bridge架构上的。原创 2023-12-14 10:25:48 · 995 阅读 · 0 评论 -
深度探索Linux操作系统 —— 构建桌面环境
计算机领域中的桌面环境()其实是一种比喻的说法,即图形用户界面就像物理书桌一样,其上可以放置文件夹、文档等。桌面最初用来特指个人计算机(PC),但是现在不只个人计算机有图形界面环境,服务器、嵌入式设备等基本都提供桌面环境。桌面环境包括窗口管理器、任务条等基本组件,除了这些基本的组件外,有的桌面环境还提供文件管理器、控制面板等。桌面环境是操作系统中人机交互的关键部分,理解它的基本运作原理,无论是对理解操作系统,还是对开发应用程序,都有极大的帮助。原创 2023-12-13 09:05:47 · 908 阅读 · 0 评论 -
深度探索Linux操作系统 —— 构建根文件系统
在第 3 章中,我们通过手工的方式展示了从零构建根文件系统的过程。在本章中,我们将构建一个相对完善的根文件系统,但是我们不再从零开始,毕竟一旦熟悉了原理后,余下的就是简单的重复了。第 2 章编译工具链时曾通过参数 “” 指定了目标系统的文件安装的目录,后续所有的为目标系统编译的文件全部安装到了这个目录下。因此,在本章中,我们就基于这个目录下的文件构建运行在真实系统上的根文件系统。原创 2023-12-12 14:35:56 · 468 阅读 · 0 评论 -
深度探索Linux操作系统 —— 从内核空间到用户空间
因为某些文件系统的一些特性或者一些修复文件系统的操作,有可能导致文件系统中的文件所在的扇区发生改变。其他模块完全可以存储在文件系统上,通过文件系统的接口访问这些模块,避开了因为如修复文件系统而引起文件所在扇区的变化而带来的风险。为简单起见,我们只讨论典型的从硬盘加载操作系统的过程,所以后续的讨论全部是针对从硬盘启动的情况。嵌入到这个区域也不是必须的,但是因为这个相对安全的原因,GRUB 的开发人员推荐将 GRUB 嵌入到这个区域。在嵌入的映像中包含硬件及文件系统的驱动,因此,一旦嵌入的映像载入内存,原创 2023-12-10 17:33:42 · 426 阅读 · 0 评论 -
深度探索Linux操作系统 —— 构建initramfs
一般而言,桌面、服务器等通用系统都使用initramfs。部分嵌入式系统中,也会使用 initramfs,甚至有的使用 initramfs 作为最终的根文件系统。那么什么是 initramfs 呢?很难用一句话将 initramfs 的作用描述清楚,或许可以将initramfs定位为内核通往根文件系统的桥梁。原创 2023-12-08 09:53:52 · 1094 阅读 · 0 评论 -
深度探索Linux操作系统 —— 构建内核
内核的构建系统kbuild基于GNU Make,是一套非常复杂的系统。对于编译内核而言,一条make命令就足够了。因此,构建内核最困难的地方不是编译,而是编译前的配置。配置内核时,通常我们都能找到一些参考。比如,对于桌面系统,可以参考主流发行版的内核配置。但是,这些发行版为了能够在更多的机器上运行,几乎选择了全部的配置选项,编译了全部的驱动,不仅增加了内核的体积,还降低了内核的运行速度。再比如,对于嵌入式系统,BSP。原创 2023-12-07 11:49:46 · 481 阅读 · 0 评论 -
深度探索Linux操作系统 —— 构建工具链
《深度探索Linux系统:系统构建和原理解析》笔记——2.工具链构建 深度探索Linux操作系统 —— 编译过程分析深度探索Linux操作系统 —— 构建工具链 编译过程分为4个阶段,分别是:编译预处理、编译、汇编以及链接。每个阶段都涉及了若干工具,GNU将这些工具分别包含在3个软件包中:Binutils、GCC、Glibc。Binutils:GNU将凡是与二进制文件相关的工具,都包括在软件包Binutils中。Binutils就是 Binary utilities 的简写,其中主要包括生成目标文原创 2023-12-06 10:20:10 · 511 阅读 · 0 评论 -
深度探索Linux操作系统 —— 编译过程分析
在链接时,对于模块中引用的外部符号,链接器将根据符号表进行符号的重定位。如果我们将符号表删除了,那么链接器在链接时将找不到符号的定义,从而不能进行正确的符号解析。比如,代码中以 “.cfi” 开头的伪指令是辅助汇编器创建栈帧(stack frame)信息的。,而该函数体中也只有区区一行代码,但为什么产生的汇编代码如此之长?中的符号表删除,再次进行链接,则链接器将因找不到符号定义而终止链接,如下所示。的缩写,表示符号 foo2、foo2_func 是未定义的。来说是外部符号,没有在任何一个段中,所以在列。原创 2023-12-05 10:28:42 · 450 阅读 · 0 评论 -
Linux 内核源代码情景分析(四)
也就是说,还不能按一定的路径名访问其中特 定的节点或文件(虽然作为 “设备” 是可访问的).只有把它 “安装” 到计算机系统的文件系统中某个 节点上,才能使设备上的文件和节点成为可访问的。一般而言,文件系统的结构就好像一棵倒立的树,不过由 于可能存在着的节点间的 “连接” 和 “符号连接” 而并不一定是严格的图论意义上的 “树”。同一个物理的设备,如果有两组不同的驱动程序,在 逻辑上就被视作两种不同的设备而在文件系统中有两个不同的 “设备文件1次设备号则指明该设备是 同种设备中的第几个。原创 2023-07-05 10:13:59 · 561 阅读 · 0 评论 -
Linux 内核源代码情景分析(三)
首先,其中“文件”的含义就自狭义与广义之分。以在网络环境中用来收发报文的“插口”机制来说,它就并不代表存储着的信息,但是插口的发送端“消耗”信息,而接收端则“产出”信息,所以把插口看成文件是合乎逻辑的。这样,用户程序就可以把所有的文件都看作一致的、抽象的 “VFS文件” ,通过这些系统调用对文件进行操作,而无需关心具体的文件属于什么文件系统以及具体文件系统的设计和实现。这样,就可以对用户程序隐去各种不同文件系统的实现细节,为用户程序提供一个统一的、抽象的、虚拟的文件系统界面,这就是所谓“虚拟文件系统”原创 2023-07-04 10:34:04 · 597 阅读 · 0 评论