内核
文章平均质量分 88
DaHuangXiao
这个作者很懒,什么都没留下…
展开
-
vmalloc简单学习
vmalloc 主要用于给内核从高端内存中以页为单位分配大块内存,对应关系如下所示,主要分配 896M~1G 的物理地址空间vmalloc 的执行流程简述为:分配小块内存。实例化vmalloc内存分配器的核心数据描述符 vmap_area|vm_struct|pages,为 vmalloc 的工作提供内存基础。分配合适的虚拟内存区间 hole 从空闲红黑树找到合适大小的hole,隔离分配给 vmalloc分配物理内存。调用alloc_page系列函数,从 pcp 或者 buddy 0 阶每次原创 2022-05-27 13:45:25 · 959 阅读 · 0 评论 -
slub分配器学习系列之linux5.10
前言前一篇文章对 linux5.10 的 slab 分配器底层实现进行了探究与学习。进一步地,本篇文章将对 linux5.10 的 slub 分配器进行探究,对比看看两者的实现有何不同,做了哪些"必要的"改进。slub 分配器关于 slub 分配器的基本原理与 slab 分配器类似,只是相较于 slab 更快更直接以及更简单,主要对涉及的结构体进行学习,再以 kmalloc 为入口开始探究,并对比一下初始化过程的不同主要数据结构struct kmem_cache { struct kmem_ca原创 2022-05-25 13:23:39 · 378 阅读 · 0 评论 -
arm架构linux内核调试实战
前言偶然间,发现了一个很好用的仓,可以十分方便地进行 arm 架构的 linux 内核调试,该仓地址如下 https://github.com/cc-droid/v-kernel-qemu ,对应的解析视频在 《linux内核源码分析 【0-00】从零搭建分析调试环境》本篇笔记旨在记录一下对于该仓的使用流程,并且对其进行了一些小调整环境搭建Ubuntu安装VMware + Ubuntu20.04 ,这部分略过前置配置安装 sshd,git,vimsudo apt-get install op原创 2022-05-23 17:14:41 · 917 阅读 · 0 评论 -
slab分配器学习系列之linux5.10
前言前一篇文章对 linux2.6 的 slab 分配器底层实现进行了探究与学习。进一步地,本篇文章将对 linux5.10 的 slab 分配器进行探究,对比 2.6 看看两者的实现有何不同,做了哪些"必要的"改进。slab 分配器关于 slab 分配器的基本原理就不赘述了,直接从涉及的结构体进行学习,再以 kmalloc 为入口开始探究,并对比一下初始化过程的不同主要数据结构struct kmem_cache { struct array_cache __percpu *cpu_cache;原创 2022-05-19 14:17:09 · 323 阅读 · 0 评论 -
slab分配器学习系列之linux2.6
前言前文通过存储桶了解了 slab 分配器最简单的实现方式,在后续的 linux 版本中,slab 分配器被正式提出,并用于解决内核中小样本分配问题。笔者打算先从 2.6.18 入手进行 slab 分配器的学习主要参考资料为 《深入Linux内核架构》物理页并不是内存管理的最小单位,为了减少内部碎片,提出了 slab 分配机制。该机制其实是内存桶的复杂版,主要入口函数为 kmalloc 。其核心思想与内存桶类似,即在物理页上进一步划分连续的相同大小对象,并对此进行管理。在此使用 《简说Linux之sl原创 2022-05-18 16:22:21 · 376 阅读 · 0 评论 -
slab分配器学习系列之存储桶
前言打算对 slab 分配器进行学习,除了了解其实现原理,还要弄清其优点与不可替代性,并进行多个版本的对比,感受 slab 分配器的发展和优化。本篇笔记打算从 linux 0.12 版本开始学习,该版本没有实现 slab 分配器,但依然有类似的实现,其为存储桶。存储桶类似于 slab 分配器的简单版,很多问题都没考虑到,但用于感受 slab 分配器是很有必要的。这部分内容主要参考了 《Linux 内核完全注释》的 15.7 节存储桶概念首先,内存管理原本泛指对物理页的管理,但由于大部分结构体都很小原创 2022-05-18 14:08:13 · 345 阅读 · 0 评论 -
Linux 文件系统学习之 EROFS 源码阅读笔记
operation初始化先看看 erofs 的 inode_operation 和 file_operation 以及 address_mapping_operation 分别初始化为结构体static struct file_system_type erofs_fs_type = { .owner = THIS_MODULE, .name = "erofs", .init_fs_context = erofs_init_fs_context, .kill_原创 2022-04-21 19:57:40 · 3202 阅读 · 0 评论 -
linux多版本文件系统接口对比梳理
前言从 2.6 到 4.9 再而 5.10 , 文件系统的接口都发生了变化,为了理清它们之间的关系,打算写一篇笔记记录一下mount2.6sys_mount -> do_mount --- do_new_mount --- do_kern_mount --- vfs_kern_mount --- fs_type->get_sbstatic struct file_system_type ext2_fs_type原创 2022-04-21 18:52:29 · 335 阅读 · 0 评论 -
再次梳理linux文件系统
前言由于最近在学习文件系统相关知识。为了巩固这部分知识,想办法对其进行实践。本篇文章主要记录一下如何自定义一个文件系统。主要参考了《Linux内核探秘》——提供文件系统原理及框架说明《一个简单地文件系统》——提供较新内核的简单文件系统实现代码。全篇文章以它为例编译文件系统自定义的文件系统可以作为一个模块,通过 insmod 的方式注册到内核中。类似编译一个驱动模块,编译一个文件系统模块需要:文件系统相关代码Makefile文件系统相关代码后续再进行说明,首先关注 Makefile 。原创 2022-04-20 20:25:36 · 1012 阅读 · 0 评论 -
Linux内核对比学习系列(6)——文件系统
前言最近给自己定了个小目标,把 erofs 整明白。在此之前,需要将 linux 内核关于文件系统的内容进行梳理。本篇博客主要记录一下自己对文件系统的理解,并对比 linux 0.12 与 2.6 版本之间关于文件系统的实现上有何不同简述文件管理流程尽管 2.6 版本的实现相较于 0.12 复杂很多,但不同实现的本质还是不变的。以块设备为例,主要围绕如何管理文件并存储与块设备中。总述每个进程的 task_struct 维护一个文件描述符表,文件描述符表的每个元素为一个文件结构体 file。而文件描原创 2022-04-19 10:31:47 · 865 阅读 · 0 评论 -
Linux内核对比学习系列(5)——内存管理
前言内存管理是内核设计十分重要的一环,0.12 版本的内存管理相对简单,理解比较容易。但 2.6 版本的内存管理使用了额外的很多数据结构,需要花些时间查资料进行理解。本篇内容主要对 2.6 版本内核的内存管理方法进行记录。内存管理简述内存管理主要指的物理内存的管理,与用户空间中内存分配无关。如何将物理内存高效且有序地分配是内存管理需要考虑的问题。对于一块物理内存地址,为了有序地进行分配,最先想到的方法是将其按一定大小进行划分,如划分为物理页,每个页4kb。那么每次申请地时候,可以按页进行分配。对于每一原创 2022-04-12 20:48:33 · 974 阅读 · 0 评论 -
浅谈OpenHarmony之appspawn应用孵化器组件
前言在往期笔记中,通过小型系统启动日志梳理了 OHOS 的启动流程,并认识到可以从 init 进程拉起的相关服务进程进一步探究 OHOS 世界。本篇笔记则是对 appspawn 进程的初步探究其官方仓为 https://gitee.com/openharmony/startup_appspawn_lite/tree/master源码分析从参考资料可以知道,appspawn 应用孵化器组件其功能如其名,就是用来启动 OHOS app 的。appspawn 的源码其实很少,因此本篇笔记不会很长。具体地,原创 2022-04-10 15:50:43 · 1636 阅读 · 0 评论 -
浅谈Openharmony系统服务框架Samgr
前言在刚接触 Samgr 时笔者根本不知道其设计初衷是啥(水平较菜,刚接触C语言),尽管官方文档对其进行了介绍,但仍有种听君一席话胜读一席话的感觉。为此,笔者花了一天对其进行探究和学习,将笔记梳理并记录于本文。Samgr概念官方说明官方仓 https://gitee.com/openharmony/distributedschedule_samgr_lite 对其解释如下:由于平台资源有限,且硬件平台多样,因此需要屏蔽不同硬件架构和平台资源的不同、以及运行形态的不同,提供统一化的系统服务开发框架。原创 2022-04-09 20:06:29 · 3369 阅读 · 2 评论 -
从启动日志简单梳理Openharmony启动流程
前言出于对开源鸿蒙的好奇,笔者借助几位大佬的博文,根据小型系统的启动日志,对 Openharmony 运作流程进行了梳理。由于个人编译的是最新版本,其源码部分与参考博文中有较多出入,但实现机制是不变的。参考的博文如下:鸿蒙子系统解读-分布式任务调度篇(上)鸿蒙OS开源代码精要解读之—— 系统服务框架子系统(服务启动)OHOS3.0启动流程分析丨init阶段鸿蒙系统的启动流程v2.0编译运行笔者在 qemu 上运行 qemu-system-small 系统,日志输出如下图问题描述由于笔者原创 2022-04-09 19:04:32 · 3588 阅读 · 0 评论 -
Linux内核对比学习系列(4)——进程休眠与唤醒
前言进程休眠与唤醒也是内核管理的重要一部分。本是进程调度相关内容,笔者在此单拎出来进行梳理。同样的,主要对比 linux0.12 与 linux2.6 之间的差异。流程梳理自然地,让一个进程休眠,我们只需要将其状态更改为TASK_INTERRUPTIBLE或者TASK_UNINTERRUPTIBLE,接着再执行调度程序 schedule() 即可。由于调度程序只会调度状态为TASK_RUNNING的进程,因此被修改的进程不会被调度,看上去就像"休眠"了。而唤醒则更简单,只需要将待唤醒进程状态改为 TA原创 2022-04-08 11:02:41 · 1596 阅读 · 0 评论 -
Openharmony鸿蒙内核编译及qemu运行过程问题记录
前言该篇笔记记录鸿蒙内核编译流程,及qemu运行记录。主要根据 https://gitee.com/openharmony/device_qemu 执行。由于整个过程不是很顺利,故做此笔记。(ps:因为笔者的ubuntu环境不纯净,坑较多。纯净的环境照着文档做应该问题不大)采用的策略是,【docker编译】+【ubuntu执行qemu】注意事项纯净的Ubuntu环境,直接根据文档进行配置即可如果文档流程遇到问题,可考虑使用docker编译,具体参考 https://gitee.com/openh原创 2022-04-07 19:16:58 · 3610 阅读 · 1 评论 -
Linux内核浅析之CFS完全公平调度
前言在《Linux内核对比学习系列(3)——进程调度》一文中,笔者对 Linux2.6 版本关于进程调度流程进行了梳理。其中提及,该版本通过调度器类实现调度,提升了内核关于调度算法的拓展性。本文对其中一种调度器类,CFS完全公平调度进行浅析CFS概念试想原先通过时间片控制进程调度会有什么问题场景 1 不考虑优先级A,B,C三个进程,均分60ms,每个进程获得20ms的时间片。60ms能够保证轮执该三个进程场景 2 考虑优先级A,B,C三个进程,根据优先级,获得时间片为100ms,20ms,5m原创 2022-04-06 10:40:22 · 1659 阅读 · 0 评论 -
Linux内核对比学习系列(3)——进程调度
前言linux0.12与linux2.6在进程调度的实现上有很大的不同,在此进行记录Linux 0.12该版本对于进程调度算法的实现十分简单,具体实现看schedule()即可,该函数为调度入口kernel/sched.cvoid schedule(void){ int i,next,c; struct task_struct ** p; // ----------------省略检查相关代码------------------/* this is the scheduler p原创 2022-04-05 16:59:06 · 1931 阅读 · 0 评论 -
Linux内核对比学习系列(2)——进程管理
前言本篇文章主要对比一下linux0.12与linux2.6在进程管理上的区别进程描述符进程描述符指的task_struct结构体,用于存储所有与任务(进程)执行相关的内容,接下来从以下两个方面对比两个版本task_struct的不同通过task_struct如何管理任务(进程)task_struct如何存储Linux 0.12在fork过程的copy_process()的实现中,我们可以知道该版本对 task_struct 的管理十分简单通过get_free_page()向主存申请一原创 2022-04-05 11:44:03 · 756 阅读 · 0 评论 -
Linux内核对比学习系列(1)——中断
前言前段时间根据《linux内核完全注释》一书,从linux0.12入手,逐渐了解了linux最本质的内核实现原理,并将相关笔记记录于《Linux内核学习系列(xx)》。进一步地,最近开始研读《Linux内核设计与实现》,本书以linux2.6.34进行讲解。在学习的过程中,部分实现以及结构发生了较大变动,为了更好地进行对比学习,故考虑将linux2.6.34与linux0.12的异同之处进行记录。另外,不得不吐槽一下内核学习之困难。其难处主要在于难以调试,不好跟踪,接口太多,有时候不知道看哪个实现。不原创 2022-04-04 17:19:52 · 1076 阅读 · 0 评论 -
Linux内核学习系列(7)——execve与需求加载
前言通过本系列前几篇文章的梳理,我们对linux0.12内核功能有了初步地了解。进一步地,我们看看linux如何在前述基础上执行用户自定义程序。其中的重点为execve与需求加载。样例在进入正题之间,我们可以在linux0.12中编译并执行下面一段程序#include <unistd.h>#include <stdlib.h>int main(){ execl("/root/hello","hello",NULL); exit(0);}其中/root/hell原创 2022-04-01 19:34:43 · 844 阅读 · 0 评论 -
Linux内核学习系列(6)——文件系统
前言《Linux内核完全注释》中对文件系统进行了详细地解析,从文件系统组织结构到代码实现都很好理解。本篇对该块内容进行简单梳理,并通过跟踪open系统调用理解文件系统与读写文件的关系文件系统基本概念通俗地说,文件系统用来辅佐内核与设备进行交互,如读写文件,显示字符等操作。就好比作为一个图书馆,需要设计目录,分区来方便用户查询或放置图书。以往块设备打开并写入一个文件这一过程为例,我们看看内核应该怎么完成块设备分块。首先,块设备对于CPU而言也是一块地址空间,如划分内存物理页一样,应该对块设备存储空原创 2022-03-30 16:18:25 · 1637 阅读 · 0 评论 -
Linux内核学习系列(5)——内存管理
前言本章记录一下个人对linux0.12内存管理的理解。主要涉及物理内存页分配与回收,页表复制等具体操作。同样的,笔记仍然由上而下地进行知识点梳理,而不是单纯介绍函数及其作用。内存管理linux内存管理是对什么进行管理内核中的内存管理,主要管理的是物理内存地址空间。而用户所谓的内存管理,指的是对其当前进程线性地址空间的管理为什么要进行内存管理内核中的内存管理,是为了在分页机制基础上,实现虚拟存储用户中的内存管理,是为了合理利用线性地址空间什么时候需要内核内存管理内存管理是贯彻整个原创 2022-03-28 11:18:23 · 2383 阅读 · 0 评论 -
Linux内核学习系列(4)——内存映射(地址转换)
前言在上一篇fork的学习中,涉及到get_free_page函数,其与内存管理有关。在进行内存管理的源码学习过程中,发现关于内存映射,或者说是地址转换理解存在问题,经过梳理后,将笔记记录如下,也作为后续内存管理学习的知识铺垫。地址含义在内核运转过程中,涉及三种地址的转换。其中包括,逻辑地址、线性地址和物理内存地址。其定义如下(ps: 注意了,都是针对保护模式而言)逻辑地址逻辑地址(Logical Address)是指由程序产生的与段相关的偏移地址部分。在 Intel 保护模式下即是指程序执行代原创 2022-03-27 13:03:41 · 1582 阅读 · 0 评论 -
Linux内核学习系列(3)——任务(进程)创建
前言上一篇通过时间片轮转进一步了解了中断机制及其应用,并开始接触任务切换、TSS等相关内容。为了对任务管理(或者说进程管理)有个大体的认识,本章主要探究一下Linux内核中,任务创建相关内容。任务创建学过C语言的都知道,在当前进程中执行fork(),能够创建一个新进程。那么Linux内核中,第一个任务0(进程)又是如何被创建的呢?很自然地可以想到,任务0的创建与fork()创建过程定有不同。对此,本章主要对于这两种方式进行说明。forkfork()的原理其实很简单,主要就是将父进程的内容复制一份到原创 2022-03-26 14:26:18 · 2532 阅读 · 0 评论 -
Linux内核学习系列(2)——时间片轮转与任务切换
前言上一篇文章,通过系统调用引出了中断以及分段机制和保护模式相关内容,并进行了简单说明。本篇将在中断基础上,从时间片轮转和任务切换的角度切入,进一步地探究linux内核。时间片轮转时间片轮转是操作系统实现并发的方式,简单地说,操作系统为每个进程分配一定的时间片,当前进程的时间片用尽,则切换到下一个就绪进程进行执行。实现时间片轮转的方式很容易想到,根据上一篇举例的时钟中断,我们可以设计实现如下设置定时芯片隔N毫秒发出时钟中断设计时钟中断的执行程序完成以下步骤获取当前任务结构将当前任务时间片-原创 2022-03-25 22:31:59 · 2734 阅读 · 0 评论 -
Linux内核学习系列(1)——系统调用
前言由于工作需要,个人从java栈转为了c语言栈,并需要深入学习linux内核。本系列记录一些个人学习笔记。由于Linux内核涉及内容以及知识点很多,一开始接触十分痛苦,通过反复阅读《Linux内核完全注释》一书才逐渐能够看懂源码。在理解的过程中,个人发现自上而下地探索内核,才是最适合自己的学习内核的方式。因此,本系列主要从自上而下的角度,进行笔记记录。整个系列配图及概念描述将直接引用《Linux内核完全注释》中的内容。系统调用本系列第一篇从系统调用开始,因为在学习的过程中,个人发现系统调用能够将各个原创 2022-03-25 15:51:29 · 2543 阅读 · 0 评论 -
分段机制与分页机制
前言根据《Linux内核完全注释》做的笔记目的是理清下述关键词的含义及相互联系,最终彻底理解分段机制与分页机制分段机制段描述符段选择符段寄存器GDT 全局描述符表LDT 局部描述符表分页机制页表TLB 转换查找缓冲区逻辑地址线性地址物理地址概念简述段描述符记录段信息,包括权限、基地址等段选择符理解为索引,从描述符表中定位到唯一的段描述符因此,段寄存器只需要存段选择符,就能根据段寄存器找到段描述符从而获得段基址段基址寄存器存放段基址如 L原创 2022-03-21 15:30:31 · 529 阅读 · 0 评论 -
LiteOs Studio调试LiteOs无法进行
问题描述笔者根据 https://bbs.huaweicloud.com/blogs/222197 进行LiteOs的学习,烧录一切正常。但调试的过程中,程序无法正常运行,输出如下错误而正常的烧录运行结果如下问题解决考虑到是多线程一起调试造成的os死锁,考虑将线程数减为1试了很多方法,如下方法有效打开lunch.json添加如下图红框所示内容此时,调试控制台中执行的命令为完成了对默认 -smp 4这一参数的覆盖此时调试便是单线程,能够顺利执行...原创 2022-01-07 12:42:00 · 805 阅读 · 0 评论