随笔分类 - 驱动
摘要:很多粉丝在群里提问,如何把一个模块文件编译到内核中或者独立变异成ko文件。本文给大家详解讲解。 1. 内核目录 Linux内核源代码非常庞大,随着版本的发展不断增加。它使用目录树结构,并且使用Makefile组织配置、编译。 初次接触Linux内核,好仔细阅读顶层目录的readme文件,它是Linu
阅读全文
摘要:粉丝问题 如何制作rootfs? 安排! 想直奔主题的,直接跳到第四章。 一、分析 1. 文件系统简介 理论上说一个嵌入式设备如果内核能够运行起来,且不需要运行用户进程的话,是不需要文件系统的,文件系统简单的说就是一种目录结构,由于 linux操作系统的设备在系统中是以文件的形式存在,将这些文件进行
阅读全文
摘要:问题描述 如何使用内核定时器? 内核定时器 Linux内核定时器是timer_list,下面我们详细介绍定时器的使用。 1. 简介 内核定时器是内核用来控制在未来某个时间点(基于jiffies)调度执行某个函数的一种机制,其实现位于 <Linux/timer.h> 和 kernel/timer.c
阅读全文
摘要:一、 问题描述 access_ok函数是什么原理? 二、问题分析 我们在内核空间和用户空间进行数据拷贝的时候必须判断用户空间地址是否合法。 主要通过偶函数access_ok来判断。 1. Linux用户空间与内核地址空间 Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能
阅读全文
摘要:一、问题整理 内核中两个模块,一个A,一个B,A模块中有操作函数,B模块要调用A模块的函数。 二、分析 这是一个驱动工程师经常遇到的一个问题,该问题其实是模块符号导出问题,实现该功能比较简单,借助EXPORT_SYMBOL()即可。 1. 什么是符号? 这里的符号主要指的是全局变量和函数,静态全局变
阅读全文
摘要:一、问题描述 如何在内核中操作某个文件? 二、操作函数 1. 分析 在用户态,读写文件可以通过read和write这两个系统调用来完成(C库函数实际上是对系统调用的封装)。 但是,在内核态没有这样的系统调用,我们又该如何读写文件呢? 阅读Linux内核源码,可以知道陷入内核执行的是实际执行的是sys
阅读全文
摘要:更多嵌入式原创文章,请关注公众号:一口Linux 1. SPI总线 1.1. SPI总线概述 SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,F
阅读全文
摘要:更多嵌入式Linux原创,请关注公众号:一口Linux 一、模块硬件学习 1.1. Uart介绍 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称为UART,是一种异步收发传输器,是电脑硬件的一部分。它将要传输的资料在串行通信与并行
阅读全文
摘要:platform总线是学习linux驱动必须要掌握的一个知识点。 本文参考已发布:Linux 3.14内核 一、概念 嵌入式系统中有很多的物理总线:I2c、SPI、USB、uart、PCIE、APB、AHB linux从2.6起就加入了一套新的驱动管理和注册的机制platform平台总线,是一条虚拟
阅读全文
摘要:更多嵌入式原创文章,请关注公众号:一口Linux 一:文件系统 1. 什么是文件系统? 操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。 通常文件系统是用于存储和组织文件的一种机制,便于对文件进行方便的查找与访问。 文件系统是对文件存储设备的空间进行组织和分配,负责文件存储
阅读全文
摘要:概念 Linux内核的信号量在概念和原理上和用户态的System V的IPC机制信号量是相同的,不过他绝不可能在内核之外使用,因此他和System V的IPC机制信号量毫不相干。 如果有一个任务想要获得已经被占用的信号量时,信号量会将其放入一个等待队列(它不是站在外面痴痴地等待而是将自己的名字写在任
阅读全文
摘要:背景 由于在多处理器环境中某些资源的有限性,有时需要互斥访问(mutual exclusion),这时候就需要引入锁的概念,只有获取了锁的任务才能够对资源进行访问,由于多线程的核心是CPU的时间分片,所以同一时刻只能有一个任务获取到锁。 内核当发生访问资源冲突的时候,通常有两种处理方式: 一个是原地
阅读全文
摘要:原子操作原理分析 概念 原子操作是指不被打断的操作,即它是最小的执行单位。最简单的原子操作就是一条条的汇编指令(不包括一些伪指令,伪指令会被汇编器解释成多条汇编指令)。在 linux 中原子操作对应的数据结构为 atomic_t,定义如下: typedef struct { int counter;
阅读全文
摘要:本文目标 什么是文件描述符? 进程打开文件相关信息管理 Linux设备文件三大结构:inode,file,file_operations mknod 做了什么事? 进程打开设备文件 驱动如何支持同类型设备? 如何获得注册的设备结构体私有地址? 什么是文件描述符? Linux 中一切都可以看作文件,包
阅读全文
摘要:在Linux系统中有大量的临界资源需要保护,如何让各个任务有条不紊的访问这些资源,这涉及到Linux中并发访问的保护机制设计相关知识。后面会详细介绍这几个机制。 (据可靠消息,锁的实现经常出现在笔试环节。既可以考察面试者对锁的原理的理解,又可以考察面试者编程技能)。 注:部分代码都是根据ARM64架
阅读全文
摘要:在Linux内核中,提供了一个用来创建双向循环链表的结构 list_head。虽然linux内核是用C语言写的,但是list_head的引入,使得内核数据结构也可以拥有面向对象的特性,通过使用操作list_head 的通用接口很容易实现代码的重用,有点类似于C++的继承机制(希望有机会写篇文章研究一
阅读全文
摘要:本文基于三星Cortex-A9架构,Exynos4412讲解I2C原理、以及基于I2C的mpu6050陀螺仪的数据读取实例(包括在裸机模式下数据的读取以及基于Linux驱动的读取)。还会分析Linux内核I2C架构,篇幅过长,绝对干货。 裸机篇 本篇首先详细讲解I2C时序,然后讲解如何基于三星I2C
阅读全文
摘要:前言 在嵌入式开发中,ADC应用比较频繁,本文主要讲解ADC的基本原理以及如何编写基于ARM的裸机程序和基于Linux的驱动程序。 ARM架构:Cortex-A9 Linux内核:3.14 在讲述ADC之前,我们需要先了解什么是模拟信号和数字信号。 模拟信号 主要是与离散的数字信号相对的连续的信号。
阅读全文
摘要:一、Linux设备分类 Linux系统为了管理方便,将设备分成三种基本类型: 字符设备 块设备 网络设备 字符设备: 字符(char)设备是个能够像字节流(类似文件)一样被访问的设备,由字符设备驱动程序来实现这种特性。字符设备驱动程序通常至少要实现open、close、read和write的系统调用
阅读全文
摘要:通过《手把手教Linux驱动1-模块化编程,玩转module》的学习,我们已经掌握了如何向内核加载一个模块,现在我们学习模块之间如何传递参数。 一、给模块传递参数 当我们加载一个模块到Linux内核的时候,Linux内核允许向这个模块传递一些参数。这样设计的好处就是,让我们的模块操作起来更灵活,我们
阅读全文