Linux调度器:用户空间接口
作者:linuxer 发布于:2017-3-10 18:50 分类:进程管理
Linux调度器神秘而充满诱惑,每个Linux工程师都想深入其内部一探究竟。不过中国有一句古话叫做“相由心生”,一个模块精巧的内部逻辑(也就是所谓的“心”)其外延就是简洁而优雅的接口(我称之为“相”)。通过外部接口的定义,其实我们也可以收获百分之六七十的该模块的内部信息。因此,本文主要描述Linux调度器开放给用户空间的接口。Linux MMC framework(2)_host controller driver
作者:wowo 发布于:2017-3-8 21:33 分类:通信类协议
本文是Linux MMC framework的第二篇,将从驱动工程师的角度,介绍MMC host controller driver有关的知识,学习并掌握如何在MMC framework的框架下,编写MMC控制器的驱动程序。同时,通过本篇文章,我们会进一步的理解MMC、SD、SDIO等有关的基础知识。标签: Linux Kernel 内核 driver mmc host
Linux系统如何标识进程?
作者:linuxer 发布于:2017-2-23 19:10 分类:进程管理
其实两年前,本站已经有了一篇关于进程标识的文档,不过非常的简陋,而且代码是来自2.6内核。随着linux container、pid namespace等概念的引入,进程标识方面已经有了天翻地覆的变化,因此我们需要对这部分的内容进行重新整理。
本文主要分成四个部分来描述进程标识这个主题:在初步介绍了一些入门的各种IDs基础知识后,在第三章我们描述了pid、pid number、pid namespace等基础的概念。第四章重点描述了内核如何将这些基本概念抽象成具体的数据结构,最后我们简单分析了内核关于进程标识的源代码(代码来自linux4.4.6版本)。
标签: 进程ID
ARM Linux上的系统调用代码分析
作者:linuxer 发布于:2017-2-20 18:54 分类:进程管理
当用户空间的程序调用swi指令发起内核服务请求的时候,实际上程序其实是完成了一次“穿越”,该进程从用户态穿越到了内核态。这个过程有点象周末你在家里看片,突然有些内急,随手按下了pause按键,电影里面的世界嘎然而止了。程序世界亦然,一个swi后,用户空间的代码执行暂停了、stack(用户栈)上的数据,正文段、静态数据区、heap去的数据……一切都停下来了,程序的执行突然就转入另外一个世界,使用的栈变成了内核栈、正在执行的正文段程序变成vector_swi开始的binary code、与之匹配数据区也变化了……
一切是怎么发生的呢?CPU只有一套而已,这里硬件做了哪些动作?软件又搞了什么鬼?穿越到另外的世界当然有趣,但是如何找到回来的路?这一切疑问希望能在这样的一篇文档中讲述清楚。
本文的代码来自4.4.6内核,用ARM处理器为例子描述。
进程切换分析(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硬件行为加深大家对原理的理解。进程切换分析(1):基本框架
作者:linuxer 发布于:2017-2-4 18:43 分类:进程管理
本文主要是以context_switch为起点,分析了整个进程切换过程中的基本操作和基本的代码框架,很多细节,例如tlb的操作,cache的操作,锁的操作等等会在其他专门的文档中描述。进程切换包括体系结构相关的代码和系统结构无关的代码。第二、三、四分别描述了context_switch的代码脉络,后面的章节是以ARM64为例子,讲述了具体进程地址空间的切换过程和硬件上下文的切换过程。标签: 进程切换 context_switch
为什么会有文件系统(一)
作者:驴肉火烧 发布于:2017-1-17 20:56 分类:文件系统
Linux发展到现今,在fs目录下我们可以看到形形色色的文件系统,眼花缭乱的同时首先需要回答的问题是,为什么会有文件系统这个东西呢?我想如果能搞清楚这个问题,会帮助大家更好的理解文件系统,那么我就尝试着来模拟一次文件系统的演进过程,于是,我们来到了那一天,那天之前,人们还没有文件系统的概念。
友情提示 : 下面将在荒诞的场景下演进人类合理的诉求
神说,要有光,于是,光照大地
神说,要有风,于是,风动四方
神说,人类要记住神,于是,有了传说
神说,怕你们忘了,得记下来,于是,有了文字,信息被存储在石板上,竹片上,纸张上,硬盘里,flash中
当信息能存在硬盘中的时候,人类如获至宝,如此大的存储量,我们能装下全世界图书馆的馆藏,于是,我们想先放一套盗墓笔记进去。
好嘞,于是,我一个字一个字的将精彩的内容顺序存储在硬盘中,终于,全套的盗墓笔记被存储在硬盘中了,还没来得及高兴,就傻眼了,我不想看秦岭神树,怎么办,这并难不倒我,略加思索,就能想到解决方案,因为是顺序存储的,从开始的地方一直读下去,当恰好跳过秦岭神树章节内容的时候,就做一个标记,记录已经跳过的字节数,下次再看的时候,就直接读到硬盘对应的位置即可,经过一番努力,我找到了并把这个字节数写在了一张纸条上,以便下次可以直接读取,避免一次次的遍历。
后来,我开始有点不耐烦了,因为这张纸条里面的内容越来越多,比如最后一章的位置,终极第一次出现的位置等等,有时我甚至记不住我需要寻找的标记是否在纸条中了,终于有一天,这张纸条丢了,我只能呵呵并且从心底认为,仅仅是顺序存储无法满足我的需求,我需要管理这些内容。
我想,最起码我需要能把全套的盗墓笔记分为8本书吧,只要根据书名,比如邛楼石影,我就立刻能找到对应的内容,我立刻想到了最简单的解决方案,仍然使用顺序存储,只不过在内容录入的时候,给每本书分100MB的存储空间,这样我如果想看第7本,那么直接从600MB偏移开始即可,那么一套盗墓笔记只需要800MB就可以存储,但是,我很快又有了一个更优的方案,在每本书的100MB可用空间内,再进行细分,给每章节进行划分,假设每本书有50章,那么每章节就是2MB空间,这样每章节按照2MB对齐,我要找第6本书的第30章节,就是(500 + 29 * 2)MB 偏移,我甚至都有点洋洋自得了,简单的设计一下就可以再也不用依赖那张小纸条(已遗失)了。
但是,很快我又遇到了新的挑战,因为这块硬盘不是我的,开始说好的800MB没有了,我被要求只能使用8MB来存储全套的盗墓笔记,原先的设计继续使用,每章只能分到20KB,这样有些内容多的章节会越界,而有些内容少的章节又不够饱满,那些没有被利用起来的空间此时显得的是那么的珍贵,于是我开始了小心翼翼字斟句酌的重新设计。
看起来,顺序存储是最节约空间的,那么只有将小纸条(已遗失)的内容也存储在硬盘中了。于是,喝下一罐可乐后,我发觉将章节抽象成一个章节类是一个不错的注意,每个章节是该类的一个对象实例,类成员包括章节名称,章节起始位置,章节字数,每个对象都64字节对齐,这样400章的索引信息只需要25KB即可完成存储,我大大方方的将全部的章节类对象存储在8MB的前32KB区域,后面剩余的全部顺序存储内容,就这样,随着需求的不断增加,我的设计也渐渐开始有文件系统的影子了,尽管我并不知道,但是一切就这样发生了,是那么的自然。
原创文章,转发请注明出处。蜗窝科技,www.wowotech.net
标签: 文件系统
Linux MMC framework(1)_软件架构
作者:wowo 发布于:2017-1-10 22:24 分类:通信类协议
由[1]中MMC、SD、SDIO的介绍可知,这三种技术都是起源于MMC技术,有很多共性,因此Linux kernel统一使用MMC framework管理所有和这三种技术有关的设备。
本文将基于[1]对MMC技术的介绍,学习Linux kernel MMC framework的软件架构。
标签: Linux Kernel 内核 架构 Architecture framework mmc
Linux serial framework(1)_概述
作者:wowo 发布于:2016-12-12 22:04 分类:通信类协议
串口设备(serial or uart,后面不再区分)是TTY设备的一种,Linux kernel为了方便串口驱动的开发,在TTY framework的基础上,封装了一层串口框架(serial framework)。该框架尽可能的屏蔽了TTY有关的技术细节(比较难懂),驱动工程师在编写串口驱动的时候,只需要把精力放在串口以及串口控制器本身即可。
本文将通过对serial framework的简单分析,理解上面的概念,并掌握基于该框架编写串口驱动的方法和步骤。
标签: Linux driver framework serial 框架 串口
内存初始化代码分析(三):创建系统内存地址映射
作者:linuxer 发布于:2016-11-24 12:08 分类:内存管理
经过内存初始化代码分析(一)和内存初始化代码分析(二)的过渡,我们终于来到了内存初始化的核心部分:paging_init。当然本文不能全部解析完该函数(那需要的篇幅太长了),我们只关注创建系统内存地址映射这部分代码实现,也就是解析paging_init中的map_mem函数。
同样的,我们选择的是4.4.6的内核代码,体系结构相关的代码来自ARM64。
标签: create_mapping
功能
最新评论
- 小明不明白
请问一个问题: 如何控制win10的usb接口的供电?例如... - 安庆
@markened-frank:是的,但是它前面是tlbi啊 - bngvcztboj
劲舞团问道密传一条龙www.43vb.com13258761... - small
wowo,你好 我遇见有一个唤醒锁一直无法关闭,我想强制关... - 狗子
@王:老铁 休息就别卷了 受不了 - markened-frank
我记得DSB的语义是等待本核的前面的操作完成,并不能等待其他...
文章分类
随机文章
文章存档
- 2024年2月(1)
- 2023年5月(1)
- 2022年10月(1)
- 2022年8月(1)
- 2022年6月(1)
- 2022年5月(1)
- 2022年4月(2)
- 2022年2月(2)
- 2021年12月(1)
- 2021年11月(5)
- 2021年7月(1)
- 2021年6月(1)
- 2021年5月(3)
- 2020年3月(3)
- 2020年2月(2)
- 2020年1月(3)
- 2019年12月(3)
- 2019年5月(4)
- 2019年3月(1)
- 2019年1月(3)
- 2018年12月(2)
- 2018年11月(1)
- 2018年10月(2)
- 2018年8月(1)
- 2018年6月(1)
- 2018年5月(1)
- 2018年4月(7)
- 2018年2月(4)
- 2018年1月(5)
- 2017年12月(2)
- 2017年11月(2)
- 2017年10月(1)
- 2017年9月(5)
- 2017年8月(4)
- 2017年7月(4)
- 2017年6月(3)
- 2017年5月(3)
- 2017年4月(1)
- 2017年3月(8)
- 2017年2月(6)
- 2017年1月(5)
- 2016年12月(6)
- 2016年11月(11)
- 2016年10月(9)
- 2016年9月(6)
- 2016年8月(9)
- 2016年7月(5)
- 2016年6月(8)
- 2016年5月(8)
- 2016年4月(7)
- 2016年3月(5)
- 2016年2月(5)
- 2016年1月(6)
- 2015年12月(6)
- 2015年11月(9)
- 2015年10月(9)
- 2015年9月(4)
- 2015年8月(3)
- 2015年7月(7)
- 2015年6月(3)
- 2015年5月(6)
- 2015年4月(9)
- 2015年3月(9)
- 2015年2月(6)
- 2015年1月(6)
- 2014年12月(17)
- 2014年11月(8)
- 2014年10月(9)
- 2014年9月(7)
- 2014年8月(12)
- 2014年7月(6)
- 2014年6月(6)
- 2014年5月(9)
- 2014年4月(9)
- 2014年3月(7)
- 2014年2月(3)
- 2014年1月(4)