2018年2月13日

Linux内存初始化(二)identity mapping和kernel image mapping

摘要: 一、前言 本文没有什么框架性的东西,就是按照__create_page_tables代码的执行路径走读一遍,记录在初始化阶段,内核是如何创建内核运行需要的页表过程。想要了解一些概述性的、框架性的东西可以参考内存初始化文档。 本文的代码来自ARM64,内核版本是4.4.6,此外,阅读本文最好熟悉ARM 阅读全文

posted @ 2018-02-13 22:30 AlanTu 阅读(2785) 评论(0) 推荐(0)

Linux内存初始化(一)

摘要: 一、前言 一直以来,我都非常着迷于两种电影拍摄手法:一种是慢镜头,将每一个细节全方位的展现给观众。另外一种就是快镜头,多半是反应一个时代的变迁,从非常长的时间段中,截取几个典型的snapshot,合成在十几秒的镜头中,可以让观众很快的了解一个事物的发展脉络。对应到技术层面,慢镜头有点类似情景分析,把 阅读全文

posted @ 2018-02-13 22:29 AlanTu 阅读(5219) 评论(3) 推荐(1)

Fix-Mapped Addresses

摘要: 一、前言 某天,wowo同学突然来了一句:如果要在start_kernel中点LED,ioremap在什么时间点才能调用呢?我想他应该是想通过点LED灯来调试start_kernel之后的初始化的代码(例如DTB解析部分的代码)。那天,我们两个花了二十分钟的时间,讨论相关的问题,我觉得很有意思,因此 阅读全文

posted @ 2018-02-13 22:27 AlanTu 阅读(1767) 评论(0) 推荐(0)

Linux内存模型

摘要: 一、前言 在linux内核中支持3中内存模型,分别是flat memory model,Discontiguous memory model和sparse memory model。所谓memory model,其实就是从cpu的角度看,其物理内存的分布情况,在linux kernel中,使用什么的 阅读全文

posted @ 2018-02-13 22:26 AlanTu 阅读(2337) 评论(0) 推荐(2)

文件缓存回写简述

摘要: 1 文件缓存回写的时机 (1)周期性回写,周期为dirty_writeback_interval,默认5s; (2)块设备首次出现脏数据; (3)脏页达到限额,包括dirty_bytes、dirty_background_bytes、dirty_ratio、dirty_background_rati 阅读全文

posted @ 2018-02-13 22:25 AlanTu 阅读(827) 评论(0) 推荐(0)

Linux内核配置解析 - Boot options

摘要: 1. 前言 本文将介绍ARM64架构下,Linux kernel和启动有关的配置项。 注1:本系列文章使用的Linux kernel版本是“X Project”所用的“Linux 4.6-rc5”,具体可参考“https://github.com/wowotechX/linux.git”。 2. K 阅读全文

posted @ 2018-02-13 22:24 AlanTu 阅读(3653) 评论(0) 推荐(0)

Linux内核配置解析 - 概述(基于ARM64架构)

摘要: 1. 前言 对刚接触Linux kernel的同学来说,遇到的第一个问题就是:我该从哪里入手?、 话说Linux kernel的打开方式是多种多样的:从简单的设备驱动入手;从源代码的目录结构入手;从kernel的启动过程入手;从大的功能模块入手;等等。不管怎样,每条都是正途(条条大路通罗马嘛)。 而 阅读全文

posted @ 2018-02-13 22:17 AlanTu 阅读(5775) 评论(0) 推荐(0)

Linux内核同步 - sleepable RCU的实现

摘要: 一、前言 由于曾经在Linux2.6.23上工作了多年,我对这个版本还是非常有感情的(抛开感情因素,本来应该选择longterm的2.6.32版本来分析的,^_^),本文主要就是描述Linux2.6.23内核版本中对RCU有哪些修正。所谓修正主要包括两个部分,一部分是bug fixed,一部分是新增 阅读全文

posted @ 2018-02-13 22:15 AlanTu 阅读(1007) 评论(0) 推荐(0)

Linux进程冻结技术

摘要: 1 什么是进程冻结 进程冻结技术(freezing of tasks)是指在系统hibernate或者suspend的时候,将用户进程和部分内核线程置于“可控”的暂停状态。 2 为什么需要冻结技术 假设没有冻结技术,进程可以在任意可调度的点暂停,而且直到cpu_down才会暂停并迁移。这会给系统带来 阅读全文

posted @ 2018-02-13 22:13 AlanTu 阅读(2244) 评论(0) 推荐(0)

slub分配器

摘要: Linux的物理内存管理采用了以页为单位的buddy system(伙伴系统),但是很多情况下,内核仅仅需要一个较小的对象空间,而且这些小块的空间对于不同对象又是变化的、不可预测的,所以需要一种类似用户空间堆内存的管理机制(malloc/free)。然而内核对对象的管理又有一定的特殊性,有些对象的访 阅读全文

posted @ 2018-02-13 22:13 AlanTu 阅读(694) 评论(0) 推荐(0)

Linux内核同步 - RCU synchronize原理分析

摘要: RCU(Read-Copy Update)是Linux内核比较成熟的新型读写锁,具有较高的读写并发性能,常常用在需要互斥的性能关键路径。在kernel中,rcu有tiny rcu和tree rcu两种实现,tiny rcu更加简洁,通常用在小型嵌入式系统中,tree rcu则被广泛使用在了serve 阅读全文

posted @ 2018-02-13 22:12 AlanTu 阅读(3221) 评论(0) 推荐(0)

linux内存回收机制

摘要: 无论计算机上有多少内存都是不够的,因而linux kernel需要回收一些很少使用的内存页面来保证系统持续有内存使用。页面回收的方式有页回写、页交换和页丢弃三种方式:如果一个很少使用的页的后备存储器是一个块设备(例如文件映射),则可以将内存直接同步到块设备,腾出的页面可以被重用;如果页面没有后备存储 阅读全文

posted @ 2018-02-13 22:10 AlanTu 阅读(4806) 评论(0) 推荐(0)

linux内存碎片防治技术

摘要: Linux kernel组织管理物理内存的方式是buddy system(伙伴系统),而物理内存碎片正式buddy system的弱点之一,为了预防以及解决碎片问题,kernel采取了一些实用技术,这里将对这些技术进行总结归纳。 1 低内存时整合碎片 从buddy申请内存页,如果找不到合适的页,则会 阅读全文

posted @ 2018-02-13 22:09 AlanTu 阅读(2257) 评论(1) 推荐(0)

Linux vm运行参数 - OOM相关的参数

摘要: 一、前言 本文是描述Linux virtual memory运行参数的第二篇,主要是讲OOM相关的参数的。为了理解OOM参数,第二章简单的描述什么是OOM。如果这个名词对你毫无压力,你可以直接进入第三章,这一章是描述具体的参数的,除了描述具体的参数,我们引用了一些具体的内核代码,本文的代码来自4.0 阅读全文

posted @ 2018-02-13 22:07 AlanTu 阅读(752) 评论(0) 推荐(0)

Linux vm运行参数 - overcommit相关的参数

摘要: 一、前言 终于可以进入Linux kernel内存管理的世界了,但是从哪里入手是一个问题,当面对一个复杂系统的时候,有时候不知道怎么开始。遵守“一切以人为本”的原则,我最终选择先从从userspace的视角来看内核的内存管理。最开始的系列文章选择了vm运行参数这个主题。执行ls /proc/sys/ 阅读全文

posted @ 2018-02-13 22:06 AlanTu 阅读(832) 评论(0) 推荐(0)

Linux内核同步 - classic RCU的实现

摘要: 一、前言 无论你愿意或者不愿意,linux kernel的版本总是不断的向前推进,做为一个热衷于专研内核的工程师,最大的痛苦莫过于此:当你熟悉了一个版本的内核之后,内核已经推进到一个新的版本,你曾经熟悉的内容可能会变得陌生(这里主要说的是该模块的内部实现,实际上,内核中的每一个子系统都是会尽量保持接 阅读全文

posted @ 2018-02-13 22:05 AlanTu 阅读(487) 评论(0) 推荐(0)

Linux内核同步 - RCU基础

摘要: 一、前言 关于RCU的文档包括两份,一份讲基本的原理(也就是本文了),一份讲linux kernel中的实现。第二章描述了为何有RCU这种同步机制,特别是在cpu core数目不断递增的今天,一个性能更好的同步机制是如何解决问题的,当然,再好的工具都有其适用场景,本章也给出了RCU的一些应用限制。第 阅读全文

posted @ 2018-02-13 22:04 AlanTu 阅读(400) 评论(0) 推荐(0)

Linux内核同步 - Seqlock

摘要: 一、前言 普通的spin lock对待reader和writer是一视同仁,RW spin lock给reader赋予了更高的优先级,那么有没有让writer优先的锁的机制呢?答案就是seqlock。本文主要描述linux kernel 4.0中的seqlock的机制,首先是seqlock的工作原理 阅读全文

posted @ 2018-02-13 22:01 AlanTu 阅读(484) 评论(0) 推荐(0)

Linux内核同步 - Read/Write spin lock

摘要: 一、为何会有rw spin lock? 在有了强大的spin lock之后,为何还会有rw spin lock呢?无他,仅仅是为了增加内核的并发,从而增加性能而已。spin lock严格的限制只有一个thread可以进入临界区,但是实际中,有些对共享资源的访问可以严格区分读和写的,这时候,其实多个读 阅读全文

posted @ 2018-02-13 22:00 AlanTu 阅读(409) 评论(0) 推荐(0)

Linux内核同步 - spin_lock

摘要: 一、前言 在linux kernel的实现中,经常会遇到这样的场景:共享数据被中断上下文和进程上下文访问,该如何保护呢?如果只有进程上下文的访问,那么可以考虑使用semaphore或者mutex的锁机制,但是现在中断上下文也参和进来,那些可以导致睡眠的lock就不能使用了,这时候,可以考虑使用spi 阅读全文

posted @ 2018-02-13 21:56 AlanTu 阅读(9162) 评论(0) 推荐(1)

Linux内核同步 - memory barrier

摘要: 一、前言 我记得以前上学的时候大家经常说的一个词汇叫做所见即所得,有些编程工具是所见即所得的,给程序员带来极大的方便。对于一个c程序员,我们的编写的代码能所见即所得吗?我们看到的c程序的逻辑是否就是最后CPU运行的结果呢?很遗憾,不是,我们的“所见”和最后的执行结果隔着: 1、编译器 2、CPU取指 阅读全文

posted @ 2018-02-13 21:54 AlanTu 阅读(474) 评论(0) 推荐(0)

Linux内核同步 - Per-CPU变量

摘要: 一、源由:为何引入Per-CPU变量? 1、lock bus带来的性能问题 在ARM平台上,ARMv6之前,SWP和SWPB指令被用来支持对shared memory的访问: SWP <Rt>, <Rt2>, [<Rn>] Rn中保存了SWP指令要操作的内存地址,通过该指令可以将Rn指定的内存数据加 阅读全文

posted @ 2018-02-13 21:53 AlanTu 阅读(971) 评论(0) 推荐(0)

Linux内核同步 - 原子操作

摘要: 一、源由 我们的程序逻辑经常遇到这样的操作序列: 1、读一个位于memory中的变量的值到寄存器中 2、修改该变量的值(也就是修改寄存器中的值) 3、将寄存器中的数值写回memory中的变量值 如果这个操作序列是串行化的操作(在一个thread中串行执行),那么一切OK,然而,世界总是不能如你所愿。 阅读全文

posted @ 2018-02-13 21:52 AlanTu 阅读(1794) 评论(0) 推荐(0)

Linux中断 - softirq

摘要: 一、前言 对于中断处理而言,linux将其分成了两个部分,一个叫做中断handler(top half),是全程关闭中断的,另外一部分是deferable task(bottom half),属于不那么紧急需要处理的事情。在执行bottom half的时候,是开中断的。有多种bottom half的 阅读全文

posted @ 2018-02-13 21:50 AlanTu 阅读(1765) 评论(0) 推荐(0)

Linux中断 - tasklet

摘要: 一、前言 对于中断处理而言,linux将其分成了两个部分,一个叫做中断handler(top half),属于不那么紧急需要处理的事情被推迟执行,我们称之deferable task,或者叫做bottom half,。具体如何推迟执行分成下面几种情况: 1、推迟到top half执行完毕 2、推迟到 阅读全文

posted @ 2018-02-13 21:50 AlanTu 阅读(355) 评论(0) 推荐(0)

Linux中断 - GIC代码分析

摘要: 一、前言 GIC(Generic Interrupt Controller)是ARM公司提供的一个通用的中断控制器,其architecture specification目前有四个版本,V1~V4(V2最多支持8个ARM core,V3/V4支持更多的ARM core,主要用于ARM64服务器系统结 阅读全文

posted @ 2018-02-13 21:49 AlanTu 阅读(3270) 评论(0) 推荐(0)

Linux中断 - ARM中断处理过程

摘要: 一、前言 本文主要以ARM体系结构下的中断处理为例,讲述整个中断处理过程中的硬件行为和软件动作。具体整个处理过程分成三个步骤来描述: 1、第二章描述了中断处理的准备过程 2、第三章描述了当发生中的时候,ARM硬件的行为 3、第四章描述了ARM的中断进入过程 4、第五章描述了ARM的中断退出过程 本文 阅读全文

posted @ 2018-02-13 21:48 AlanTu 阅读(4515) 评论(0) 推荐(1)

Linux中断 - High level irq event handler

摘要: 一、前言 当外设触发一次中断后,一个大概的处理过程是: 1、具体CPU architecture相关的模块会进行现场保护,然后调用machine driver对应的中断处理handler 2、machine driver对应的中断处理handler中会根据硬件的信息获取HW interrupt ID 阅读全文

posted @ 2018-02-13 21:47 AlanTu 阅读(1232) 评论(0) 推荐(0)

Linux中断 - 驱动申请中断API

摘要: 一、前言 本文主要的议题是作为一个普通的驱动工程师,在撰写自己负责的驱动的时候,如何向Linux Kernel中的中断子系统注册中断处理函数?为了理解注册中断的接口,必须了解一些中断线程化(threaded interrupt handler)的基础知识,这些在第二章描述。第三章主要描述了驱动申请 阅读全文

posted @ 2018-02-13 21:47 AlanTu 阅读(4026) 评论(0) 推荐(0)

Linux中断 - IRQ number和中断描述符

摘要: 一、前言 本文主要围绕IRQ number和中断描述符(interrupt descriptor)这两个概念描述通用中断处理过程。第二章主要描述基本概念,包括什么是IRQ number,什么是中断描述符等。第三章描述中断描述符数据结构的各个成员。第四章描述了初始化中断描述符相关的接口API。第五章描 阅读全文

posted @ 2018-02-13 21:46 AlanTu 阅读(3932) 评论(1) 推荐(0)

Linux中断 - IRQ Domain介绍

摘要: 一、概述 在linux kernel中,我们使用下面两个ID来标识一个来自外设的中断: 1、IRQ number。CPU需要为每一个外设中断编号,我们称之IRQ Number。这个IRQ number是一个虚拟的interrupt ID,和硬件无关,仅仅是被CPU用来标识一个外设中断。 2、HW i 阅读全文

posted @ 2018-02-13 21:45 AlanTu 阅读(2913) 评论(0) 推荐(0)

Linux中断 - 综述

摘要: 一、前言 一个合格的linux驱动工程师需要对kernel中的中断子系统有深刻的理解,只有这样,在写具体driver的时候才能: 1、正确的使用linux kernel提供的的API,例如最著名的request_threaded_irq(request_irq)接口 2、正确使用同步机制保护驱动代码 阅读全文

posted @ 2018-02-13 21:44 AlanTu 阅读(646) 评论(0) 推荐(0)

process credentials(三)

摘要: 主要内容包括: 1、进程描述符中Realtime Mutex相关数据结构的初始化 2、子进程如何复制父进程的credentials 3、per-task delay accounting的处理 4、子进程如何复制父进程的flag 七、初始化Realtime Mutex相关的成员 static voi 阅读全文

posted @ 2018-02-13 21:43 AlanTu 阅读(530) 评论(0) 推荐(0)

process credentials(二)

摘要: 一、前言 为什么要写一个关于进程如何创建的文档?其实用do_fork作为关键字进行索引,你会发现网上的相关文档数以万计。作为一个内核工程师,对进程以及进程相关的内容当然是非常感兴趣,但是网上的资料并不能令我非常满意(也许是我没有检索到好的文章),一个简单的例子如下: static void copy 阅读全文

posted @ 2018-02-13 21:42 AlanTu 阅读(386) 评论(0) 推荐(0)

process credentials(一)

摘要: 一、介绍 当linux系统中的一个进程运行起来的时候,总是要访问系统的资源,访问文件或者向其他的进程发送信号。系统是否允许其进行这些操作?系统是根据什么来判断该进程的权限?这些问题是和进程信任状(process credentials)相关。 process credentials包括一系列的ID, 阅读全文

posted @ 2018-02-13 21:41 AlanTu 阅读(776) 评论(0) 推荐(0)

实模式与保护模式

摘要: 1. 实模式,又叫实地址模式,CPU完全按照8086的实际寻址方法访问从00000h--FFFFFh(1MB大小)的地址范围的内存,在这种模式下,CPU只能做单任务运行;寻址公式为:物理地址=左移4位的段地址+偏移地址,即:物理地址是由16位的段地址和16位的段内偏移地址组成的。 2.保护模式,又叫 阅读全文

posted @ 2018-02-13 21:20 AlanTu 阅读(1466) 评论(0) 推荐(0)

Linux高速缓冲区原理

摘要: 文件系统-高速缓冲区: 首先我们为什么需要高速缓冲区而不是直接访问块设备中的数据。这是因为,IO设备和内存之间的读写速度不匹配而且有一点数据需要写入或者读出磁盘就访问磁盘,磁盘很快就会损坏,而高速缓冲区就起了一个中间过程的作用,把数据存在高速缓冲区中,需要读取磁盘上的数据时,尝试匹配高速缓冲区中的数 阅读全文

posted @ 2018-02-13 21:18 AlanTu 阅读(4053) 评论(0) 推荐(0)

Linux引导启动程序 - boot

摘要: 主要描述 boot/目录中的三个汇编代码文件,见列表 3-1 所示。正如在前一章中提到的,这三个 文件虽然都是汇编程序,但却使用了两种语法格式。bootsect.s 和 setup.s 采用近似于 Intel 的汇编语言语法,需要使用 Intel 8086 汇编编译器和连接器 as86 和ld86, 阅读全文

posted @ 2018-02-13 21:12 AlanTu 阅读(11599) 评论(0) 推荐(0)

Linux内核系统体系概述

摘要: Linux 内核主要由 5 个模块构成,它们分别是: 进程调度模块 用来负责控制进程对 CPU 资源的使用。所采取的调度策略是各进程能够公平合理地访问 CPU,同时保证内核能及时地执行硬件操作。 内存管理模块 用于确保所有进程能够安全地共享机器主内存区,同时,内存管理模块还支持虚拟内存管理方式,使得 阅读全文

posted @ 2018-02-13 20:52 AlanTu 阅读(1259) 评论(0) 推荐(0)

ext2文件系统 - mke2fs

摘要: 上一遍博文的重点其实将ext2整体的组织框架,我们知道了ext2文件系统由块组组成,每个块组里面的组织形式。我们甚至直接把超级块和组描述符里面的内容,用十六进制形式展现了出来。这篇博文主要讲述如何mke2fs生成合适需要的ext2 文件系统,基本就是参数选择的问题。 mke2fs 常用的几个参数有: 阅读全文

posted @ 2018-02-13 20:32 AlanTu 阅读(443) 评论(0) 推荐(0)

导航