Linux内核、驱动
文章平均质量分 52
火锅娃
学无止境,学以致用
展开
-
Kmalloc Vmalloc 与malloc 的区别
总的来说kmalloc和vmalloc是分配内核的内存,malloc分配的是用户空间的内存。 kmalloc 保证分配的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连续,malloc申请的内存不一定连续(用户空间存储以空间链表的方式组织(地址递增),每一个链表块包含一个长度、一个指向下一个链表块的指针以及一个指向自身的存储空间指针。) kmalloc能分配的大小有限,vmalloc与malloc能分配的空间大小相对较大。 内存只有在要被DMA访问的时候才需要物理上连续。 vma原创 2022-03-23 15:58:43 · 2849 阅读 · 0 评论 -
V4L2驱动USB摄像头
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h>#include <getopt.h> #include <fcntl.h> #include <unistd.h>#include <errno.h>#include <malloc.h>.原创 2021-02-19 10:52:50 · 571 阅读 · 0 评论 -
Linux IIC核心、总线与设备驱动
总线仅仅使用SCL、SDA这两根信号线就实现了设备之间的数据交互,极大地简化了对硬件资源和PCB版布线空间的占用。因此,总线非常广泛的使用在EEPROM、实时钟、小型LCD等与CPU的接口中。Linux系统定义了驱动体系结构。在Linux系统中,驱动由 3部分组成,即IIC核心、总线和设备驱动。这3部分相互协作,形成了非常通用、可适应性很强的框架。一、Linux 体系结构Linux的体系...原创 2020-04-15 09:23:53 · 390 阅读 · 0 评论 -
Linux网络设备驱动专题
网络设备驱动是完成用户数据包在网络媒介上发送和接收的设备,他将上层协议传递下来的数据包已特定的媒介访问控制方式发送,并将接收到的数据包传递给上层协议。Linux系统对网络设备驱动定义了4个层次,分别为:网络协议接口层、网络设备接口层、提供实际功能的设备驱动层和网络设备与媒介层。1)网络协议接口层 向网络层协议提供统一的数据包收发接口,不论上层协议是ARP,还是IP,都通过dev_queue...原创 2020-04-13 16:31:16 · 984 阅读 · 0 评论 -
Linux 下 platform 设备驱动
在Linux2.6 以后的设备驱动模型中,需要关心总线、设备和驱动3个实体,总线将设备和驱动绑定。在系统每注册一个设备的时候,会寻找与之匹配的驱动;相反 ,在系统每注册一个驱动的时候,会寻找与之匹配的设备,而匹配由总线完成。一个现实的Linux 设备和驱动通常都需要挂接在一种总线上,对于本身依附于PCI、USB、I2C、SPI等的设备而言,这自然不是问题,但是在嵌入式系统里面,在SoC系统中...原创 2020-03-20 09:14:36 · 434 阅读 · 0 评论 -
Linux中断处理程序框架
设备的中断会打断内核进程的正常调度和运行,系统对更高吞吐率的追求势必要求中断服务程序尽量短小精悍。但是,这个良好的愿望往往与现实不吻合。在多数真实的系统中,当中断到来时,要完成的工作往往并不是短小的,它可能要进行大量的耗时处理。为了在中断执行时间尽量短和中断处理需完成的工作尽量大之间找到一个平衡点,Linux将中断处理程序分解为两个部分:顶半部(Top Half) 和底半部(Botton Half...原创 2020-03-16 13:11:50 · 517 阅读 · 0 评论 -
设备驱动中的异步通知与异步I/O
在设备驱动中使用异步通知可以使得再进行对设备的访问时,由驱动主动通知用户程序进行访问。这样,使用非阻塞I/O的应用程序无需轮询机制查询设备是否可访问,而阻塞访问也可以被类似“中断”的异步通知所取代。除了异步通知以为,应用还可以在发起I/O请求后,立即返回。之后,在查询I/O完成情况,或者I/O完成后被返回。这个过程为异步I/O。阻塞与非阻塞访问、poll函数提供了较好的解决设备访问机制,但是如...原创 2020-03-12 17:56:09 · 312 阅读 · 0 评论 -
设备驱动中的阻塞与非阻塞IO
阻塞和非阻塞I/O是设备访问的两种不同的模式,驱动程序可以灵活地支持这两种用户空间对设备的访问方式。在Linux设备驱动下,可以使用等待队列或轮询操作实现对I/O的阻塞和非阻塞访问。阻塞操作是指在执行设备操作时,若不能获取资源,则挂起进程直到满足克操作的条件后在进行操作。被挂起的进程进入睡眠状态,被从调度器的运行队列移走,直到等待条件满足。而非阻塞操作的进程不能进行设备操作时,并不挂起,它要么...原创 2020-03-10 16:45:43 · 695 阅读 · 0 评论 -
linux设备驱动中的并发控制
并发指的是多个执行单元同时、并行被执行,而并发的执行单元对共享资源(硬件资源和软件上的全局变量,静态变量等)的访问很容易导致竞态。在linux内核中,竞态发生主要有以下几种情况:对称多处理器(SMP)的多个CPU之间 单CPU内核进程与抢占他的进程 中断(硬中断、软终端、Tasklet、底半部)与进程之间解决竞态问题的途径是保证对共享资源的互斥访问,所谓互斥访问是指一个执行单元在访问共享...原创 2020-03-09 15:34:27 · 189 阅读 · 0 评论 -
简单字符设备程序
Linux下的驱动有字符设备驱动,块设备驱动和网络设备驱动。无论哪一种设备驱动,为了减少内核的体积和易于内核的管理,驱动多以模块的形式出现。对于内核模块的编程,前面一节已经提到过,主要包括内核的加载函数和卸载函数,模块的作者和GPL协议。对于简单的字符设备驱动而言,其实编写流程很简单,只要记住这个流程,就可以快速的写一个简单的字符设备驱动玩了。其流程主要有:内核模块的加载和卸载 添加并实...原创 2020-03-06 14:45:40 · 231 阅读 · 0 评论 -
简单内核模块编译
一般而言,驱动开发者会在内核源代码的drivers 目录内的相应子目录中增加新设备驱动 的源代码或者在arch/arm/mach-xxx 下新增加板级支持的代码,同时增加或修改Kconfig 配置 脚本和 Makefile 脚本,那么如何添加了?在前面搭建了arm虚拟开发板,使用的内核是3.16的版本。内核代码的编写都有一般的固定格式,基本包括模块加载,卸载和GPL协议等,下面是一个简单的内核...原创 2019-12-19 17:23:36 · 363 阅读 · 0 评论 -
裸机开发
1. 什么是裸机开发裸机就是没有穿衣服的机器。没有操作系统(OS-Linux) 不能使用带系统调用的标准函数 编译方式不同于应用程序,生成的可执行程序是不带格式 执行方式是直接下载到指定的内存地址并让程序计数器PC指向该内存地址执行 比一定从main函数开始执行 编译的时候必须要制定链接地址,而且这个地址一般为物理地址 编译完成的可执行程序必须去除多余的格式信息,...原创 2019-12-15 20:28:25 · 7047 阅读 · 0 评论 -
模拟vexpress-a9开发板u-boot
在前面一章中,已经下载并编译了u-boot。我使用的是u-boot-2015.05, 解压后,配置,编译:make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- vexpress_ca9x4_defconfigmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-u-boot 的启动过程可以分为两种,单阶段...原创 2019-12-13 11:43:56 · 526 阅读 · 0 评论 -
使用Qemu模拟vexpress-a9搭建模拟开发板
目录1. 环境介绍:2. 下载Linux内核3. 安装arm的交叉编译工具链4.编译Linux内核5. 下载qemu6. 制作根文件系统1. 根文件系统的内容2. 根文件系统放在哪里3. 下载、编译和安装busybox7.使用qemu测试8.下载、编译u-boot代码9.u-boot使用qemu测试10. 利用网络引导的方式启动Linux内核。具...原创 2019-03-19 18:08:28 · 3419 阅读 · 0 评论 -
SPI在linux3.14.78 FS_S5PC100(Cortex A8)和S3C2440上驱动移植(deep dive)
由于工作的原因,对SPI的理解最为深刻,也和SPI最有感情了,之前工作都是基于OSEK操作系统上进行实现,也在US/OS3上实现过SPI驱动的实现和测试,但是都是基于基本的寄存器操作,没有一个系统软件架构的思想,感觉linux SPI驱动很强大,水很深,废话少说,SPI总线上有两类设备:一类是主机端,通常作为SOC系统的一个子模块出现,比如很多嵌入式MPU中都常常包含SPI模块。一类是从机被控端,...转载 2018-12-29 09:29:57 · 221 阅读 · 0 评论 -
SPI内核驱动模型-dm8127
利用TI提供的已有SPI内核驱动模型,该方案需要我们了解内核的SPI驱动模型是如何实现的。3.1. SPI内核驱动模型在2.6的linux内核中,SPI的驱动架构可以分为如下三个层次:SPI 核心层、SPI控制器驱动层和SPI设备驱动层。Linux 中SPI驱动代码位于drivers/spi目录。3.1.1. SPI核心层SPI核心层是Linux的SPI核心部分,提供了核心数据...原创 2018-11-23 11:09:18 · 302 阅读 · 0 评论 -
omapl138移植uboot系列之修改移植TI官方移植的Linux内核(启动内核第二篇)
修改Linux内核源码 实际上,刚刚我们已经成功的启动了TI移植过的Linux内核,但是从串口控制台的现象来看,“Starting Kernel”之后什么信息都没有输出,这就需要我们在TI移植过的内核源码之上进行相应修改,以适合我们的639A板卡。3.2.1 关于uboot启动内核停留在Starting Kernel问题的解决当通过Kermit方式使用串口在线将内核uImage...转载 2018-11-23 09:39:01 · 207 阅读 · 0 评论