摘要:
inode和block概述 文件是存储在硬盘上的,硬盘的最小存储单位叫做扇区sector,每个扇区存储512字节。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个块block。这种由多个扇区组成的块,是文件存取的最小单位。块的大小,最常见的是4 阅读全文
摘要:
设备号设计原则 一般一个主设备号的一段连续子设备号共用一个驱动,称为cdev实例,所以有主设备号和子设备号之分 struct cdev { struct kobject kobj; struct module *owner; const struct file_operations *ops; st 阅读全文
摘要:
为什么要用INPUT子系统 不采用input子系统,如果自己实现按键字符驱动,需要自己申请设备号,注册字符设备,实现file_operations接口,创建设备节点,实现阻塞、非阻塞、复用IO、异步通知,INPUT 子系统还统一定义了不同输入设备上报数据的格式。 在输入设备中会有以下几个问题: a. 阅读全文
摘要:
struct bus_type { const char *name; ...... struct subsys_private *p; }; struct class { const char *name; struct module *owner; ...... struct subsys_pr 阅读全文
摘要:
每个设备都有一个 uevent 属性文件,里面有设备号和设备名,此文要讲的是 uevent 事件,非 uevent 属性文件 kobject有事件需要上报时,会发送uevent事件,可以通过两个途径把事件上报到用户空间:一种是通过kmod模块,直接调用用户空间的可执行文件;另一种是通过netlink 阅读全文
摘要:
一个驱动可以支持多个设备;一个设备只能绑定一个驱动 platform总线上有设备链表和驱动链表,注册设备会遍历总线上的驱动链表找寻与之匹配的驱动,注册驱动会遍历总线上的设备链表找寻与之匹配的设备 匹配调用过程 注册设备: device_add ... bus_probe_device device_ 阅读全文
摘要:
platform_device 的创建 主要有两种方式 (1)在内核初始化时通过device_node转换为platform_device,这种是最新的实现方式,基于设备树,在内核初始化时将设备树中的节点转化为platform_device; of_platform_default_populate 阅读全文
摘要:
kernel_init(); kernel_init_freeable(); do_basic_setup(); driver_init(); platform_bus_init(); platform总线的注册就是在 /sys 文件下建立对应的文件夹和属性文件,并为全局变量 platform_bu 阅读全文
摘要:
list_head,这是linux中通用的链表形式,双向循环链表,功能强大,实现简单优雅。可如果您认为list_head就是链表的极致,应该在linux链表界一统天下,那可就错了。据我所知,linux内核代码中至少还有两种链表能占有一席之地。一种就是hlist,一种就是本节要介绍的klist。虽然三 阅读全文
摘要:
1、前言 对于任何一个指针来说,必然有三种情况:一种是有效指针,一种是NULL,也就是空指针,一种是错误指针,也就是无效指针,在Linux内核中,所谓的错误指针就是指其已经到达了内核空间的最后一个page,例如,对于32bit的系统来说,内核空间最后地址为0xFFFF FFFF,那么最后一个page 阅读全文