Linux操作系统
文章平均质量分 86
Linux操作系统
留小乙
这个作者很懒,什么都没留下…
展开
-
Linux信号量以及互斥体
一、信号量简介相比于自旋锁,信号量可以使线程进入休眠状态,比如A与B、C合租了一套房子,这个房子只有一个厕所,一次只能一个人使用。某一天早上A去上厕所了,过了一会B也想用厕所,因为A在厕所里面,所以B只能等到A用来了才能进去。B要么就一直在厕所门口等着,等A出来,这个时候就相当于自旋锁。B也可以告诉A,让A出来以后通知他一下,然后B继续回房间睡觉,这个时候相当于信号量。可以看出,使用信号量会提高处理器的使用效率,毕竟不用一直傻乎乎的在那里“自旋”等待。但是,信号量的开销要比自旋锁大,因为信号量使线程进入休原创 2021-12-01 11:16:39 · 1323 阅读 · 0 评论 -
Linux其他类型锁
一、读写自旋锁现在有个学生信息表,此表存放着学生的年龄、家庭住址、班级等信息,此表可以随时被修改和读取。此表肯定是数据,那么必须要对其进行保护,如果现在使用自旋锁对其进行保护。每次只能一个读操作或者写操作,但是,实际上此表是可以并发读取的。只需要保证在修改此表的时候没人读取,或者在其他人读取此表的时候没有人修改此表就行了。也就是此表的读和写不能同时进行,但是可以多人并发的读取此表。像这样,当某个数据结构符合读/写或生产者/消费者模型的时候就可以使用读写自旋锁。读写自旋锁为读和写操作提供了不同的锁,一次只能原创 2021-11-30 15:52:21 · 947 阅读 · 0 评论 -
Linux并发与竞争
Linux是一个多任务操作系统,肯定会存在多个任务共同操作同一段内存或者设备的情况,多个任务甚至中断都能访问的资源叫做共享资源,就和共享单车一样。在驱动开发中要注意对共享资源的保护,也就是要处理对共享资源的并发访问。比如共享单车,大家按照谁扫谁骑走的原则来共用这个单车,如果没有这个并发访问共享单车的原则存在,只怕到时候为了一辆单车要打起来了。在Linux驱动编写过程中对于并发控制的管理非常重要。一、并发与竞争1、并发与竞争简介Linux系统是个多任务操作系统,会存在多个任务同时访问同一片内存区域,这些原创 2021-11-30 15:03:27 · 1420 阅读 · 0 评论 -
Linux新字符设备驱动
一、分配和释放设备号使用register_chrdev函数注册字符设备的时候只需要给定一个主设备号即可,但是这样会带来两个问题:①、需要事先确定好哪些主设备号没有使用。②、会将一个主设备号下的所有次设备号都使用掉,比如现在设置LED这个主设备号为200,那么0~1048575(2^20-1)这个区间的次设备号就全部都被LED一个设备分走了。这样太浪费次设备号了!一个LED设备肯定只能有一个主设备号,一个次设备号。解决这两个问题最好的方法就是要使用设备号的时候向Linux内核申请,需要几个就申请几原创 2021-11-27 11:27:33 · 1080 阅读 · 0 评论 -
Linux地址映射函数以及内存访问函数
一、地址映射先简单了解一下MMU这个神器,MMU全称叫做Memory Manage Unit,也就是内存管理单元。在老版本的Linux中要求处理器必须有MMU,但是现在Linux内核已经支持无MMU的处理器了。MMU主要完成的功能如下:①、完成虚拟空间到物理空间的映射。②、内存保护,设置存储器的访问权限,设置虚拟存储空间的缓冲特性。我们虚拟空间到物理空间的映射,也叫做地址映射。对于32位的处理器来说,虚拟地址范围是2^32=4GB,但物理内存却没有这么大,经过MMU可以将其映射到整个4GB的虚拟原创 2021-11-22 19:19:21 · 896 阅读 · 0 评论 -
Linux设备号
一、设备号的组成为了方便管理,Linux中每个设备都有一个设备号,设备号由主设备号和次设备号两部分组成,主设备号表示某一个具体的驱动,次设备号表示使用这个驱动的各个设备。Linux提供了一个名为dev_t的数据类型表示设备号,dev_t定义在文件include/linux/types.h里面,定义如下:typedef __u32 __kernel_dev_t;......typedef __kernel_dev_t dev_t;可以看出dev_t是__u32类型的,而__u32定义在文件incl原创 2021-11-19 17:48:00 · 896 阅读 · 0 评论 -
Linux设备具体操作函数
一、填充file_operations结构体file_operations结构体就是设备的具体操作函数,file_operations结构体类型的变量test_fops,但是还没对其进行初始化,也就是初始化其中的open、release、read和write等具体的设备操作函数。现在就来完成变量test_fops的初始化,设置好针对chrtest设备的操作函数。在初始化test_fops之前需要分析一下需求,也就是要对chrtest这个设备进行哪些操作,只有确定了需求以后才知道我们应该实现哪些操作函数。假原创 2021-11-19 17:30:01 · 704 阅读 · 0 评论 -
ARM Linux驱动开发简介
一、Linux驱动分类Linux的驱动主要分为三种,分别为字符设备驱动、块设备驱动、网络设备驱动。其中字符设备驱动是最多的一类驱动,因为字符设备最多,从最简单的点灯到I2C、SPI、音频等都属于字符设备驱动的类型。块设备和网络设备驱动要比字符设备驱动复杂。所谓的块设备驱动就是存储器设备的驱动,比如EMMC、NAND、SD卡和U盘等存储设备,因为这些存储设备的特点是以存储块为基础,因此叫做块设备。网络设备驱动就更好理解了,就是网络驱动,不管是有线的还是无线的,都属于网络设备驱动的范畴。一个设备可以属于多种设原创 2021-11-18 15:26:01 · 1656 阅读 · 0 评论 -
Linux驱动模块加载和卸载以及设备注册与注销
一、驱动模块的加载和卸载Linux驱动有两种运行方式,第一种就是将驱动编译进Linux内核中,这样当Linux内核启动的时候就会自动运行驱动程序。第二种就是将驱动编译成模块(Linux下模块扩展名为.ko),在Linux内核启动以后使用“insmod”命令加载驱动模块。在调试驱动的时候一般都选择将其编译为模块,这样修改驱动以后只需要编译一下驱动代码即可,不需要编译整个Linux代码。而且在调试的时候只需要加载或者卸载驱动模块即可,不需要重启整个系统。总之,将驱动编译为模块最大的好处就是方便开发,当驱动开发原创 2021-11-18 16:15:55 · 7362 阅读 · 1 评论 -
Linux文件系统
一、“/”根目录重要文件夹详解上图中列举出了根目录“/”下面的所有文件夹,这里仔细观察一下,当进入到根目录“/”里面以后终端提示符“ $ ”前面的符号“ ~ ”变成了“ / ”,这是因为当在终端中切换了目录以后“ $ ”前面就会显示切换以后的目录路径。来看一下根目录“ / ”中的一些重要的文件夹:/bin 存储一些二进制可执行命令文件,/usr/bin也存放了一些基于用户的命令文件。/sbin 存储了很多系统命令,/usr/sbin也存储了许多系统命令。/root 超级用户root的根目录文原创 2021-11-02 11:21:38 · 145 阅读 · 0 评论 -
VI/VIM编辑器
linux中最常用的编辑器就是vim编辑器。VIM编辑器是VI编辑器升级版本,VI/VIM编辑器都是一种基于指令式的编辑器,不需要鼠标,也没有菜单,仅仅使用键盘来完成所有的编辑工作需要先安装VIM编辑器,命令如下:sudo apt-get install vim一、输入模式安装完成以后就可以使用VIM编辑器了,VIM编辑器有3种工作模式:输入模式、指令模式和底行模式,通过切换不同的模式可以完成不同的功能。使用命令 vim test.txt新建文档,并且用VIM打开。试着在文本中输入数字,发现根本没法原创 2021-11-01 21:07:03 · 142 阅读 · 0 评论 -
Shell常用命令大全
嵌入式开发用的最多就是Shell命令,Shell命令是所有的Linux系统发行版所通用的,并不是说我在Ubuntu下学会了Shell命令,换另外一个Linux发行版操作系统以后就没用了,所以学习Shell命令非常有必要。1、目录信息查看命令文件浏览是最基本的操作了,Shell下文件浏览命令为ls,格式如下: ls [选项] [路径]Is命令主要用于显示指定目录下的内容,列出指定目录下包含的所有的文件以及子目录,它的主要参数有:-a显示所有的文件以及子目录,包括以“”开头的隐藏文件。-l原创 2021-11-01 20:37:08 · 28044 阅读 · 2 评论