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

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

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

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

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

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

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

阅读全文>>

标签: 打开MMU

评论(52) 浏览(58360)

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

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

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

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

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