中断上下文中调度会怎样?

作者:linuxer 发布于:2017-3-20 19:08 分类:进程管理

每一个Linux驱动工程师都知道这样一个准则:在中断上下文中不能睡眠。但是为什么interrupt context中不能调用导致睡眠的kernel API呢?如果驱动这么做会导致什么样的后果呢?这就是本文探讨的主题。为了理解这个主题,我们设计了一些非常简单的驱动程序和用户空间的程序,实际做实验观察实验效果,最后给出了结果和分析。

阅读全文>>

标签: 中断 调度

评论(10) 浏览(250)

Linux调度器:进程优先级

作者:linuxer 发布于:2017-3-14 18:46 分类:进程管理

本文主要描述的是进程优先级这个概念。从用户空间来看,进程优先级就是nice value和scheduling priority,对应到内核,有静态优先级、realtime优先级、归一化优先级和动态优先级等概念,我们希望能在第二章将这些相关的概念描述清楚。为了加深理解,在第三章我们给出了几个典型数据流过程的分析。

阅读全文>>

标签: 进程优先级

评论(0) 浏览(333)

Linux调度器:用户空间接口

作者:linuxer 发布于:2017-3-10 18:50 分类:进程管理

Linux调度器神秘而充满诱惑,每个Linux工程师都想深入其内部一探究竟。不过中国有一句古话叫做“相由心生”,一个模块精巧的内部逻辑(也就是所谓的“心”)其外延就是简洁而优雅的接口(我称之为“相”)。通过外部接口的定义,其实我们也可以收获百分之六七十的该模块的内部信息。因此,本文主要描述Linux调度器开放给用户空间的接口。

阅读全文>>

标签: 调度器 进程管理

评论(0) 浏览(333)

Debian8 内核升级实验

作者:linuxer 发布于:2017-2-27 19:28 分类:Linux应用技巧

一直以来,我都是在使用一台ThinkPad T450 + Debian 8的机器来研究内核,Debian 8上缺省的内核版本是3.16,为什么不把内核升级到4.4.6版本上呢?反正现在蜗窝主要分析的也是这个版本的内核?

本文主要记录了整个升级过程,方便后续重复使用,哈哈,也许哪天要升级到8.8版本的内核呢,到时候可以把这份文档调出来轻松升级。

阅读全文>>

标签: 内核升级

评论(0) 浏览(485)

Linux系统如何标识进程?

作者:linuxer 发布于:2017-2-23 19:10 分类:进程管理

其实两年前,本站已经有了一篇关于进程标识的文档,不过非常的简陋,而且代码是来自2.6内核。随着linux container、pid namespace等概念的引入,进程标识方面已经有了天翻地覆的变化,因此我们需要对这部分的内容进行重新整理。

本文主要分成四个部分来描述进程标识这个主题:在初步介绍了一些入门的各种IDs基础知识后,在第三章我们描述了pid、pid number、pid namespace等基础的概念。第四章重点描述了内核如何将这些基本概念抽象成具体的数据结构,最后我们简单分析了内核关于进程标识的源代码(代码来自linux4.4.6版本)。

阅读全文>>

标签: 进程ID

评论(2) 浏览(549)

ARM Linux上的系统调用代码分析

作者:linuxer 发布于:2017-2-20 18:54 分类:进程管理

当用户空间的程序调用swi指令发起内核服务请求的时候,实际上程序其实是完成了一次“穿越”,该进程从用户态穿越到了内核态。这个过程有点象周末你在家里看片,突然有些内急,随手按下了pause按键,电影里面的世界嘎然而止了。程序世界亦然,一个swi后,用户空间的代码执行暂停了、stack(用户栈)上的数据,正文段、静态数据区、heap去的数据……一切都停下来了,程序的执行突然就转入另外一个世界,使用的栈变成了内核栈、正在执行的正文段程序变成vector_swi开始的binary code、与之匹配数据区也变化了……

一切是怎么发生的呢?CPU只有一套而已,这里硬件做了哪些动作?软件又搞了什么鬼?穿越到另外的世界当然有趣,但是如何找到回来的路?这一切疑问希望能在这样的一篇文档中讲述清楚。

本文的代码来自4.4.6内核,用ARM处理器为例子描述。

阅读全文>>

标签: ARM 系统调用

评论(0) 浏览(658)

进程切换分析(2):TLB处理

作者:linuxer 发布于:2017-2-9 12:05 分类:进程管理

进程切换是一个复杂的过程,本文不准备详细描述整个进程切换的方方面面,而是关注进程切换中一个小小的知识点:TLB的处理。为了能够讲清楚这个问题,我们在第二章描述在单CPU场景下一些和TLB相关的细节,第三章推进到多核场景,至此,理论部分结束。在第二章和第三章,我们从基本的逻辑角度出发,并不拘泥于特定的CPU和特定的OS,这里需要大家对基本的TLB的组织原理有所了解,具体可以参考本站的《TLB操作》一文。再好的逻辑也需要体现在HW block和SW block的设计中,在第四章,我们给出了linux4.4.6内核在ARM64平台上的TLB代码处理细节(在描述tlb lazy mode的时候引入部分x86架构的代码),希望能通过具体的代码和实际的CPU硬件行为加深大家对原理的理解。

阅读全文>>

标签: TLB 进程切换

评论(1) 浏览(851)

进程切换分析(1):基本框架

作者:linuxer 发布于:2017-2-4 18:43 分类:进程管理

本文主要是以context_switch为起点,分析了整个进程切换过程中的基本操作和基本的代码框架,很多细节,例如tlb的操作,cache的操作,锁的操作等等会在其他专门的文档中描述。进程切换包括体系结构相关的代码和系统结构无关的代码。第二、三、四分别描述了context_switch的代码脉络,后面的章节是以ARM64为例子,讲述了具体进程地址空间的切换过程和硬件上下文的切换过程。

阅读全文>>

标签: 进程切换 context_switch

评论(11) 浏览(982)

内存初始化代码分析(三):创建系统内存地址映射

作者:linuxer 发布于:2016-11-24 12:08 分类:内存管理

经过内存初始化代码分析(一)内存初始化代码分析(二)的过渡,我们终于来到了内存初始化的核心部分:paging_init。当然本文不能全部解析完该函数(那需要的篇幅太长了),我们只关注创建系统内存地址映射这部分代码实现,也就是解析paging_init中的map_mem函数。

同样的,我们选择的是4.4.6的内核代码,体系结构相关的代码来自ARM64。

阅读全文>>

标签: create_mapping

评论(4) 浏览(958)

内存初始化代码分析(二):内存布局

作者:linuxer 发布于:2016-11-18 18:25 分类:内存管理

同样的,本文是内存初始化文章的一份补充文档,希望能够通过这样的一份文档,细致的展示在初始化阶段,Linux 4.4.6内核如何从device tree中提取信息,完成内存布局的任务。具体的cpu体系结构选择的是ARM64。

阅读全文>>

标签: Memory 内存布局 layout

评论(6) 浏览(1219)

Copyright @ 2013-2015 蜗窝科技 All rights reserved. Powered by emlog