Linux内核
文章平均质量分 96
Liuqz2009
不念过去不畏将来,全心活在当下!
寒窗二十载,人生再出发!
展开
-
V4l2 专栏
V4L2(Video for Linux 2)是 Linux 操作系统中用于支持摄像头和视频设备的框架。它提供了一组 API 和驱动程序接口,用于在 Linux 系统中进行视频采集、视频流处理和视频播放等操作。设备抽象层:V4L2 框架提供了一个设备抽象层,使得应用程序可以与各种不同类型的视频设备进行通信,包括摄像头、视频采集卡等。统一的控制接口:V4L2 定义了一套统一的控制接口,可以通过这些接口来配置和调整视频设备的各种参数,比如亮度、对比度、饱和度等。原创 2024-06-25 11:05:25 · 170 阅读 · 0 评论 -
Linux GDB 调试
【代码】Linux GDB 调试。原创 2024-01-04 17:23:32 · 511 阅读 · 0 评论 -
qemu 虚拟机
gdb tcp::1234 开启 GDB 服务器,端口可以自己指定。cmdline:nokaslr (禁用内核地址空间布局随机)-s 开启 GDB 服务器,端口 1234。-S 在开始时阻塞 CPU 执行。CTAL + A,然后按 x 键。原创 2023-12-15 14:36:58 · 1489 阅读 · 0 评论 -
如何把模块加入内核树中
下面将以一个实例来说明怎样加入内核树的。目标:在Linux内核下的drivers目录下添加一个studydrive目录,并在其内加入globalmem.c,Kconfig,Makefile文件,以便生成globalmem的驱动模块。注意加入内核树,源代码必须放在相应的目录下。以下为globalmen.c 内容:#include #include #include #incl原创 2011-10-31 17:11:14 · 934 阅读 · 0 评论 -
Linux内核模块自动加载机制
思考如 果想让内核启动过程中自动加载某个模块该怎么做呢?最容易想到的方法就是到/etc/init.d/中添加一个启动脚本,然后在/etc/rcN.d/目 录下创建一个符号链接,这个链接的名字以S开头,这内核启动时,就会自动运行这个脚本了,这样就可以在脚本中使用modprobe来实现自动加载。但是我 们发现,内核中加载了许多硬件设备的驱动,而搜索/etc目录,却没有发现任何脚本负责加载这些硬转载 2012-08-30 10:40:45 · 1120 阅读 · 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 · 1696 阅读 · 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 · 1167 阅读 · 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 · 919 阅读 · 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 · 1043 阅读 · 0 评论 -
framebuffer驱动全篇(二)
还是要补充点,下面是/linux/fb.h的部分注释,加粗的是常用的,红色是关键的,一般不可少。旁边没有汉字,要么很简单没必要加注,要么就用不到!注释:good02xaut@hotmail.com#ifndef _LINUX_FB_H#define _LINUX_FB_H#include#include/* Definitions of frame buff转载 2011-12-21 09:51:29 · 1062 阅读 · 0 评论 -
framebuffer驱动(一)
转自:http://hi.baidu.com/excellentderek/blog/item/f387e64e24b713cdd0c86a59.html在后续的几篇里面会详细介绍如何编写一个显卡的驱动程序。framebuffer device在内核里面作为显卡驱动模型,许多函数和数据结构都是特定,正是这些特定的东西为我们的编程提供了方便。要开发frame buffer devic转载 2011-12-21 09:49:56 · 992 阅读 · 0 评论 -
深度探索Linux操作系统 —— Linux图形原理探讨
本质上,谈及图形原理必会涉及渲染和显示两部分。但是显示过程比较简单和直接,而渲染过程要复杂得多,更重要的是,渲染牵扯到操作系统内部的组件更多,因此,本章我们主要讨论渲染过程。我们不想只浮于理论,结合具体的GPU进行讨论更有助于深度理解计算机的图形原理。相比于 NV 及 ATI 的 GPU ,我们选择相对更开放一些的Intel的 GPU 进行讨论。Intel 的 GPU 也在不断的演进,本书写作时主要针对的是用在和Ivy Bridge架构上的。原创 2023-12-14 10:25:48 · 483 阅读 · 0 评论 -
深度探索Linux操作系统 —— 构建桌面环境
计算机领域中的桌面环境()其实是一种比喻的说法,即图形用户界面就像物理书桌一样,其上可以放置文件夹、文档等。桌面最初用来特指个人计算机(PC),但是现在不只个人计算机有图形界面环境,服务器、嵌入式设备等基本都提供桌面环境。桌面环境包括窗口管理器、任务条等基本组件,除了这些基本的组件外,有的桌面环境还提供文件管理器、控制面板等。桌面环境是操作系统中人机交互的关键部分,理解它的基本运作原理,无论是对理解操作系统,还是对开发应用程序,都有极大的帮助。原创 2023-12-13 09:05:47 · 390 阅读 · 0 评论 -
深度探索Linux操作系统 —— 构建根文件系统
在第 3 章中,我们通过手工的方式展示了从零构建根文件系统的过程。在本章中,我们将构建一个相对完善的根文件系统,但是我们不再从零开始,毕竟一旦熟悉了原理后,余下的就是简单的重复了。第 2 章编译工具链时曾通过参数 “” 指定了目标系统的文件安装的目录,后续所有的为目标系统编译的文件全部安装到了这个目录下。因此,在本章中,我们就基于这个目录下的文件构建运行在真实系统上的根文件系统。原创 2023-12-12 14:35:56 · 295 阅读 · 0 评论 -
深度探索Linux操作系统 —— 从内核空间到用户空间
因为某些文件系统的一些特性或者一些修复文件系统的操作,有可能导致文件系统中的文件所在的扇区发生改变。其他模块完全可以存储在文件系统上,通过文件系统的接口访问这些模块,避开了因为如修复文件系统而引起文件所在扇区的变化而带来的风险。为简单起见,我们只讨论典型的从硬盘加载操作系统的过程,所以后续的讨论全部是针对从硬盘启动的情况。嵌入到这个区域也不是必须的,但是因为这个相对安全的原因,GRUB 的开发人员推荐将 GRUB 嵌入到这个区域。在嵌入的映像中包含硬件及文件系统的驱动,因此,一旦嵌入的映像载入内存,原创 2023-12-10 17:33:42 · 230 阅读 · 0 评论 -
深度探索Linux操作系统 —— 构建initramfs
一般而言,桌面、服务器等通用系统都使用initramfs。部分嵌入式系统中,也会使用 initramfs,甚至有的使用 initramfs 作为最终的根文件系统。那么什么是 initramfs 呢?很难用一句话将 initramfs 的作用描述清楚,或许可以将initramfs定位为内核通往根文件系统的桥梁。原创 2023-12-08 09:53:52 · 749 阅读 · 0 评论 -
深度探索Linux操作系统 —— 构建内核
内核的构建系统kbuild基于GNU Make,是一套非常复杂的系统。对于编译内核而言,一条make命令就足够了。因此,构建内核最困难的地方不是编译,而是编译前的配置。配置内核时,通常我们都能找到一些参考。比如,对于桌面系统,可以参考主流发行版的内核配置。但是,这些发行版为了能够在更多的机器上运行,几乎选择了全部的配置选项,编译了全部的驱动,不仅增加了内核的体积,还降低了内核的运行速度。再比如,对于嵌入式系统,BSP。原创 2023-12-07 11:49:46 · 262 阅读 · 0 评论 -
深度探索Linux操作系统 —— 构建工具链
《深度探索Linux系统:系统构建和原理解析》笔记——2.工具链构建 深度探索Linux操作系统 —— 编译过程分析深度探索Linux操作系统 —— 构建工具链 编译过程分为4个阶段,分别是:编译预处理、编译、汇编以及链接。每个阶段都涉及了若干工具,GNU将这些工具分别包含在3个软件包中:Binutils、GCC、Glibc。Binutils:GNU将凡是与二进制文件相关的工具,都包括在软件包Binutils中。Binutils就是 Binary utilities 的简写,其中主要包括生成目标文原创 2023-12-06 10:20:10 · 268 阅读 · 0 评论 -
深度探索Linux操作系统 —— 编译过程分析
在链接时,对于模块中引用的外部符号,链接器将根据符号表进行符号的重定位。如果我们将符号表删除了,那么链接器在链接时将找不到符号的定义,从而不能进行正确的符号解析。比如,代码中以 “.cfi” 开头的伪指令是辅助汇编器创建栈帧(stack frame)信息的。,而该函数体中也只有区区一行代码,但为什么产生的汇编代码如此之长?中的符号表删除,再次进行链接,则链接器将因找不到符号定义而终止链接,如下所示。的缩写,表示符号 foo2、foo2_func 是未定义的。来说是外部符号,没有在任何一个段中,所以在列。原创 2023-12-05 10:28:42 · 283 阅读 · 0 评论 -
Linux 内核源代码情景分析(四)
也就是说,还不能按一定的路径名访问其中特 定的节点或文件(虽然作为 “设备” 是可访问的).只有把它 “安装” 到计算机系统的文件系统中某个 节点上,才能使设备上的文件和节点成为可访问的。一般而言,文件系统的结构就好像一棵倒立的树,不过由 于可能存在着的节点间的 “连接” 和 “符号连接” 而并不一定是严格的图论意义上的 “树”。同一个物理的设备,如果有两组不同的驱动程序,在 逻辑上就被视作两种不同的设备而在文件系统中有两个不同的 “设备文件1次设备号则指明该设备是 同种设备中的第几个。原创 2023-07-05 10:13:59 · 386 阅读 · 0 评论 -
Linux 内核源代码情景分析(三)
首先,其中“文件”的含义就自狭义与广义之分。以在网络环境中用来收发报文的“插口”机制来说,它就并不代表存储着的信息,但是插口的发送端“消耗”信息,而接收端则“产出”信息,所以把插口看成文件是合乎逻辑的。这样,用户程序就可以把所有的文件都看作一致的、抽象的 “VFS文件” ,通过这些系统调用对文件进行操作,而无需关心具体的文件属于什么文件系统以及具体文件系统的设计和实现。这样,就可以对用户程序隐去各种不同文件系统的实现细节,为用户程序提供一个统一的、抽象的、虚拟的文件系统界面,这就是所谓“虚拟文件系统”原创 2023-07-04 10:34:04 · 494 阅读 · 0 评论 -
Linux 内核源代码情景分析(二)
读者要注意,不要把这里的“线程”与有些系统中在用户空间的同一进程内实现的 “线程” 相混淆。而且,既然 Linux 内核提供了对线程的支持,一般也就没有必要再在进程内部,即用户空间中自行实现线程。之所以有这样的情况是因为 Linux 源自 Unix 和 i386 系统结构,而 Unix 中的进程在 Intel 的技术资料中则称为“任务”(严格说来有点差别,但是对 Linux 和 Unix 的实现来说是一码事)。另一方面,进程与线程的区分也不是十分严格的,一般在讲到进程时常常也包括了线程。原创 2023-06-29 17:31:27 · 694 阅读 · 0 评论 -
Linux 内核源代码情景分析(一)
可是,从系统 (PC) 的 CPU 的角度来说,它只知道这片物理存储区间是从 0x0000 f000 0000 0000 开始的,这就是该区间的物理地址,或者说 “总线地址”。其次,这样的需求只发生于对外部设备的操作,而这是内核的事,所以相应的虚存区间是在系统空间 (3GB 以上)。这里读者可能会有个问题,185 行的 if 语句检查的是当前的起始地址加上区间大小须小于下一个区间的起始地址,这是很好理解的。则不同,首先,我们先有一个物理存储区间,其地址就是外设卡上的存储器出现在总线上的地址。原创 2023-06-28 16:43:18 · 867 阅读 · 0 评论 -
深入理解Linux虚拟内存管理(九)
这是文件系统提供的回调函数,用于读取超级块。对于普通的文件系统,这可以从磁盘读取细节信息,但是,由于这个文件系统基于。这个函数更新文件系统中可用块和索引节点的数量。在文件系统挂载和卸载时进行设置。这是创建新文件时位于最顶层的函数。这个函数用于注册和挂载。原创 2023-06-20 15:42:52 · 878 阅读 · 0 评论 -
深入理解Linux虚拟内存管理(八)
其原因是页面只在此处自动映射,那么在解除映射以前只会在很小的范围且较短的时间内被使用。保留页面在那里是安全的,因为在解除映射之后不会再引用它们,而对同一个槽的另一个映射会简单地替换它。它是创建弹性缓冲区的高层函数。在系统启动时调用它,接着就删除它的代码,因为不再需要它。由于缓冲区用于从高端内存复制数据到设备,除了回收资源没有其他更多的任务待处理。在数据从设备读出且待复制到高端内存时,调用该函数。在设备完成写数据到弹性缓冲区后,从中断中调用该函数。它首先尝试从伙伴分配器分配页面,如果失败则从紧急池中分配。原创 2023-06-08 17:50:25 · 1137 阅读 · 0 评论 -
深入理解Linux虚拟内存管理(七)
虽然有点容易混淆,但它们实际上都是一样的。将所有的已映射区域删除,而且所有的页表也将会销毁,因为已经没有任何使用用户空间部分的使用者。这个函数非常大,所以把它分成几个部分。链接到相应链表中的高层函数。它负责获取所需的锁来保证插入的安全性。这个函数负责在给定地址找到一个合适的位置来插入。它通过实际的返回和函数参数返回一系列的信息。插入地址空间的顶层函数。是前一个节点,这里需要它是因为链表是个单链表。的简单封装函数,它完成如下大部分工作。个链表中的辅助函数,这些链表把。链接到一个共享文件映射的链表中。原创 2023-06-13 16:59:31 · 996 阅读 · 0 评论 -
深入理解Linux虚拟内存管理(六)
当卸载某个模块时,如果创建了高速缓存,则它负责销毁高速缓存。内核代码经常不销毁它自己的高速缓存,因为它们在整个系统生命周期中都一直存在。这在销毁高速缓存时比较重要,在那时,释放的内存量并不很重要,重要的是安全地删除高速缓存,且不泄漏内存。在创建高速缓存时,可以存放多少个对象以及需要耗费多少空间是确定的。这个函数负责创建一个新的高速缓存,然后根据大小进行批量处理。这在销毁高速缓存时比较重要,在那时它不关心释放的页面数,而只关心高速缓存是否为空。这个函数进行基本的调试检查,然后获取高速缓存描述符,接着释放。原创 2023-06-10 10:08:10 · 900 阅读 · 0 评论 -
深入理解Linux虚拟内存管理(五)
这些函数与页面分配的辅助函数非常相似,因为它们也不完成 “实际” 的工作,它们依赖于。这个函数将完成实际的释放页面工作,并在可能的情况下合并伙伴。这个函数的调用图如图 6.4 所示。是一个以地址为参数的辅助函数。描述,具体可参考 ⇒。函数来完成实际的释放。原创 2023-06-07 14:59:12 · 1062 阅读 · 0 评论 -
深入理解Linux虚拟内存管理(四)
一旦确定了可用物理页面的界限,系统将从两个引导内存的初始化函数中选择一个,并以待初始化的节点的起始和终止PFN作为调用参数。在UMA结构中,用于初始化,而在NUMA则初始化一个具体的节点。这两个函数主要通过调用来完成实际工作。内核函数首先要把插入到pgdat_list链表中,因为这个节点在函数末尾很快就会用到。然后它记录下该节点的起始和结束地址(该节点与有关)并且分配一个位图来表示页面的分配情况。原创 2023-06-05 16:05:47 · 710 阅读 · 0 评论 -
深入理解Linux虚拟内存管理(三)
file_operations 由 shmem_file_operations 调用,它提供函数实现 mmap(),read(,write()和。由一个类型为 shm_vm_ops 的 vm_operations_struct()来维护,它分别注册了 open())和 close())inode i_mapping a_ops,inode i_op 和 inode→i_fop 字段。同样 tmpfs 也没有使用 shmem_prepare_write()和 shmem_commit_write(,原创 2023-06-03 10:24:23 · 369 阅读 · 0 评论 -
深入理解Linux虚拟内存管理(二)
在 SMP 系统中,有另外的方案来利用高速缓存,即每一个高速缓存都有一个小的对象数组,而这些对象就是为每一个 CPU。分配器的基本思想是:将内核中经常使用的对象放到高速缓存中,并且由系统保持为初始的可利用状态。由连续的页面帧组成,它们被划分成许多小的块以存放由高速缓存所管理的数据结构和对象。分配器的论文,并进一步做了大量的改进,这在他最近的论文中 [BA01] 有所描述。在编译的时候,如 果设置了选项 CONFIG_SLAB_DEBUG,slab 分配器会提供额外的。初始化内核中许多数据结构所需要的。原创 2023-05-31 16:09:59 · 1213 阅读 · 0 评论 -
深入理解Linux虚拟内存管理(一)
本文基于 Linux 2.4.22。开始启程管理源码浏览代码阅读代码提交补丁。原创 2023-05-25 15:27:11 · 2290 阅读 · 0 评论 -
设备驱动畅想
主要介绍了字符设备驱动,以及各个设备子系统原创 2023-10-16 14:44:41 · 144 阅读 · 0 评论 -
Linux设备驱动开发详解
本文主要用来摘录《Linux设备驱动开发详解第四版》一书中学习知识点,本书基于 Linux 4.0 版本,源代码摘录基于 Linux 4.15.18 ,两者之间可能有些出入。资源链接:宋宝华《Linux设备驱动开发详解》设备驱动的作用无操作系统时的设备驱动有操作系统时的设备驱动Linux设备驱动Linux设备驱动的开发环境构建设备驱动Hello World:LED驱动。原创 2023-04-27 10:26:54 · 531 阅读 · 0 评论 -
Linux 设备驱动程序(四)
【代码】Linux 设备驱动程序(四)原创 2023-06-25 11:33:46 · 729 阅读 · 0 评论 -
Linux 设备驱动程序(三)
内核逻辑地址组成了内核的常规地址空间。在大多数体系架构中,逻辑地址和与其相关联的物理地址的不同,仅仅是在它们之间存在一个固定的偏多量。逻辑地址使用硬件内建的指针大小,因此在安装了大量内存的。内核虚拟地址和逻辑地址的相同之处在于,它们都将内核空间的地址映射到物理地址上。内核虚拟地址与物理地址的映射不必是线性的和一对一的,而这是逻辑地址空间的特点。所有的逻辑地址都是内核虚拟地址,但是许多内核虚拟地址不是逻辑地址。位的,这取决于硬件的体系架构。分配的内存具有一个虚拟地址(但并不存在直接的物理映射)。原创 2023-05-23 16:55:32 · 843 阅读 · 0 评论 -
Linux 设备驱动程序(二)
顶半部处理例程和底半部处理例程之间最大的不同,就是当底半部处理例程执行时,所有的中断都是打开的 —— 这就是所谓的在更安全时间内运行。信号线不能为一个以上的设备服务,它们从来都是不够用的,结果,许多没有经验的用户总是花费很多时间试图找到一种方法使所有的硬件能够协同工作,因此他们不得不总是打开自己计算机的外壳。无论何时,当两个或者更多的驱动程序共享同一根中断信号线,而硬件又通过这根信号线中断处理器时,内核会调用每一个为这个中断注册的处理例程,并将它们自己的。未被设置),将重新启用硬件中断,并调用处理例程。原创 2023-05-16 17:34:18 · 748 阅读 · 0 评论 -
Linux 设备驱动程序(一)
本文主要用来摘录《Linux 设备驱动程序第三版》一书中学习知识点,本书基于 Linux 2.6.10 版本,源代码摘录基于 Linux 2.6.34 ,两者之间可能有些出入。驱动模块构建【视频】 Linux之驱动开发篇Linux内核模块分析(module_init宏)Linux驱动编程中EXPORT_SYMBOL() 介绍Linux EXPORT_SYMBOL宏详解return 0;原创 2023-04-27 10:26:26 · 348 阅读 · 0 评论 -
深入理解 Linux 内核(二)
在请求分配的情况下,该部分搜索一个能满足所请求的一组连续页框内存的管理区(参见后面的 “管理区分配器” 一节)。定时器的警告:因为对定时器函数的检查总是由可延迟函数进行,而可延迟函数被激活以后很长时间才能被执行,因此,内核不能确保定时器面数正好在定时到期时开始执行,而只能保证在适当的时间执行它们,或者假定延迟到几百毫秒之后执行它们。结构中,把物理内存分组在一个单独的节点中可能显得没有用处,但是,这种方式有助于内存代码的处理更具有可移植性,因为内核假定在所有的体系结构中物理内存都被划分为一个或多个节点。原创 2023-05-05 10:47:15 · 610 阅读 · 1 评论 -
深入理解 Linux 内核
本文主要用来摘录《深入理解 Linux 内核》一书中学习知识点,本书基于 Linux 2.6.11 版本,源代码摘录基于 Linux 2.6.34 ,两者之间可能有些出入。原创 2023-04-26 16:24:43 · 3732 阅读 · 2 评论