linux cpufreq framework(5)_ARM big Little driver

作者:wowo 发布于:2015-11-10 22:04 分类:电源管理子系统

也许大家会觉得奇怪:为什么Linux kernel把对ARM big·Lttile的支持放到了cpufreq的框架中?

众所周知,ARM的big·Little架构,也称作HMP(具体可参考“Linux CPU core的电源管理(2)_cpu topology”中相关的介绍),通过在一个chip中封装两种不同类型的ARM core的方式,达到性能和功耗的平衡。这两类ARM Core,以cluster为单位,一类为高性能Core(即big core),一类为低性能Core(即Little core),通过它们的组合,可以满足不同应用场景下的性能和功耗要求,例如:非交互式的后台任务、或者流式多媒体的解码,可以使用低功耗的Little core处理;突发性的屏幕刷新,可以使用高性能的big core处理。

那么问题来了,Linux kernel怎么支持这种框架呢?

注1:本文很多理论性的表述,或多或少的理解并翻译自:“http://lwn.net/Articles/481055/”,感兴趣的读者可以自行阅读。

注2:本文基于linux-3.18-rc4内核,其它版本内核可能会稍有不同。

阅读全文>>

标签: Linux ARM cpufreq hmp big little

评论(35) 浏览(20330)

實作 spinlock on raspberry pi 2

作者:descent 发布于:2015-11-5 9:33

process 同步機制有 spinlock, mutex, semaphore, 我的學習方式是簡化再簡化, 然後用程式碼實作他們, 否則我只會有「名詞」上的理解, 而不會真的理解。有了 spinlock 就有了基本的 process 同步機制。

阅读全文>>

标签: spinlock

评论(0) 浏览(8252)

linux kernel内存碎片防治技术

作者:itrocker 发布于:2015-11-2 10:24 分类:内存管理

Linux kernel组织管理物理内存的方式是buddy system(伙伴系统),而物理内存碎片正式buddy system的弱点之一,为了预防以及解决碎片问题,kernel采取了一些实用技术,这里将对这些技术进行总结归纳。

阅读全文>>

标签: 内存碎片

评论(18) 浏览(33187)

ARM64的启动过程之(五):UEFI

作者:linuxer 发布于:2015-10-30 19:27 分类:ARMv8A Arch

在准备大刀阔斧进入start_kernel之际,我又重新review了一下head.S文件,看看是否有一些遗漏的知识点,很不幸,看到了 CONFIG_EFI这个配置项。当然,在一年前阅读kernel代码的时候就了解过相关的内容,但是,做为一个嵌入式工程师总是或多或少对其有些排斥, 因此习惯性的忽略掉CONFIG_EFI相关的代码,逃避总不是办法,在本文中,我们一起来探讨ARM64平台上UEFI相关的内容。

阅读全文>>

标签: arm64 UEFI

评论(5) 浏览(48789)

Linux 3.18U盘无法正确使用

作者:linglongqion 发布于:2015-10-28 16:20

U盘插入时,内核能正确识别到,但是无法挂载,查看dev下的设备文件为字符设备,而不是块设备:

打印如下:

usb 1-2: new high-speed USB device number 3 using atmel-ehci
Can not be start read in 1s
usb 2-2: new full-speed USB device number 3 using at91_ohci
usb 2-2: New USB device found, idVendor=2008, idProduct=2018
usb 2-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 2-2: Product: Flash Disk     
usb 2-2: Manufacturer: USB2.0 
usb 2-2: SerialNumber: 001616
usb-storage 2-2:1.0: USB Mass Storage device detected
scsi host2: usb-storage 2-2:1.0
scsi 2:0:0:0: Direct-Access     USB2.0   Flash Disk       2.10 PQ: 0 ANSI: 2
sd 2:0:0:0: Attached scsi generic sg1 type 0
sd 2:0:0:0: [sdb] 2039808 512-byte logical blocks: (1.04 GB/996 MiB)
sd 2:0:0:0: [sdb] Write Protect is off
sd 2:0:0:0: [sdb] No Caching mode page found
sd 2:0:0:0: [sdb] Assuming drive cache: write through
(unknown ASC/ASCQ)
 sdb: sdb1
sd 2:0:0:0: [sdb] Attached SCSI removable disk

 

到dev下查看sdb文件属性:

crw-rw--rw--    1 root     root       8,  16 Oct  1 19:47 /dev/sdb
crw-------    1 root     root       8,  17 Oct  1 19:47 /dev/sdb1

?????奇怪!为什么不是块设备吗?但是在/sys/block中sdb是存在的,难道是内核配置的问题?但是在内核配置里,针对USB和SCSI对应的驱动支持都已经打勾!

求教各位前辈

 

标签: Linux 3.18 USB

评论(8) 浏览(14100)

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) 浏览(29677)

作業系統之前的程式 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) 浏览(11762)

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

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

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

阅读全文>>

标签: 打开MMU

评论(52) 浏览(62150)

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) 浏览(45852)

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) 浏览(65237)

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