• <div id="0yoao"><tr id="0yoao"></tr></div>
    <dl id="0yoao"></dl>
  • <sup id="0yoao"></sup>
    <div id="0yoao"><tr id="0yoao"></tr></div>
  • <div id="0yoao"><tr id="0yoao"></tr></div>
  • ARM64的启动过?#35752;?#20116;):UEFI

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

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

    阅读全文>>

    标签: arm64 UEFI

    评论(5) 浏览(18262)

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

    RCU synchronize原理分析

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

        RCURead-Copy Update)是Linux内核比较成熟的新型读?#27492;?#20855;有较高的读写并发?#38405;埽?#24120;常用在需要互斥的?#38405;?#20851;键路径。在kernel中,rcutiny rcutree rcu两种实现,tiny rcu更加简洁,通常用在小型嵌入式系?#25345;校?/span>tree rcu则被广泛使用在了server, desktop以及android系?#25345;小?#26412;文将以tree rcu为分析对象。

    阅读全文>>

    标签: RCU

    评论(4) 浏览(10940)

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

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

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

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

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

    raspberrypi 2 是 arm cortex A7, 這是?#23481;^新的架構, 網路上找的 mmu 資訊大部份?#38469;?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 英文手冊), 若你真?#30446;?#36942;一步步写嵌入式操作系统:ARM编程的方法与实践, 再看這部份會好懂些。大同中有小異, cortex v7-A 多了一些欄位, 所以還是要參考一下手冊的內容。這部份有 200 多頁, 不過並不需要真?#30446;?#23436;才會設定, 我大概看了 10 頁左右就足夠我的測試。

    阅读全文>>

    标签: MMU

    评论(8) 浏览(4438)

    ARM64的启动过?#35752;?#22235;):打开MMU

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

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

    阅读全文>>

    标签: 打开MMU

    评论(47) 浏览(24072)

    ARM64的启动过?#35752;?#19977;):为打开MMU而进行的CPU初始化

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

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

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

    1、cache和TLB的处理

    2、Memory attributes lookup table的构建

    3、SCTLR_EL1、TCR_EL1的设定

    阅读全文>>

    标签: ARM64启动过程 MMU

    评论(10) 浏览(16752)

    ARM64的启动过?#35752;?#20108;):创建启动阶段的页表

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

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

    在 初始化阶段,我们mapping三段地址,一段是identity mapping,其实就是把物理地址mapping到物理地址上去,在打开MMU的时候需要这样的mapping(ARM ARCH强烈推荐这么做的)。第二段是kernel image mapping,内核代码欢快的执行当然需要将kernel running需要的地址(kernel txt、dernel rodata、data、bss等等)进行?#25104;?#20102;,第三段是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。最后,还是?#24471;?#19968;下,本文来自4.4.6内核,有兴趣的读者可以下载来对照阅读本文。


    阅读全文>>

    标签: __create_page_tables

    评论(37) 浏览(25771)

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

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

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

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

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

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

    3)我计划整理显示子系统的分析文章,而PWM,是显示子系?#25345;?#26368;基础的那一个。

    闲话少说,言归正传!

    阅读全文>>

    标签: Linux driver pwm

    评论(17) 浏览(16113)

    ARM64的启动过?#35752;?#19968;):内核第一个脚印

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

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

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

    阅读全文>>

    标签: arm64 初始化

    评论(37) 浏览(33366)

    Copyright @ 2013-2015 蜗窝科技 All rights reserved. Powered by emlog
    连码三全中是什么
  • <div id="0yoao"><tr id="0yoao"></tr></div>
    <dl id="0yoao"></dl>
  • <sup id="0yoao"></sup>
    <div id="0yoao"><tr id="0yoao"></tr></div>
  • <div id="0yoao"><tr id="0yoao"></tr></div>
  • <div id="0yoao"><tr id="0yoao"></tr></div>
    <dl id="0yoao"></dl>
  • <sup id="0yoao"></sup>
    <div id="0yoao"><tr id="0yoao"></tr></div>
  • <div id="0yoao"><tr id="0yoao"></tr></div>