复习总线设备驱动模型,做了一点小笔记,大牛略过。 一、Linux系统的驱动框架的基础很大一部分是围绕着总线设备驱动模型展开的。... struct bus_type *bus; // 该设备挂接在哪条总线上 struct device_driver*driver; //该设备所对应的驱动 void... }; 任何建立在平台总线设备驱动模型基础上的驱动代码(如平台驱动,PCI驱动,USB驱动,I2C驱动,SPI驱动等),它们的设备结构体(如platform_device, pci_dev,usb_device...device *dev) { device_initialize(dev); //做各类初始化 //将设备挂接在对应的总线上,主要工作把设备(device)添加到总线 (bus_type... int (*remove) (struct device*dev);// 指向设备移除函数 struct driver_private *p; }; 同理,任何建立在平台总线设备驱动模型基础上的驱动代码
Kobject是linux设备驱动模型的基础,也是设备模型中抽象的一部分。如果想了解设备驱动模型就需要明白Kobject的构成或原理。...linux内核为了兼容各种形形色色的设备,就需要对各种设备的共性进行抽象,抽象出一个基类,其余的设备只需要继承此基类就可以了。...而此基类就是kobject,但是C语言没有面向对象语法,这时候就需要将此基类(Kobject)嵌入到具体的结构体中,从而就可以访问控制此设备的操作。...#include #include #include #include #include #include #include
前言 linux将所有的驱动抽象为struct device_driver结构。这样设计可以方便驱动程序更好编写,在编写驱动的时候只需要将此结构嵌入到具体的驱动中即可。...bus: 设备驱动所属的总线 owner: 设备驱动的owner,通常为THIS_MODULE suppress_bind_attrs: 通过sysfs操作设备驱动的bind/unbind,...用来使能/关闭设备与驱动的自动匹配 of_device_id: device_tree中使用,用于匹配设备。...probe,remove: 当设备匹配/移除的时候,会调用设备驱动的probe/remove函数。 shutdown,suspend, resume: 代表设备驱动在调用管理的时候的回调函数。...和设备一样,内核也为设备驱动定义了一些驱动的宏属性,方便定义驱动属性。
#include #include #include #include #include #include #include static struct kobject kobj;
前言 在linux设备驱动模型中,总线可以看作是linux设备模型的核心,系统中的其他设备以及驱动都是以总线为核心围绕。不过驱动程序员在系统中创建一条总线的机会并不多。...驱动模型中的总线可以是真是存在的物理总线(USB总线,I2C总线,PCI总线),也可以是为了驱动模型架构设计出的虚拟总线(Platform总线)。...为此linux设备驱动模型都将围绕"总线--设备--驱动"来展开,因为符合linux设备驱动模型的设备与驱动都是必须挂载在一个总线上的,无论是实际存在的或者虚拟的。....dev_attrs: 此bus设备上默认的属性。 .bus_groups, dev_groups, drv_groups: 分别是总线, 设备,驱动的属性。....match: 当一个设备或者驱动添加到此总线上的时候,bus就会调用match对设备和驱动一一匹配的。
Linux 内核源码:include\linux\usb.h Linux 内核源码:drivers\hid\usbhid\usbmouse.c 1....BUS/DEV/DRV 模型 "USB 接口"是逻辑上的 USB 设备,编写的 usb_driver 驱动程序,支持的是"USB 接口": USB 控制器或 Hub 识别出 USB 设备后,会创建、...接口函数 在 USB 设备驱动程序中,能使用的 USB 函数都在这个头文件里:include\linux\usb.h。...2.1 pipe 使用这些接口函数的主要目的是传输数据,传输数据的对象是 USB 设备里的某个 endpoint,这被称为 pipe: /* Create various pipes... */ #define
前言 当一个设备动态的加入到系统时候(比如常见的将U盘插入到PC机器上), 设备驱动程序就需要动态的检测到有设备插入了系统,就需要将此事件通知到用户层,然后用户层对这一事件做响应的处理,比如加载USB驱动...Linux系统对uevent机制的具体实现是建立在设备模型的基础上的,通过kobject_uevent函数实现。 在前面的kset小节中提到了注册一个kset的接口,可以在这里习复下。...如果是嵌入式设备,会在etc目录下看到这样的配置: echo /sbin/mdev >/proc/sys/kernel/hotplug /sbin/mdev -s 也就是说uevent_helper最终调用到
前言 Linux将所有的设备统一抽象为struct device结构, 同时将所有的驱动统一抽象为struct device_driver结构。...数据结构 Linux将所有的设备统一抽象为struct device结构。...C: 关于总线先设备与驱动的匹配是设备驱动模型的核心 void bus_probe_device(struct device *dev) { struct bus_type *bus = dev->...put_device(parent); } 设备属性 linux中使用device_attribute结构体表示一个设备的属性 struct device_attribute { struct attribute...,最终会调用到设备的show和store函数中,具体的流程分析可见Linux设备驱动模型-Ktype static ssize_t dev_attr_show(struct kobject *kobj
coresight cpu event_source hid i2c iio mdio_bus mmc platform scsi sdio serio spi usb virtio workqueue 数据结构 linux
其实早在之前有一篇关于字符设备驱动的,讲的也是驱动led,大家可以回顾一下:Linux笔记(13)| 字符设备驱动基础入门 Linux笔记(14)| 字符设备驱动基础入门(续) 有朋友可能会产生疑问,...所以就有了今天的设备模型。在早期的Linux里面就是像上面那样做的,但是到后来设备越来越多,越来越复杂,维护起来非常不方便,于是发明了设备模型。 那么,设备模型是怎么一回事呢?...简单说设备模型就是让驱动代码分成两个部分,一部分是驱动,一部分是设备,驱动文件里有对设备的驱动,但是并不涉及具体硬件资源,硬件资源由设备文件提供,然后使用总线将两者联系起来。...要了解设备模型,我们需要先了解几个概念: 设备:设备就是一些物理设备,比如一个led就可以叫做一个设备; 驱动:与特定设备相关的软件,负责初始化该设备以及提供一些操作该设备的操作方式; 总线:将设备和驱动联系起来...今天主要是介绍了一下设备模型是什么,以及该如何套用设备模型来写驱动。但是今天并没有涉及具体硬件,也没有叙述太多操作细节。因为这个是框架性的东西,我们只需要从宏观上有一个认识就行了。
设备驱动模型的需求 总线、设备和驱动模型,如果把它们之间的关系比喻成生活中的例子是比较容易理解的。...设备和驱动就是基于这种模型去实现彼此隔离不相干的。这里,有的读者就要问了,高内聚、低耦合的软件模型理解,可设备和驱动为什么要采用这种模型呢?没错,好问题。...基于这种设计思想,Linux 把设备驱动分为了总线、设备和驱动三个实体,这三个实体在内核里的职责分别如下: ?...最底层是不同板子的板级文件代码,中间层是内核的总线,最上层是对应的驱动,现在描述板级的代码已经和驱动解耦了,这也是 Linux 设备驱动模型最早的实现机制,但随着时代的发展,就像是人类的贪婪促进了社会的进步一样...完美的 Linux 怎么会允许这样的事情存在,于是乎,设备树(DTS)就登向了历史舞台,下一篇内容将探讨设备树的实现原理和用法。 【部分内容整理于宋宝华老师课程】
Linux的设备模型是操作系统管理硬件设备的一种高级抽象,它不仅涉及到设备驱动程序的加载和卸载,还包括设备之间的关系、设备的状态管理以及与用户空间通信的机制。...理解Linux的设备模型对于应用开发人员来说至关重要,它有助于开发出更加稳定、高效的应用程序。1. 如何理解Linux的设备模型?...Linux的设备模型体现在几个关键方面:设备和驱动程序的注册:在Linux中,每当一个设备驱动程序被加载到系统中时,它会向内核注册自己能够管理的设备类型。...这个过程涉及到识别和初始化硬件设备,确保设备和相应的驱动程序能够正确匹配。设备树:Linux设备模型通过设备树(Device Tree)来描述设备之间的层次关系。...总结通过深入理解Linux的设备模型,应用开发人员不仅可以提高自己的开发效率,还能为用户带来更加流畅和稳定的使用体验。
目录 概念 IO模型 同步阻塞IO 同步非阻塞IO 多路复用IO 信号驱动IO 异步非阻塞IO 概念 谈论模型之前,先了解一下相关的概念知识,扩展一下深度。 IO如何交互呢?...IO模型 同步阻塞IO 概念:用户进程一旦发送请求,就一直处于等待状态,直至有数据返回。
一层地剥开我的心 你会发现 你会讶异 你是我 最压抑 最深处的秘密 如果你愿意一层一层 一层地剥开我的心 你会鼻酸 你会流泪 只要你能 听到我 看到我的全心全意 前言 使用过koa的小伙伴们都应该对洋葱模型有所了解...,koa的独特的中间件流程控制就是通过洋葱模型来实现的,那么洋葱模型是什么,又是如何实现的呢?...洋葱模型介绍 介绍 ?...上图是洋葱模型比较经典的一个图,通过这个图可以看到,洋葱模型就像一个洋葱一个,是分成多层的,而一个请求进入的时候,会从外到内依次经过每一层,到最内侧之后又从内到外依次经过每一次,而我们就可以在这每一层上面做自己需要做的操作...比如一个请求,在koa接收到请求的时候,首先需要鉴权,然后需要对请求参数解析等等,完成请求之后,需要处理异常,添加请求头等等操作,而这些操作就可以放到洋葱模型的每一层上面做处理。
目前Linux内核总共支持以下6种Namespace: IPC:隔离System V IPC和POSIX消息队列。 Network:隔离网络资源。 Mount:隔离文件系统挂载点。...Linux对Namespace的操作,主要是通过clone、setns和unshare这3个系统调用来完成的,clone创建新进程时,接收一个叫flags的参数,这些flag包括CLONE_NEWNS、...目前Linux内核总共支持以下6种Namespace,分别是IPC、Network、Mount、PID、UTS、User: IPC IPC也就是进程间通信,Linux下有多种进程间通信,比如socket...Network Network Namespace隔离网络资源,每个Network Namespace都有自己的网络设备、IP地址、路由表、/proc/net目录、端口号等。...每个Network Namespace会有一个loopback设备(除此之外不会有任何其他网络设备)。因此用户需要在这里面做自己的网络配置。
当”进程”收到一个致命信号(比如由于段错误收到SIGSEGV信号), 对应的这一组task_struct将全部退出; 6.等等(以上可能不够全); linux threads 在linux 2.6以前,...如果你不知道linux线程背后的故事,肯定会觉得遇到灵异事件了。...上面提到的两种线程库使用的都是内核级线程(每个线程都对应内核中的一个调度实体), 这种模型称为1:1模型(1个线程对应1个内核级线程);而NGPT则打算实现M:N模型(M个线程对应N个内核级线程),也就是说若干个线程可能是在同一个执行实体上实现的...不过, M:N的线程模型毕竟提供了这样一种手段, 可以让不需要并行执行的线程运行在一个内核级线程对应的若干个用户级线程上, 可以节省它们的切换开销....据说一些类UNIX系统(如Solaris)已经实现了比较成熟的M:N线程模型, 其性能比起linux的线程还是有着一定的优势.
编者注:cgroup从2.6.4引入linux内核主线,目前默认已启用该特性。...cgroups是Linux下控制一个(或一组)进程的资源限制机制,全称是control groups,可以对cpu、内存等资源做精细化控制,比如目前很多的Docker在Linux下就是基于cgroups...blkio 子系统,可以限制进程的块设备 io。 devices 子系统,可以控制进程能够访问某些设备。...Linux下的cgroups的数据结构图示如下: ?...VFS 是一个内核抽象层(通用文件模型),能够隐藏具体文件系统的实现细节,从而给用户态进程提供一套统一的 API 接口。
作者去年6月第一次遇到OOM现象,当时非常焦急。看见别人就想抱大腿,最后运维说他不懂java,最后怀着紧绷的心态查阅日志,最后在tomcat的启...
Java内存模型(JMM) 简介 Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果一致的机制及规范...为什么要有内存模型 现代的计算机有多级缓存 在CPU访问存储设备时,无论是存取数据抑或存取指令,都趋于聚集在一片连续的区域中,这就被称为局部性原理。...保证可见性 Java内存模型是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值的这种依赖主内存作为传递媒介的方式来实现的。...顺序一致性内存模型 1、一个线程中的所有操作必须按照程序的顺序来执行。(不管程序是否同步)所有线程都只能看到一个单一的操作执行顺序。...2、在顺序一致性内存模型中,每个操作都必须原子执行且立刻对所有线程可见。
cgroup 与组调度 linux内核实现了control group功能(cgroup,since linux 2.6.24),可以支持将进程分组,然后按组来划分各种资源。...linux内核中,传统的调度程序是基于进程来调度的(参阅《Linux 进程调度浅析》)。假设用户A和B共用一台机器,这台机器主要用来编译程序。...(参见《linux内核SMP负载均衡浅析》。近期会推送给大家) 组的调度策略 组调度的主要数据结构已经理清了,这里还有一个很重要的问题。...实时进程的组调度 从《Linux 进程调度浅析》一文可以看到,实时进程是对CPU有着实时性要求的进程,它的优先级是跟具体任务相关的,完全由用户来定义的。调度器总是会选择优先级最高的实时进程来运行。...而在这两个文件出现之前,实时进程的运行时间是没有限制的(就像《Linux 进程调度浅析》里面描述的那样),如果一直有处于TASK_RUNNING状态的实时进程,则普通进程会一直不能得到运行。
领取专属 10元无门槛券
手把手带您无忧上云