
Linux 学习
文章平均质量分 92
念念有余
这个作者很懒,什么都没留下…
展开
-
ARM64 MMU和系统上电时Linux页表映射过程
1、MMU原创 2020-02-17 22:14:54 · 2592 阅读 · 0 评论 -
Linux串口常规设置参考
转载自http://blog.youkuaiyun.com/zgrjkflmkyc/article/details/8974243据通信的基本方式可分为并行通信与串行通信两种。· 并行通信是指利用多条数据传输线将一个资料的各位同时传送。它的特点是传输速度快,适用于短距离通信,但要求传输速度较高的应用场合。· 串行通信是指利用一条传输线将资料一位位地顺序传送。特点是通信线路简单,利用简单的线缆就可实现通信,降低...转载 2018-03-08 20:34:23 · 380 阅读 · 0 评论 -
Linux I2C驱动
I2C协议的介绍可以参考《I2C协议》,这里就不做太多介绍了。看了很多书籍和博文,先把linux I2C的驱动架构讲解了一遍,但是linux的I2C驱动架构真的挺复杂的,但是仅看驱动的话,东西也不多,因为有很多东西内核已经帮我们实现了。所以我决定换一种方法,先看驱动代码,再看linux的I2C架构,先简单后复杂。我们在fs6618开发板上,通过MMA8451a来看看I2C的程序,I2C驱动相关的我...原创 2018-02-11 18:04:05 · 797 阅读 · 1 评论 -
Linux学习(二):vi编辑器
1、vi编辑器打开文件vi+filename ------将文件在vi编辑器中打开注意:如果文件存在,直接打开,如果不存在,则先创建一个新的文件再打开该文件。2、vi编辑器的三种模式vi编辑器包括三种模式: (1)一般模式 (2)编辑模式 ...原创 2017-09-02 15:09:49 · 443 阅读 · 0 评论 -
mount.nfs: access denied by server while mounting 一个解决办法
转载自http://blog.youkuaiyun.com/kelvindream/article/details/53858214这两天在搭建嵌入式开发环境,配置好NFS服务器后,遇到了一个很纠结的错误使用 mount -t nfs 127.0.0.1:/home/lzgonline/rootfs /mnt 和 mount -t nfs 192.168.1.9:/home/lzgonline/roo转载 2018-02-06 21:03:40 · 988 阅读 · 0 评论 -
linux中断处理
一、中断介绍所谓中断是指CPU在执行程序的过程中,出现了某些突发事件需要紧急处理,CPU必须暂时停止当前的工作,转去执行处理突发事件,处理完毕又返回原程序被中断的位置继续执行。在ARM多核处理器中最常用的中断控制器是GIC,支持三类中断1、SGI:Software Generated Interrupt,软件产生的中断,用于多核的核间通信2、PPI:Private Peripheral Inter...原创 2018-02-06 18:18:10 · 1171 阅读 · 0 评论 -
linux驱动(二):驱动模块传参
在编写应用我们可以通过终端向main函数传参,其实在驱动模块中我们同样可以传参,但需要遵从一定的格式要求。在驱动的模块中声明一下你要传递的参数名称,类型和权限 module_param(变量的名称,类型,权限);传递整型: int intval ; module_param(intval, int , 0664);传递字符指针:原创 2017-12-24 11:33:53 · 2516 阅读 · 0 评论 -
linux驱动(一):linux驱动框架
编写linux驱动先看一下驱动框架是什么样子的。驱动编写和应用层编写有什么区别呢?(一)首先 入口函数的问题。应用层编写我们的入口就是main函数,但在驱动编写时不是这样的,有两种情况,1、缺省情况下int __init init_module(void) 加载模块时的初始化函数,也就是驱动模块的入口函数void __exit cleanup_module(void) 卸载模原创 2017-12-23 11:46:28 · 36395 阅读 · 9 评论 -
Linux设备驱动中的异步通知和异步IO
前面两章分别提到IO模型中的阻塞与非阻塞Linux驱动(六)设备驱动中的阻塞与非阻塞IO,IO多路复用驱动中轮询操作实现,这一章我们再来看看异步IO,这样,IO模型就可以都搞定了。回顾一下在应用程序中使用异步IO的步骤1,应用程序 1)设置异步标志位 int flags = fcntl(fd, F_GETFL); flags |= O_ASYNC, fcntl(原创 2018-01-17 16:13:08 · 443 阅读 · 0 评论 -
驱动中轮询操作实现
在应用程序中,我们经常会用到select和poll函数。这当然也是需要我们底层来实现才行。底层对应的函数是struct file_operations中的unsigned int (*poll) (struct file *, struct poll_table_struct *); 第一个参数为file结构体指针,第2个参数为轮询表指针 在poll函数中我们做两件事情:1、使用po原创 2018-01-15 15:55:06 · 1048 阅读 · 0 评论 -
Linux驱动(六)设备驱动中的阻塞与非阻塞IO
我们在Linux学习(二十三)IO模型中了解了LINUX中IO模型,IO模型最简单的可以分为阻塞IO和非阻塞IO。并且学习了一个用如何使用阻塞操作和非阻塞操作。而应用层之所以能实现阻塞操作和非阻塞操作,都是因为底层实现了阻塞操作和非阻塞操作。我们这一节就来看看底层是如何实现的。阻塞操作是指在执行设备操作时,若不能获得资源,则挂起进程直到满足可操作的条件后再进行操作。而非阻塞操作的进程在不能进行原创 2018-01-12 18:46:11 · 3792 阅读 · 0 评论 -
Linux驱动(七)设备模型介绍以及platform设备驱动
前面讲过了字符驱动,我们把过程再来回顾一下,我们是如何来完成一个驱动的。1、设备号相关问题,手动或自动创建设备号。2、设备对象相关问题,完成驱动操作方法集合,并向内核注册该设备对象。3、生成设备节点这其中有一个最大的问题:设备和驱动高度耦合,设备修改后,驱动也需要修改,牵一发而动全身。这为后续的驱动开发造成了很不好的影响。我们应该做到的是,高内聚低耦合。设备修改后只修改相应的设备文原创 2018-01-22 17:43:54 · 845 阅读 · 1 评论 -
Linux驱动(五)linux设备驱动中的并发控制
在应用层学习时,我们学习过多个进程处理共享资源的情况。实际上在驱动中也有类似的情况,并且相对于应用层,并发的情况会更多。 并发(concurrency)指的是多个执行单元同时、并行被执行,而并发的执行单元对共享资源。(硬件资源和软件上的全局变量、静态变量等)的访问则很容易导致竞态(race conditions)竞态发生的原因主要有以下几点: 1,对称多处理器的cpu原创 2018-01-09 20:55:36 · 897 阅读 · 0 评论 -
Linux驱动(三)字符设备驱动框架
前面我们讲了linux驱动框架linux驱动(一)驱动框架,对驱动的基本框架有了了解。现在我们来说一说字符设备驱动,我们一般讲驱动分为三类,字符设备、块设备、网络设备。字符设备和块设备是按照传输时的基本单位来划分的,字符设备就是传输时是按字符来传输的,比如串口、GPIO、SPI等。字符设备如硬盘等按照块传输的设备,块设备和网络设备的驱动我们跟多是做移植的工作,字符设备种类繁多且不算复杂,所以就会自原创 2017-12-26 21:13:34 · 2527 阅读 · 0 评论 -
Linux驱动(四)ioctl设备基本操作
对驱动设备除了读写操作,还应该有一个控制操作,内核将对设备的控制操作委派给了ioct接口,ioctl也是一个系统调用,函数原型如下: int ioctl(int d, int request,......)d表示文件描述符request我们理解为命令后面可以跟命令的参数在文件操作集合中与ioctl对应的函数是: long (*unlocked原创 2018-01-02 14:50:54 · 1335 阅读 · 0 评论 -
linux SPI读写过程
最近用到了海思的3519的SPI读写,做一下简单的记录 SPI驱动包括主机master驱动,SPI core 和SPI设备驱动,linux驱动有很多这样的结构,I2C也是如此,这么做的目的是为了主机和设备分离。 spi定义的一些结构体在include/linux/spi/spi.h文件当中。 描述spi masterstruct spi_master {...原创 2018-06-23 18:51:53 · 16210 阅读 · 2 评论 -
linux spi主机控制器pl022驱动注册以及匹配设备过程
最近看海思的spi比较多,海思3519的spi ip使用的时ARM提供的pl022,这里对pl022驱动注册和匹配设备树中的设备这个过程捋一下。pl022是ARM提供的片内外设,很多厂商都用了这个ip,只在一些细小的区别。所以它的驱动也是非常通用的。pl022的手册可以看这里点击打开链接我们需要首先了解amba总线。本段摘自https://blog.youkuaiyun.com/yuanlulu/articl...原创 2018-06-30 19:09:43 · 3905 阅读 · 0 评论 -
devm_xxx申请资源释放资源的流程
devm_xxx的函数是在申请资源,释放资源的一种补充,对于devm_xxx打头的申请资源的函数,在设备detach的时候会自动释放申请的资源。本文来看看devm_xxxx机制的实现首先在设备device结构体中,有一个devres_head链表,维护该设备所绑定的资源,在设备detach的时候,遍历这个链表,一个一个进行资源释放。struct device { ... spi...原创 2019-08-26 18:19:03 · 1405 阅读 · 0 评论 -
linux debugfs
1、概述内核开发者经常需要向用户空间应用输出一些调试信息,在稳定的系统中可能根本不需要这些调试信息,但是在开发过程中,为了搞清楚内核的行为,调试信息非常必要,printk可能是用的最多的,但它并不是最好的,调试信息只是在开发中用于调试,而printk将一直输出,因此开发完毕后需要清除不必要的printk语句,另外如果开发者希望用户空间应用能够改变内核行为时,printk就无法实现。因此,需要一...原创 2019-07-13 17:19:21 · 390 阅读 · 0 评论 -
linux reset框架
int main(){}原创 2019-06-04 21:03:04 · 6950 阅读 · 0 评论 -
内存映射与VMA
 一般情况下,用户空间是不能也不应该直接访问设备的,但是,设备驱动程序中可以实现mmap()函数,这个函数使得用户空间能直接访问设备的物理地址。实际上,mmap()实现了这样的一个映射过程:他将用户空间的一段内存与设备内存关联,当用户访问用户空间的这段地址范围时,实际上会转化为对设备的访问。῕这种能力对于显示适配器一类的设备非常有意义,如果用户空间可以直接通过...原创 2019-05-19 17:33:32 · 1453 阅读 · 0 评论 -
git自动补全
刚安装的git默认是没有自动补全功能,git源码提供了这样的脚本文件,只要在.bashrc中默认执行这个脚本就可以了,脚本名称为git-completion.bash.1、如果没有源码,可下载源码$ git clone git://git.kernel.org/pub/scm/git/git.git2、然后将该文件copy一下$ cp git/contrib/completio...原创 2019-03-06 11:07:52 · 1159 阅读 · 1 评论 -
查看ubuntu版本信息
一、查看操作系统是32位的还是64位的在控制台输入:sudo uname --m回车后:如果显示i686,则表示安装了32位操作系统如果显示 x86_64,则表示安装了64位操作系统二、查看操作系统的版本号:cat /etc/issue比如输出:Ubuntu 14.04.4 LTS \n \l三、查看系统类型,其中lsb表示(Linux Standard Base):...转载 2019-02-25 16:12:51 · 599 阅读 · 0 评论 -
链接器ld
链接器的作用是什么呢?还记得在Linux学习(十二)中gcc编译的过程吗?gcc编译分为四个过程:预编译、编译、汇编、链接链接是gcc编译的最后一步,就是把生成的所有可执行文件.o按照一定的规则合并成一个文件,而链接脚本就是这个规则文件。 1、重定位的概念链接生成的可执行文件虽然是放在文件中的,但当程序运行时需要加载到内存当中。各段应放在内存空间的什么位置是由可...原创 2018-12-01 17:14:00 · 2231 阅读 · 0 评论 -
工具集binutils
该文章主要参考大牛李云的博客http://blog.51cto.com/yunli/186727,自己写一写更有助于加深记忆1、addr2line,用程序地址得到对应的函数和行号。这个一般用在错误分析的时候,根据backtrace显示的代码地址,得到出错的行号和函数。一个简单的实例:#include <stdio.h>void go(){ pri...原创 2018-12-01 12:27:33 · 260 阅读 · 0 评论 -
Makefile中常用函数
Makefile常用函数总结1、realpath 返回一个绝对路径例:ROOT = $(realpath ./) 返回当前路径的绝对地址,赋值给ROOT2、wildcard 通配符函数,类似于linux中的 “*”命令格式:$(wildcard pattern)例子 :SRCS = $(wildcard *.c) 得到当前目录下的所有.c文件3、patsubst...原创 2018-12-01 11:36:21 · 1329 阅读 · 0 评论 -
MMU与cache(ARM920)
1、虚拟地址与物理地址 CPU通过地址来访问内存中的单元,地址有虚拟地址和物理地址之分,如果CPU没有MMU(Memory Management Unit,内存管理单元),或者有MMU但没有启用,CPU核在取指令或访问内存时发出的地址将直接传到CPU芯片的外部地址引脚上,直接被内存芯片(以下称为物理内存,以便与虚拟内存区分)接收,这称为物理地址(Physical Address,...原创 2018-11-04 22:32:22 · 927 阅读 · 0 评论 -
System V 与 POSIX通信
转自https://blog.youkuaiyun.com/firstlai/article/details/50705042System V 以及POSIX 对信号量、共享内存、消息队列等进程之间共享方式提供了自己的解决方案。因此,在学习时难免存在疑惑,到底有什么区别,哪种方式更佳。经过网上搜索各种博客,做出简单的总结。历史 UNIX两大贡献者贝尔实验室和BSD,在进程之间通信侧重不...转载 2018-09-10 18:19:24 · 326 阅读 · 0 评论 -
linux多线程之 线程数据TSD Thread Specific Data
在linux中,同一进程下所有线程是共享全局变量的,但有时候会有这样的需求,某一个线程想单独用于某个全局变量。这就有了TSD,Thread Specific Data。使用TSD时需要创建一个全局的键值,每个线程都通过键值来设置和获取自己所独有的全局变量。使用TSD分为以下几个步骤1、创建一个键值,key为一个键值,destructor是一个destructor函数,如果这个参数不...原创 2018-09-10 11:46:19 · 588 阅读 · 0 评论 -
线程调度与优先级
linux内核调度三种策略:1,SCHED_OTHER 分时调度策略,2,SCHED_FIFO实时调度策略,先到先服务3,SCHED_RR实时调度策略,时间片轮转分时进程则通过nice和counter值决定权值,nice越小,counter越大,被调度的概率越大,也就是曾经使用了cpu最少的进程将会得到优先调度。所以分时调度与优先级是无关的,在这种调度下,优先级是无法修改的,默认情...原创 2018-09-04 15:21:04 · 661 阅读 · 0 评论 -
驱动中动态创建设备号、设备节点
在Linux驱动(三)字符设备驱动框架中,我们简要介绍了如何编写一个简单的驱动框架,并总结了步骤1、生成设备号2、向内核注册该设备号3、初始化设备对象,完成操作方法集4、向内核注册该设备对象5、生成设备文件,供用户层调用。我们之前的步骤都是静态的,1、静态生成设备号,这样必须确保要申请的设备号是没有被占用的。我们可以让内核帮我们动态申请设备号,可以确保生成的设备号是原创 2018-01-06 14:44:41 · 3343 阅读 · 0 评论 -
编译linux内核时.config ,Kconfig, make menuconfig的联系
我们在编译linux内核时都会用到几个文件 .config文件 Kconfig文件 Makefile文件以及make menuconfig命令出现的菜单,那他们之间有什么联系呢?首先,Makefile文件不用多讲,这是linux内核的编译文件,使用make uImage或make zImage时就是用Makefile文件来编译的。对于make menuconfig来讲,这是一个菜单配置内核原创 2017-12-18 10:51:40 · 2035 阅读 · 0 评论 -
内核模块编译 makefile入门
转自http://blog.youkuaiyun.com/zqixiao_09/article/details/50838043一、模块的编译 我们在前面内核编译中驱动移植那块,讲到驱动编译分为静态编译和动态编译;静态编译即为将驱动直接编译进内核,动态编译即为将驱动编译成模块。而动态编译又分为两种:a -- 内部编译 在内核源码目录内编译转载 2017-12-19 10:37:29 · 3422 阅读 · 1 评论 -
Linux学习(二十八):数据库sqlite3
数据库sqlite3的详细知识参考http://www.runoob.com/sqlite/sqlite-create-database.html或官方网站http://www.sqlite.org/sqlite3的安装不做介绍,可以从上面的网站查询相关信息1、创建数据库 创建数据库的命令很简单 sqlite3 name.db创建一个名字为stu.db的数据库原创 2017-11-06 20:34:18 · 525 阅读 · 0 评论 -
Linux学习(九): C语言复习
C语言是Linux编程的基础,这里把C语言的知识复习一下,对于c语言基础知识不再提及,主要写一些容易出错的东西。1、指针 1.1 指针和数组一级指针与一维数组,将数组名赋值给指针后,操作指针就是操作数组。二级指针与二维数组,二维数组不能直接赋值给二级指针,因为二者指向的数据不同。二维数组名指向的是一维数组的地址。数组指针,指向数组变量的指针,格式: (*)[];原创 2017-09-08 11:10:53 · 404 阅读 · 2 评论 -
sqlite错误码
#define SQLITE_OK 0 /* 成功 | Successful result *//* 错误码开始 */#define SQLITE_ERROR 1 /* SQL错误 或 丢失数据库 | SQL error or missing database */#define SQLITE_INTERNAL 2 /* SQLite 内转载 2017-11-06 21:50:44 · 393 阅读 · 0 评论 -
Linux学习(十六):文件IO
1、UNIX文件基础1.1 UNIX输入输出1 文件描述符(1)顺序分配的非负整数(2)内核用以标识一个特定进程正在访问的文件(3)其他资源(socket、pipe)访问的标识2 标准输入stdin、标准输出stdout和标准出错stderr 这三项是shell默认打开的,对应的文件描述符分别是0/1/21.2 UNIX出错处理1.2.1 错误码errno原创 2017-09-24 20:35:30 · 473 阅读 · 0 评论 -
Linux学习(十):数据结构--表
本文讨论最简单最基本的一种数据结构:表。我们将处理一般的形如A1,A2,A3.....AN的表。这个表的大小为N。我们称大小为0的表为空表。1、表的简单数组实现对表的所有操作都可以通过数组来实现。我们假定数据量为10个,所以我们可以设置一个有10个元素的数组。同时为了表示数组的位置,再定义一个表示数组位置的变量#define N 10typedef int data_t;typedef str...原创 2017-09-12 10:49:44 · 628 阅读 · 1 评论 -
Linux学习(十七):动态库与静态库
1、静态库与动态库的区别1.1 静态库这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大--空间,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译1.2 动态库这类库的名字一般是libxxx...原创 2017-09-25 17:01:15 · 292 阅读 · 0 评论 -
Linux学习(十三):Makefile
Make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能构根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件文件的内容来执行大量的编译工作 。1、makefile基本结构在一个Makefile中通常包含以下内容:1、需要由make工具创建的目标体(target),通常是目标文件或可执行文件;· 2、要创建的目标体所依赖的文件(d...原创 2017-09-17 19:49:59 · 538 阅读 · 0 评论