RCU synchronize原理分析

作者:itrocker 发布于:2015-10-27 19:10 分类:内核同步机制

    RCURead-Copy Update)是Linux内核比较成熟的新型读写锁,具有较高的读写并发性能,常常用在需要互斥的性能关键路径。在kernel中,rcutiny rcutree rcu两种实现,tiny rcu更加简洁,通常用在小型嵌入式系统中,tree rcu则被广泛使用在了server, desktop以及android系统中。本文将以tree rcu为分析对象。

阅读全文>>

标签: RCU

评论(4) 浏览(27527)

作業系統之前的程式 for rpi2 (1) - mmu (0) : 位址轉換

作者:descent 发布于:2015-10-27 9:00 分类:Linux内核分析

stm32f4discovery 是很好的 os 練習平台, 不過沒有 mmu 是我覺得可惜的部份, 而 raspberrypi 2 正好可以補足這部份, 然而 rpi2 我目前還不知道怎麼使用 jtag, 在除錯上會比較麻煩, 得用冥想的。

沒想到第二個 bare-metal rpi2 程式就要搞 mmu 了, 感覺很硬斗, 我自己覺得還好, 畢竟我已經累積了不少經驗/知識。這就是累積的力量。

之前有寫過 x86 mmu 的文章, 那時候 mmu 並不是我重點學習的部份, 現在換個平台, 再來重新學習。

raspberrypi 2 是 arm cortex A7, 這是比較新的架構, 網路上找的 mmu 資訊大部份都是 arm v6 的, 而 DS-5 有 startup_Cortex-A7/startup.s 可以用來參考, 程式碼配合手冊, 可以加速學習速度。

我強烈建議你先看《一步步写嵌入式操作系统:ARM编程的方法与实践》3.2 ~ 3.4, 否則應該看不懂這篇, 除了理論 (在一步步写嵌入式操作系统:ARM编程的方法与实践提到, 所以我不會說明 arm v6 mmu 工作方式, 這本書說明的很詳細, 這本書雖然絕版了卻很容易找到, 別擔心, 這本書寫的是 arm v6, 但還是有很大的參考價值), 我還會展示實作的程式碼, 可以想成是一步步写嵌入式操作系统:ARM编程的方法与实践 arm v7-A 真實機器 (rpi2) 的版本。

由於是 arm v7-A, 所以還要搭配 ARM® Architecture Reference Manual ARMv7-A and ARMv7-R edition Chapter B3 Virtual Memory System Architecture (VMSA) 研讀 (因為我找不到中文的, 所以只好自己 K 英文手冊), 若你真的看過一步步写嵌入式操作系统:ARM编程的方法与实践, 再看這部份會好懂些。大同中有小異, cortex v7-A 多了一些欄位, 所以還是要參考一下手冊的內容。這部份有 200 多頁, 不過並不需要真的看完才會設定, 我大概看了 10 頁左右就足夠我的測試。

阅读全文>>

标签: MMU

评论(8) 浏览(10715)

ARM64的启动过程之(四):打开MMU

作者:linuxer 发布于:2015-10-24 12:35 分类:ARMv8A Arch

经过漫长的前戏,我们终于迎来了打开MMU的时刻,本文主要描述打开MMU以及跳转到start_kernel之前的代码逻辑。这一节完成之后,我们就会离开痛苦的汇编,进入人民群众喜闻乐见的c代码了。

阅读全文>>

标签: 打开MMU

评论(52) 浏览(58322)

ARM64的启动过程之(三):为打开MMU而进行的CPU初始化

作者:linuxer 发布于:2015-10-21 19:32 分类:ARMv8A Arch

上一节主要描述了为了打开MMU而进行的Translation table的建立,本文延续之前的话题,主要是进行CPU的初始化(注:该初始化仅仅为是为了turn on MMU)。

本文主要分析ARM64初始化过程中的__cpu_setup函数,代码位于arch/arm64/mm/proc.S中。主要的内容包括:

1、cache和TLB的处理

2、Memory attributes lookup table的构建

3、SCTLR_EL1、TCR_EL1的设定

阅读全文>>

标签: ARM64启动过程 MMU

评论(10) 浏览(42283)

ARM64的启动过程之(二):创建启动阶段的页表

作者:linuxer 发布于:2015-10-13 18:18 分类:ARMv8A Arch

本文主要描述了ARM64启动过程中,如何建立初始化阶段页表的过程。我们知道,从bootloader到kernel的时候,MMU是off的 (顺带的负作用是无法打开data cache),为了提高性能,加快初始化速度,我们必须某个阶段(越早越好)打开MMU和cache,而在此之前,我们必须要设定好页表。

在 初始化阶段,我们mapping三段地址,一段是identity mapping,其实就是把物理地址mapping到物理地址上去,在打开MMU的时候需要这样的mapping(ARM ARCH强烈推荐这么做的)。第二段是kernel image mapping,内核代码欢快的执行当然需要将kernel running需要的地址(kernel txt、dernel rodata、data、bss等等)进行映射了,第三段是blob memory对应的mapping。

在本文中,我们会混用下面的概念:page table和translation table、PGD和Level 0 translation table、PUD和Level 1 translation table、PMD和Level 2 translation table、Page Table和Level 3 translation table。最后,还是说明一下,本文来自4.4.6内核,有兴趣的读者可以下载来对照阅读本文。


阅读全文>>

标签: __create_page_tables

评论(42) 浏览(59641)

Linux PWM framework(1)_简介和API描述

作者:wowo 发布于:2015-10-11 15:45 分类:通信类协议

PWM是Pulse Width Modulation(脉冲宽度调制)的缩写,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,其本质是一种对模拟信号电平进行数字编码的方法。在嵌入式设备中,PWM多用于控制马达、LED、振动器等模拟器件。

PWM framework是kernel为了方便PWM driver开发、PWM使用而抽象出来的一套通用API,之所以要分析该framework,原因如下:

1)PWM接口,本质上一种通信协议,和I2C、SPI、USB、WIFI等没有任何差别。因此,本文将会是kernel通信协议有关framework的分析文章的第一篇。

2)它太简单了!但是,虽然简单,思路却大同小异,因而非常适合做第一篇。

3)我计划整理显示子系统的分析文章,而PWM,是显示子系统中最基础的那一个。

闲话少说,言归正传!

阅读全文>>

标签: Linux driver pwm

评论(20) 浏览(38801)

ARM64的启动过程之(一):内核第一个脚印

作者:linuxer 发布于:2015-10-10 15:06 分类:ARMv8A Arch

kernel的整个启动过程涉及的内容很多,不可能每一个细节都描述清楚,因此我打算针对部分和ARM64相关的启动步骤进行学习、 整理,并方便后续查阅。本文实际上描述在系统启动最开始的时候,bootloader和kernel的交互以及kernel如何保存bootloader 传递的参数并进行校验,此外,还有一些最基础的硬件初始化的内容。

本文中的source来自4.1.10内核,这是一个long term的版本,后续一段时间的文章都会基于这个long term版本进行。

阅读全文>>

标签: arm64 初始化

评论(41) 浏览(81951)

Linux vm运行参数之(二):OOM相关的参数

作者:linuxer 发布于:2015-9-28 12:10 分类:内存管理

本文是描述Linux virtual memory运行参数的第二篇,主要是讲OOM相关的参数的。为了理解OOM参数,第二章简单的描述什么是OOM。如果这个名词对你毫无压力,你可以直接 进入第三章,这一章是描述具体的参数的,除了描述具体的参数,我们引用了一些具体的内核代码,本文的代码来自4.0内核,如果有兴趣,可以结合代码阅读, 为了缩减篇幅,文章中的代码都是删减版本的。按照惯例,最后一章是参考文献,本文的参考文献都是来自linux内核的Documentation目录,该 目录下有大量的文档可以参考,每一篇都值得细细品味。

阅读全文>>

标签: oom

评论(20) 浏览(36691)

Linux vm运行参数之(一):overcommit相关的参数

作者:linuxer 发布于:2015-9-23 18:54 分类:内存管理

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

本文的代码来自4.0内核。

阅读全文>>

标签: overcommit

评论(3) 浏览(31331)

Linux CPU core的电源管理(5)_cpu control及cpu hotplug

作者:wowo 发布于:2015-9-19 21:39 分类:电源管理子系统

由“Linux CPU core的电源管理(1)_概述”的描述可知,kernel cpu control位于“.\kernel\cpu.c”中,是一个承上启下的模块,负责屏蔽arch-dependent的实现细节,向上层软件提供控制CPU core的统一API(主要包括cpu_up/cpu_down等接口的实现)。本文将基于这些API,从上到下,分析CPU core从启动到关闭的整个过程(主要是CPU hotplug),进一步理解系统运行过程中CPU core电源管理相关的行为。

注1:其实这一部分已经不属于电源管理的范畴了,而是系统级的软件行为(boot、调度、电源管理等等),之所以放到这里讲述,主要原因是,这些复杂行为的背后,目的只有一个----节电。因此,本文只会focus在CPU core power状态切换的过程上,涉及到得其它知识,如进程调度,只会一笔带过。

阅读全文>>

标签: Linux cpu hotplug cpu_up cpu_down smpboot

评论(17) 浏览(40142)

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