嵌入式Linux中文站

Linux设备驱动中的并发控制

阅读(266)

并发是多个执行单元同时 并行被执行。而并发的执行单元对共享资源(硬件资源和软件上的全局变量,静态变量)的访问很容易导致竞态。 主要的竞态有以下三种情况:对称多处理器(SMP)的多个CPU;单个CPU内进程与抢占它的进程;中断(硬中断,软中断,Tasklet 底半部)与

用户空间和内核空间通讯-Netlink 下

阅读(162)

关于Netlink多播机制的用法 在上一篇博文中我们所遇到的情况都是用户空间作为消息进程的发起者,Netlink还支持内核作为消息的发送方的情况。这一般用于内核主动向用户空间报告一些内核状态,例如我们在用户空间看到的USB的热插拔事件的通告就是这样的应用。 先说一下我们的目标,内核线程每个一秒钟往一个多播组里发送一条消息,然后用户空间所以加入了该组的进程都会收到这样的消息,并将消息内容打印出来。 Netlink地址结构体中的nl_groups是32位,也就是说每种Netlink协议最多支持32个多播组。如

用户空间和内核空间通讯- Netlink 中

阅读(336)

今天我们来动手演练一下Netlink的用法,看看它到底是如何实现用户-内核空间的数据通信的。我们依旧是在2.6.21的内核环境下进行开发。 在/usr/include/linux/netlink.h文件里包含了Netlink协议簇已经定义好的一些预定义协议: 点击(此处)折叠或打开 #define NETLINK_ROUTE0/*Routing/device hook*/ #define NETLINK_UNUSED1/*Unused number*/ #define NETLINK_USERSOCK2/

用户空间和内核空间通讯-Netlink 上

阅读(183)

导读 Alan Cox在内核1.3版本的开发阶段最先引入了Netlink,刚开始时Netlink是以字符驱动接口的方式提供内核与用户空间的双向数据通信;随后,在2.1内核开发过程中,Alexey Kuznetsov将Netlink改写成一个更加灵活、且易于扩展的基于消息通信接口,并将其应用到高级路由子系统的基础框架里。自那时起,Netlink就成了Linux内核子系统和用户态的应用程序通信的主要手段之一。 2001年,ForCES IETF委员会正式对Netlink进行了标准化的工作。Jamal Hadi

linux内核中的device mapper详解

阅读(333)

关于device mapper在内核中的架构信息在参考文档1,2中有很好的解释,在这里就不过多介绍,以下将详细的根据device mapper的代码解释device mapper机制。 一、 LVM简介 LVM2是Linux 下的逻辑卷管理器,它可以对磁盘进行分区等。但是我们这里用LVM主要是利用用户空间的device mapper 库以及它提供的 dmsetup 工具。 LVM的下载地址为:http://git.fedorahosted.org/git/lvm2.git。下载后在tools文件夹下会看到

Linux 内核中的 Device Mapper 机制

阅读(104)

本文结合具体代码对 Linux 内核中的 device mapper 映射机制进行了介绍。Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机制下,用户可以很方便的根据自己的需要制定实现存储资源的管理策略,当前比较流行的 Linux 下的逻辑卷管理器如 LVM2(Linux Volume Manager 2 version)、EVMS(Enterprise Volume Management System)、dmraid(Device Mapper

Linux下USB驱动详解(HOST)

阅读(306)

USB驱动分为两块,一块是USB的bus驱动,这个东西,Linux内核已经做好了,我们可以不管,我们只需要了解它的功能。形象的说,USB的bus驱动相当于铺出一条路来,让所有的信息都可以通过这条USB通道到达该到的地方,这部分工作由usb_core(drivers/usb/usb.c)来完成。当USB设备接到USB控制器接口时,usb_core就检测该设备的一些信息,如生产厂商的ID(VID)和产品的ID(PID),或者是设备所属的class、subclass跟protocol,以便确定应该调用哪一个驱动

linux内核驱动模块开发makefile实例解析

阅读(324)

以下是摘自网络上的一个经典的linux设备驱动的Makefile文件,以及详细的内容解释。此文件可以完成对大部分驱动的编译,使用时只需要稍加修改就可以了。 $( warning KERNELRELEASE = $( KERNELRELEASE ))ifeq ( $( KERNELRELEASE ),) KERNELDIR ?= /lib/modules /$(shell uname -r)/build PWD : = $( shell pwd) MYMOD : = hello modules: $( MA