我们知道外设访问内存需要通过DMA进行数据搬移,关于cpu, cache, device, dma, memory的关系可以通过下图说明:
1)物理地址:CPU地址总线传来的地址,由硬件电路控制其具体含义。物理地址中很大一部分是留给内存条中的内存的,但也常被映射到其他存储器上(如显存、BIOS等)。在程序指令中的虚拟地址经过段映射和页面映射后,就生成了物理地址,这个物理地址被放到CPU的地址线上。
上一篇我们分享了字符设备驱动框架:嵌入式Linux驱动基础,当时分享的是hello驱动程序。学STM32我们从点灯开始,学Linux驱动我们自然也要点个灯来玩玩,尽量在从这些基础例程中榨取知识,细抠、细抠,为之后更复杂的知识打好基础。
互联网、Linux内核书籍上充满了各种关于Linux DMA ZONE和dma_alloc_coherent、dma_map_single等的各种讲解,由于很多童鞋缺乏自身独立的思考,人云亦云,对这些概念形成了很多错误的理解。本文的目的在于彻底澄清这些误解。
每个外设,例如: 显示器有对应的显卡,显卡里面有相关的寄存器,通过往这些寄存器中设置对应的值,就可以控制该外设工作起来了。
端口(port)是接口电路中能被CPU直接访问的寄存器的地址。几乎每一种外设都是通过读写设备上的寄存器来进行的。CPU通过这些地址即端口向接口电路中的寄存器发送命令,读取状态和传送数据。外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器三大类,而且一个外设的寄存器通常被连续地编址。
内存虚拟化是一个很大的话题,最近安全部门发现了一个qemu内存虚拟化的安全漏洞,反馈给云平台让解决,感觉很棘手,引起了我对内存虚拟化的思考,想到什么问题就把思考记录下来。
即使看了所有的Linux 内核文章,估计也还不是很明白,这时候,还是需要fucking the code.
在前两期,我们讲述了X姐利用缓存一致性原理,晋升P9并且设法避免了被老板毕业的故事,链接在此:
I2C(Inter-Integrated Circuit BUS)是I2C BUS简称,中文为集成电路总线,是目前应用最广泛的总线之一。和IMX6ULL有些相关的是,刚好该总线是NXP前身的PHILIPS设计。
DMA(Direct Memory Access) 即直接存储器访问, DMA 传输方式无需 CPU 直接控制传输,通过硬件为 RAM 、I/O 设备开辟一条直接传送数据的通路,能使 CPU 的效率大
导语:掐指一算自己从研究生开始投入到Linux的海洋也有几年的时间,即便如此依然对其各种功能模块一知半解。无数次看了Linux内核的技术文章后一头雾水,为了更系统地更有方法的学Linux,特此记录。 历史 1991年,还在芬兰赫尔辛基大学上学的Linus Torvalds在自己的Intel 386计算机上开发了属于他自己的第一个程序,并利用Internet发布了他开发的源代码,将其命名为Linux,从而创建了Linux操作系统,并在同年公开了Linux的代码,从而开启了一个伟大的时代。在之后的将近30
导语:掐指一算自己从研究生开始投入到Linux的海洋也有几年的时间,即便如此依然对其各种功能模块一知半解。无数次看了Linux内核的技术文章后一头雾水,为了更系统地更有方法的学Linux,特此记录。 历史 1991年,还在芬兰赫尔辛基大学上学的Linus Torvalds在自己的Intel 386计算机上开发了属于他自己的第一个程序,并利用Internet发布了他开发的源代码,将其命名为Linux,从而创建了Linux操作系统,并在同年公开了Linux的代码,从而开启了一个伟大的时代。在之后的将近30年的
设备树(Device Tree),将这个词分开就是“设备”和“树”,描述设备设备树的文件叫做DTS(Device Tree Source),这个DTS文件采用了树形结构来描述板机设备,也就是开发板信息,比如CPU数量、内存基地址、IIC接口上接了那些设备、SPI接口上接了那些设备等。如最开始的图片所示! 在图片中,树的主干就是系统总线,IIC控制器、SPI控制器等都是接到系统主线的分支上的。通过DTS这个文件描述设备信息是有相关的语法规则的,并且在Linux内核中只有3.x版本以后的才支持设备树。
GPIO 简介 : 英文全称 General-Purpose Input / Output Ports, 中文翻译为 : 通用输入输出端口;
大家好,我是道哥,今天我为大伙儿解说的技术知识点是:【Linux 中断的注册和处理】。
前面的两篇Linux驱动文章,介绍了字符设备驱动的两种新旧开发方式,并使用一个虚拟的字符驱动来学习字符设备的开发的流程。
到目前为止,内存管理是unix内核中最复杂的活动。我们简单介绍一下内存管理,并通过实例说明如何在内核态获得内存。
确实,底层软件处理的都是很常见很成熟的设备,比如Flash、以太网、SD卡。 看起来应该不难。
运行 CPU是被动接受进程的,并且操作系统会管理进程并放在内存中让CPU处理。 那么CPU是怎用什么方式去查看所有的进程呢?是定义了一个PCB类型的队列指向第一个进程的PCB,然后进行对所有进程的管理。 这个时候所有的进程是通过数据结构的方式来链接起来的,CPU会一个一个处理进程,这个时候无论被处理还是没被处理都叫做运行状态!
本文主要分析ServiceManager系统服务管理进程对binder的管理流程。
管理的方法是先描述再组织,操作系统对于进程的管理实际上是对该进程的进程控制块做管理,而CPU数量总是小于进程数量的,所以CPU为了管理好这些进程控制块同样采用了先描述再组织的方法,即产生一个运行队列来管理加载到CPU中的进程。当某个进程的进程控制块被放入到了CPU中的运行对列就可以说该进程处于运行状态。
鸿蒙是一套完整的、普通人可以直接使用的操作系统,跟Windows、安卓、IOS类似。
设备树(Device Tree),将这个词分开就是“设备”和“树”,描述设备树的文件叫做 DTS(DeviceTree Source),这个 DTS 文件采用树形结构描述板级设备,也就是开发板上的设备信息,比如CPU 数量、 内存基地址、IIC 接口上接了哪些设备、SPI 接口上接了哪些设备等等。
鸿蒙是一套完整的、普通人可以直接使用的操作系统,跟Windows、安卓、IOS类似。 常见的错误观点是把鸿蒙跟Linux放在一起来对比,这不对:
Linux采用C语言编写(在C中有嵌入汇编成分)。本文想要用Java这门语言在软件层面上模拟出Linux。
在日常开发中,经常听到大家说一句话“任何需求都可以通过一个间接的的中间层来解决”。今天,通过几个 case 就“分层”话题梳理下自己的思考,其中,有些 case 比较直观,而有些不那么直观,甚至有些微妙,需要我们自己多品味。这意味着学习过程需要我们不断将新知识与旧知识进行关联,形成自己的知识体系,而非一个个知识孤岛。
RIFFA 是一种开源通信架构,它允许通过 PCIe 在用户的 FPGA IP 内核和 CPU 的主存储器之间实时交换数据。为了建立其逻辑通道,RIFFA 在 CPU 端拥有一系列软件库,在 FPGA 端拥有 IP 核。本文主要针对其中的DMA性能(Scatter-Gather DMA)进行测试。
在我10年的Java布道师生涯里,没有哪次Java新版本发布能让我如此兴奋。Java 8的发布不仅在语言本身加入了些不错的新特性,还在嵌入式开发上加入了很棒的功能,进行了优化,还有简洁的开发文档。如果你是一名Java程序员,并且准备好和我一同加入机器间技术的潮流,或者说开发下一代改变世界的设备,那么就让我们开始学习物联网(IoT)把。
不同的外部设备、不同的体系结构、不同的OS其中断实现机制都有差别,本文对应的OS为linux3.4版本,外部设备为PCI设备、系统为X86。
如上图所示,smmu 的作用和mmu 类似,mmu作用是替cpu翻译页表将进程的虚拟地址转换成cpu可以识别的物理地址。同理,smmu的作用就是替设备将dma请求的地址,翻译成设备真正能用的物理地址,但是当smmu bypass的时候,设备也可以直接使用物理地址来进行dma;
作者 | 杨敏 审校 | 罗燕珊 在日常开发中,经常听到大家说一句话“任何需求都可以通过一个间接的的中间层来解决”。今天,通过几个 case 就“分层”话题梳理下自己的思考,其中,有些 case 比较直观,而有些不那么直观,甚至有些微妙,需要我们自己多品味。这意味着学习过程需要我们不断将新知识与旧知识进行关联,形成自己的知识体系,而非一个个知识孤岛。 1什么是分层设计?它有何好处? 分层设计将软件划分成若干层,每一层只解决一部分问题,通过所有层的协作来完成整体目标。一个复杂问题通过分解成一个个系统子问题
4.因为项目中用到FreeRTOS,讲讲FreeRTOS的调度原理; 答:FreeRTOS从OS 操作系统支持三种调度方式:抢占式调度,时间片调度和合作式调度。 实际应用主要是抢占式调度和时间片调度
上期我们在《虚拟化与云计算硬核技术内幕 (10) —— 事事有人管,人人有事管》中,为大家描述了如何将特定外设的中断送到指定的虚拟机的指定CPU上。那么,虚拟机的外设实际上到底是哪里来的呢?
进程不是一直运行的,进程可能会在等待某种软硬件资源。即使把进程加载到CPU中,也不是一直会运行的。而进程排队,一定是在等待某种软硬件资源(可以是CPU,键盘,磁盘,网卡等等设备......),排队时是进程的PCB在排队。在这里就需要引入一个概念:一个PCB可以被链入多种数据结构中。在之前的博客中也说过,PCB其实就是描述进程的一个很大的结构体,在这个结构体中,包含有很多其他的结构体。比如我定义一个node结构体
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情
前期我们介绍了经典的8位处理器——理光6502。与此同时,Intel也设计了8008,8051等应用广泛的8位处理器。1976年,Intel推出了新一代处理器8086。
常见的上网外设有有线以太网、WIFI、4G/5G等接口,一块硬件主板经常会搭载多种网络访问硬件资源。如何配置不同网络外设的使用优先级呢?本文将为您介绍Linux系统下的常用配置方法。
中断,英文名为Interrupt,计算机的世界里处处都有中断,任何工作都离不开中断,可以说整个计算机系统就是由中断来驱动的。那么什么是中断?简单来说就是CPU停下当前的工作任务,去处理其他事情,处理完后回来继续执行刚才的任务,这一过程便是中断。
1. 如果没有fork创建子进程的步骤,无论是运行进程还是将运行结果重定向到log.txt文件,两者输出结果都是相同的,均为4条打印信息
前面Linux专题中关于Linux下系统编程总结了17篇博文,主要是为了提高Linux下的C编程应用能力,熟悉Linux编程应用环境,从此篇博文起开始Linux驱动的总结,后面计划加一些综合实践项目练习。
在前几期,我们提到了NUMA的概念。实际上,NUMA这个概念的内涵和外延,在不同的语境中会产生变化。
我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。
设备树是一种数据结构,它通过特有的语法格式描述片上片外的设备信息。由BootLoader传递给kernel,kernel进行解析后形成和驱动程序关联的dev结构供驱动代码使用。
进程或者线程绑定到某个CPU Core,仍然可能会有线程或者进程切换的发生,如果想到达到进一步减少其他进程对于该进程或者线程影响,可以采取把CPU Core从Linux内核调度中剥离出来。Linux内核提供isolcpus,对于有4个CPU core的系统,在启动时候加入isolcpus=2,3,那么系统启动后将不会使用CPU3,CPU4.这里的不适用不是绝对的,但是可以通过taskset命令来设置
标示符(pid): 描述本进程的唯一标示符,用来区别其他进程; 状态(status): 任务状态,退出代码,退出信号等; 优先级(PRI): 相对于其他进程的优先级; 程序计数器: 程序中即将被执行的下一条指令的地址; 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器; I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表; 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
常见的上网外设有以太网、WIFI、4G/5G等接口,一块硬件主板经常会搭载多种网络访问硬件资源。如何配置不同网络外设的使用优先级呢?本文将为您介绍Linux系统下的常用配置方法。
在进行项目软件的撰写时,首先新建一个基于该项目的工程模板。对于初学者,很多都是直接用开发板提供商提供的现成的工程模板,但是那样的工程模板在项目开发中体态略显臃肿,而且如果直接用别人的工程模板,那么很多搭建工程模板的库文件的用法和功能我们不会很了解,因此,自己新建一个基于项目的工程模板是非常必要的。
作者 Rabbit_Run 概述 在2014年美国黑帽大会上,柏林SRLabs的安全研究人员JakobLell和独立安全研究人员Karsten Nohl展示了他们称为“BadUSB”(按照BadB
领取专属 10元无门槛券
手把手带您无忧上云