摘要:
一、互斥锁(mutex) 1.1 什么是互斥锁 互斥锁实现了“互相排斥”(mutual exclusion)同步的简单形式,所以名为互斥锁。互斥锁禁止多个进程同时进入受保护的代码“临界区”(critical section)。因此,在任意时刻,只有一个进程被允许进入这样的代码保护区。 mutex的语 阅读全文
摘要:
一、自旋锁(spinlock) 1.1 什么是自旋锁 自旋锁(spinlock)是一种典型的对临界资源进行互斥访问的手段,其名称来源于它的工作方式。自旋锁和信号量的主要区别在于,如果进程没有获取到自旋锁,就一直循环在那里看是否该自旋锁的保持者已经释放了锁。 自旋锁的实现有多种:比如CAS和ticke 阅读全文
摘要:
一、原子操作 在之前介绍信号量的实现原理中,我们已经了解到获取信号量的操作会导致进程的休眠,也就是存在进程的切换,这样会带来很大的系统开销。 针对单个变量的独占访问我们可以采用原子锁的方式来实现进程的同步。原子锁采用原子操作来实现。 1.1 什么是原子操作 原子操作,顾名思义,就是说像原子一样不可再 阅读全文
摘要:
一、信号量(semaphore) 1.1 什么是信号量 信号量本质上是一个计数器,它用来记录对某个资源的存取状态。一般来说,为了获取共享资源,进程需要执行下列操作: 测试控制该资源的信号量; 如果信号量的值为正,则允许操作该资源,并且信号量值减1; 如果信号量为0,则资源目前不可用,进程进入休眠状态 阅读全文
摘要:
一、Linux进程内存空间 1.1 内核空间和用户空间 Linux采用两级保护机制:0级供内核使用、3级供用户程序使用。在32位Linux操作系统中,每个进程都有各自的私有用户空间(0~3GB),这个空间对系统中的其它进程是不可见的,最高的1GB虚拟内核空间为所有进程以及内核所共享。 针对linux 阅读全文
摘要:
在上一节中我们介绍了linux下的五种IO模型: 阻塞IO; 非阻塞IO; IO多路复用模型; 信号驱动IO模型; 异步IO; 并介绍了poll机制在按键驱动中的使用,这一节我们将重点介绍信号驱动IO模型如何在按键驱动的例子中的使用。 一、信号驱动IO模型 1.1 什么是信号驱动IO模型 我们举个例 阅读全文
摘要:
一、Linux IO模型 1.1 按键测试程序存在的问题 上一小节写到的中断方式获取按键值时,应用程序不停的查询是否有按键发生改变,大部分时间程序都处在read休眠的那个位置。 #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> i 阅读全文
摘要:
一、按键硬件资源 1.1 硬件接线 查看Mini2440原理图、S3C2440数据手册,了解如何读取按键的状态。这里粗略介绍一下Mini2440 K1~K6的接线方式,以及寄存器的设置,这里简单说一下,就不具体介绍了: K1~K6依次对应引脚GPG0、GPG3、GPG5、GPG6、GPG7、GPG1 阅读全文
摘要:
我们在linux驱动基础概念这一节中粗略介绍了linux驱动的概念,以及应用程序是如何调用驱动程序的。 这一节我们将一点亮LED为例来介绍字符设备驱动的编写。 一、LED硬件资源 1.1 硬件接线 查看Mini2440原理图、S3C2440数据手册,了解如何点亮LED。在Mini2440裸机开发之点 阅读全文
摘要:
在Mini2440之linux内核移植文章中我们介绍了linux内核移植。并将最终修改后的内核代码保存到/work/sambashare/linux-5.2.8路径下。后续所有驱动也都将在这里修改。 root@zhengyang:/work/sambashare# ll drwxrwxr-x 25 阅读全文