随笔分类 - Kernel
摘要:在32位系统中,即使物理内存为4GB,但由于地址空间和硬件限制,实际可用的低端内存(low memory)只有大约800MB左右。以下我将详细解释其中的原因。 1. 32位地址空间的限制 1.1 32位系统的地址空间 虚拟地址空间: 在32位系统中,虚拟地址空间的范围是0x00000000到0xFF
阅读全文
摘要:一、源码获取 方法1: git clone git://git.launchpad.net/~ubuntu-kernel/ubuntu/+source/linux/+git/focal 方法2: # apt-cache search linux-source linux-source - Linux
阅读全文
摘要:不同的机器编译同一个版本的内核源码生成的签名密钥 (`signing_key.pem`) 是不相同的。以下是原因和详细解释: 签名密钥 (`signing_key.pem`) 的生成过程 当你在编译内核时,默认情况下,内核编译过程会生成一个新的签名密钥对(包括 `signing_key.pem` 和
阅读全文
摘要:硬件平台:CM4 8G RAM核心板 Hardware : BCM2711 Revision : d03141 Serial : 100000002297c853 Model : Raspberry Pi Compute Module 4 Rev 1.1 系统:树莓派32位OS 问题背景:核心板是8
阅读全文
摘要:内核System.map是一个文本文件,记录了操作系统内核中各个函数和变量的地址信息。它是通过编译和链接操作系统内核时生成的。 System.map文件对于内核调试非常有用,因为它可以提供内核中各个函数和变量的地址。当在内核发生崩溃或者调试时,可以通过System.map文件来定位问题所在的函数或变
阅读全文
摘要:尽管通过打印进行调试可以满足大多数调试需求,但在某些情况下,我们需要在运行时监视Linux内核以跟踪奇怪的行为,包括延迟、CPU占用、调度问题等等。在Linux世界中,实现这一点最有用的工具是内核本身的一部分。最重要的是ftrace,这是一种Linux内核内部跟踪工具,也是本文章的主要主题。 使用F
阅读全文
摘要:最佳Linux内核开发实践的灵感来自于现有的内核代码。通过这种方式,您当然可以学习到好的例程。也就是说,我们不会白费力气(重复造轮子)。我们将重点讨论本章所必需的内容,即调试。最常用的调试方法包括记录和打印。为了利用这种经过时间检验的调试技术,Linux内核提供了合适的日志APIs,并公开了一个内核
阅读全文
摘要:根据Linux内核发布模型,总共有三种类型的活跃内核发布:主线版本、稳定版本和长期支持(LTS)版本。首先,由子系统维护者收集和准备bug修复和新特性,然后提交给Linus Torvalds,以便他将它们包含在自己的Linux树中,称为主线Linux树,也称为主Git存储库。这就是每个稳定版本的来源
阅读全文
摘要:编写代码并不总是内核开发中最难的部分。调试是真正的瓶颈,即使对于有经验的内核开发人员也是如此。也就是说,大多数内核调试工具都是内核本身的一部分。有时,内核通过称为Oops的消息来帮助查找错误的起源。调试可以归结为分析消息。 Oops 和 panic分析 Oops是当发生错误或未处理的异常时由Linu
阅读全文
摘要:linux实现底半部的机制主要有tasklet、workqueue、softirq和线程化irq。 1.tasklet tasklet的使用较为简单,它的执行上下文是软中断,所以在tasklet中不能睡眠,它的执行时机通常是中断顶半部返回的时候。我们只需要定义tasklet及其处理函数,并将两者关联
阅读全文
摘要:问题描述: 在CM4的USB2.0外置USB口上接了一个realtek的usb2eth网卡,型号如下: ID 0bda:8153 Realtek Semiconductor Corp. RTL8153 Gigabit Ethernet Adapter usb2eth网卡不能稳定工作,dmesg里能看
阅读全文
摘要:DMA是计算机系统的一个特性,它允许设备在没有CPU干预的情况下访问主系统内存RAM,然后允许它们投入到其他任务中。人们通常使用它来加速网络流量,但它支持任何类型的拷贝。 DMA控制器是负责DMA管理的外围设备。主要在现代处理器和微控制器中能看到它。DMA有一个用于执行内存读写操作而不占用CPU周期
阅读全文
摘要:Devres是一个内核设施,通过自动释放驱动程序中分配的资源来帮助开发人员。它简化了init/probe/open函数中的错误处理。使用Devres,每个资源分配器都有自己的托管版本,负责资源的 release 和 free。 本文严重依赖内核源代码树中的Documentation/drivermo
阅读全文
摘要:高速缓存是将频繁访问或新写入的数据从一个小而快的内存中取出或写入的过程,这个过程称为高速缓存。 脏内存是数据支持的(例如文件支持的)内存,其内容已被已修改(通常在缓存中)但尚未写回磁盘。 缓存的版本数据比磁盘版本新,这意味着两个版本不同步。 将缓存数据写回磁盘(后备存储)的机制称为回写。 我们最终将
阅读全文
摘要:内核内存有时需要重新映射,从内核到用户空间,或者从内核到内核空间。常见的用例是将内核内存重新映射到用户空间,但是当您需要访问高端内存时,也有其他情况。 kmap Linux内核将其地址空间的896 MB永久地映射到低896 MB的物理内存(低端内存)。在一个4 GB的系统上,内核只剩下128 MB来
阅读全文
摘要:除了执行面向数据RAM的操作外,您还可以执行I/O内存事务来与硬件进行通信。当涉及到访问设备的寄存器时,内核根据系统架构提供了两种可能性: 通过I/O端口:这也称为端口输入输出(PIO)。寄存器可以通过专用总线访问,并且需要特定的指令(通常在汇编程序中)来访问这些寄存器。这是x86体系结构上的情况。
阅读全文
摘要:让我们看一下下面的图,它向我们展示了存在于基于linux的系统上的不同内存分配器,稍后讨论它。 内核内存分配器概述 有一种分配机制可以满足任何类型的内存请求。根据你需要什么样的内存,你可以选择一个最接近你的目标。主要的分配器是页分配器,它只处理页(页是它能交付的最小内存单元)。然后是SLAB分配器,
阅读全文
摘要:地址转换和MMU 虚拟内存是一个概念,是给进程的一种错觉,因此它认为自己拥有巨大的、几乎无限的内存,有时甚至比系统实际拥有的内存还要多。每次访问内存位置时,由CPU将虚拟地址转换为物理地址。这种机制称为地址转换,由内存管理单元(MMU)完成,是CPU的一部分。 MMU保护内存免受未经授权的访问。给定
阅读全文
摘要:SMP多核启动 在Linux系统中,对于多核的ARM芯片而言,在Bootrom代码中,每个CPU都会识别自身ID,如果ID是0,则引导Bootloader和Linux内核执行,如果ID不是0,则Bootrom一般在上电时将自身置于WFI或者WFE状态,并等待CPU0给其发CPU核间中断或事件(一般通
阅读全文
摘要:更改kernel config配置,如下: # make menuconfig_public_linux Kernel hacking > [*] Kernel debugging Compile-time checks and compiler options > [*] Compile the
阅读全文