- 博客(393)
- 资源 (7)
- 收藏
- 关注
原创 really_probe()函数
static int really_probe(struct device *dev, struct device_driver *drv){ int ret = -EPROBE_DEFER; int local_trigger_count = atomic_read(&deferred_trigger_count); bool test_...
2019-07-09 17:45:10
2201
转载 理解 (*(void (*)())0)()
1、铺垫在分析上面的语句前,我们先从简单的入手。先来区别和理解下面这两个定义。float *g(); 和 float (*h) ();直接上答案:由于( )结合的优先级别高于*,所以g先和后面的( )结合,构成一个函数,该函数的返回值是一个指向float 数的指针。同理,h是一个函数指针,它所指向的函数的返回值是一个浮点数。当我们知道如何声明一个给定类型的变量,那么不难得出...
2018-10-02 21:21:46
3188
原创 关于__init、__initdata和__exit、__exitdata的学习笔记
__init、__initdata和__exit、__exitdata介绍定义位于<linux/init.h>:这些宏定义的作用是告诉编译器将这些函数或者数据放入相应的section中,而在模块加载的阶段,.ko文件中的代码和数据的加载区域是根据section来加载的。比如:如果函数的定义中带有__init,那么这个函数的所有代码会被放入.init.text的section...
2018-09-30 11:21:10
2759
原创 kernel的启动过程,head.S到main.c
kernel的启动过程,head.S到main.c:head.S:head.S主要做的事情是处理u-boot传入的参数,具体如下:判断是否支持这个CPU 判断是否支持这个单板(对比机器ID 建立一级页表 使能MMU 跳到start_kernel函数下面具体分析这个流程:ENTRY(stext) setmode PSR_F_BIT | PSR_I_BIT | SVC_M...
2018-09-29 20:40:06
804
原创 struct list_head/LIST_HEAD以及LIST_HEAD_INIT/INIT_LIST_HEAD
仅仅为struct list_head相关的两个宏:#define LIST_HEAD_INIT(name) { &(name), &(name) }#define LIST_HEAD(name) \ struct list_head name = LIST_HEAD_INIT(name)static inline void INIT_LIST_HEAD...
2018-09-27 14:26:09
1961
原创 USB设备插拔检测
1)hub初始化时hub_wq = alloc_workqueue(“usb_hub_wq”, WQ_FREEZABLE, 0);INIT_WORK(&hub->events, hub_event)queue_work(hub_wq, &hub->events)–alloc_workqueue(“usb_hub_wq”, WQ_FREEZABLE, 0)此函数...
2018-09-21 13:33:07
915
原创 USB设备插拔检测
1)hub初始化时hub_wq = alloc_workqueue(“usb_hub_wq”, WQ_FREEZABLE, 0);INIT_WORK(&hub->events, hub_event)queue_work(hub_wq, &hub->events)–alloc_workqueue(“usb_hub_wq”, WQ_FREEZABLE, 0)此函数...
2018-09-20 17:26:29
1242
原创 mutex_init() / mutex_lock() / mutex_unlock()
请求1). 初始化互斥体 -- mutex_init();2). 获得互斥体 -- mutex_lock();3). 释放互斥体 -- mutex_unlock();1.mutex_init(), 注意mutex使用之前都需要先initvoid__mutex_init(struct mutex *lock, const char *name, struct lock_class...
2018-09-05 13:21:03
6639
原创 INIT_WORK的理解
#define INIT_WORK(_work, _func, _data) \do { \INIT_LIST_HEAD(&(_work)->entry); \(_work)->pending = 0; \PREPARE_WORK((_work), (_func), (_data)); \init_timer(&(_work)->timer); \}...
2018-08-27 13:59:07
16269
原创 kobject和sysfs
sysfs调用kobjecthome/disk1t/sprdroidp_trunk_k414_dev/kernel$ grep -nr kobject drivers/usb/drivers/usb/core/sysfs.c:822:static umode_t dev_string_attrs_are_visible(struct kobject *kobj,drivers/usb/core/s...
2018-07-12 11:16:32
397
原创 adb调试流程记录
diff --git a/drivers/usb/gadget/udc/core.c b/drivers/usb/gadget/udc/core.cindex d41d07a..fd3787e 100644--- a/drivers/usb/gadget/udc/core.c+++ b/drivers/usb/gadget/udc/core.c@@ -867,6 +867,7 @@ voi...
2018-06-18 19:33:36
939
原创 struct security_operations {}函数结构
aa/** * struct security_operations - main security structure * * Security hooks for program execution operations. * * @bprm_alloc_security: * Allocate and attach a security structure to
2017-10-31 15:22:01
1802
原创 为设备服务的文件系统sysfs--kobject和kset的关系
1 kobject 和 kset 的关系kset结构里面封装了一个kobject结构,同时包括一个链表头,属于这个kset的所有kobject都要链接到kset的链表头。2、kobject实例:总线的注册
2017-10-17 14:54:56
385
原创 为设备服务的文件系统sysfs--sysfs文件的读写
4.3 sysfs文件的读写 sysfs是在内存中存在文件系统,它的文件都只在内存中存在。因此 对文件的读写实际是对内存的读写,不涉及对硬盘的操作 4.3.1 读文件的过程的分析 a a申请内存页函数:fastcall unsigned long get_zeroed_page(gfp_t gfp_
2017-10-17 14:05:53
774
原创 为设备服务的文件系统sysfs--sysfs文件的打开操作
4.2 sysfs文件的打开操作4.2.1 real_lookup函数详解 a4.2.2 为文件创建inode结构4.2.3 为dentry结构绑定属性4.2.4 调用文件系统的open函数
2017-10-17 09:42:13
460
原创 为设备服务的文件系统sysfs--文件目录的创建
4.1 文件和目录的创建4.1.1 sysfs文件系统的初始化4.1.2 sysfs文件系统目录的创建4.1.3 普通文件的创建
2017-10-17 09:39:59
377
原创 通用块层和SCSI层--I/O的顺序控制 及 调度算法
11.3 I/O的控制顺序 内核使用barrier I/O概念来实现I/O的顺序。 指的是barrier I/O 之前的I/O必须执行完毕,然后在执行barrier I/O,而barrier I/O之后的 I/O必须在barrier I/O执行完毕之前才能执行,就像I/O中插入了一个栅栏。 11.4 I/O调度算法
2017-10-12 11:05:19
386
原创 通用块层和SCSI层--硬盘HBA抽象层
HBA---Host Bus Adapter 主机总线适配器 HBA 通常用来连接计算机内部总线 和 存储系统,用来接入硬盘的设备,如果是一个PCI设备,它既是一个PCI设备,同时支持SCSI硬盘或者ATA硬盘,它就是一个HBA设备。
2017-10-12 11:00:22
458
原创 文件系统读写--文件写过程代码分析
10.6 文件写过程代码分析1、generic_file_write函数2、generic_file_buffered_write函数3、获取文件块的物理块号
2017-10-12 10:30:58
531
原创 文件系统读写--读过程返回
10.5 文件读过程返回 文件通过mpage_bio_submit提交一个I/O。I/O通过什么返回?返回通过什么机制通知上层? 阻塞点设计
2017-10-12 10:10:16
433
原创 文件系统读写--文件读过程代码分析
10.4 文件读过程diam分析1、generic_file_read函数2、__generic_file_aio_read函数3、do_generic_file_read函数4、do_generic_mapping_read函数5、do_mpage_readpage函数6、block_read_full_page函数
2017-10-12 10:04:11
2102
原创 文件系统读写--page cache机制
10.1.1 buffer I/O 和 direct I/O10.1.2 buffer head 和 块缓存10.1.3 page cache的管理10.1.4 page cache的状态
2017-10-12 09:59:34
6378
1
原创 PCI总线---PCI设备扫描过程
8.2 PCI设备扫描过程8.2.1 扫描0号总线8.2.1 扫描总线上的PCI设备8.2.3 扫描多功能设备8.2.4 扫描单个设备8.2.5 扫描设备信息
2017-10-10 14:46:22
7110
原创 PCI总线---深入理解PCI总线
8.1 深入理解PCI总线8.1.1 PCI设备工作原理8.1.2 PCI总线域8.1.3 PCI资源管理器8.1.4 PCI配置空间读取和设置
2017-10-10 14:42:15
11128
原创 serio总线------虚拟键盘驱动--键盘中断
7.3 虚拟键盘驱动 上一节注册了一个input键盘设备,注册设备的同时需要找到 它的驱动。7.3.1 键盘区的的初始化7.3.2 与设备建立连接7.3.3 启动键盘设备7.3.4 输入设备和主机系统之间的事件7.4 键盘中断7.4.1 q40kbd设备的中断处理7.4.2 serio总线的中断处理7.4.3 驱动提供的中断处理
2017-10-10 00:20:01
444
原创 serio总线------向serio总线注册设备
从第5章的input 驱动的分析中,我们可以了解到驱动可以分成几个层次,驱动之间可以嵌套。和这种类型相似,总线也可以分为几个层次,一种类型的总线可以架构在另一种总线之上。 第6章platform总线驱动提供probe函数中,调用serio_register_port函数,引出总线嵌套的概念 以及在内核中占据极为重要的总线适配的概念。7.1 总线适配器 PCI总线 是连接CP
2017-10-09 09:53:49
1132
原创 platform总线--从设备找到驱动的过程
platform总线驱动的注册过程,和input设备 驱动注册过程很像,都是逐个遍历设备,检查是否和驱动匹配。 由此联想,platform总线加载设备的过程,应该也是遍历驱动,看是否和设备匹配。2.1 注册设备和总线注册设备使用的是 platform_device_add 函数---/driver/base/Platform.cint platform_device_ad
2017-09-29 11:03:30
561
原创 platform总线--驱动发现设备的过程
总线时物理存在,Linux系统提供了一种简单的总线flatform。 platform 不是物理存在的总线,而是逻辑概念。现代PC机提供了一条根总线(PCI 总线)管理设备,但是有些设备没有挂载在PCI总线上,不能由PCI总线管理,于是Linux内核虚拟了platform总线来统一管理这种设备。1、从驱动发现设备的过程 platform总线虽然简单,但有总线的通用功能。我
2017-09-29 09:30:04
669
原创 字符设备 和 input 设备--input设备架构
input设备本身是一个字符设备,input里面隐藏了众多的设备和驱动,input设备是 设备 和 驱动的封装。5.3.1 注册input设备的驱动 input_register_handler函数,作用是注册input设备的驱动,代码如下:/** * input_register_handler - register a new input handler * @h
2017-09-28 21:43:53
457
1
原创 字符设备 和 input 设备--input设备的注册
5.2 input设备的注册 input是一个虚拟的设备,在Linux系统中,键盘、鼠标、触摸屏 和 游戏杆 都要由input设备统一管理。 input设备是个字符设备,如何注册设备驱动,要 从input设备的初始化函数input_init开始。5.2.1 主从设备号 Linux系统通过设备号来区分不同的设备。设备号由两个部分组成: 主设备号 和 从设备号下面摘录了系统定
2017-09-28 15:52:38
1938
原创 字符设备 和 input 设备--文件如何变成设备
Linux操作系统把设备划分为字符设备和块设备【网络设备是单独一种类型】。 很多情况下把字符设备 当 系统控制的一种手段,通过字符设备的I/O control 函数与内涵 进行交换数据。 实际上,Linux内核系统很多时候是把字符设备当做一个框架来使用。5.1 文件如何变成设备 回顾aufs系统,通过aufs_get_inode为每个文件创建它的inode对象。对文件和目录
2017-09-28 09:58:23
912
原创 kmem_cache_create函数的源码分析
kmem_cache_create函数的源码如下:/** * kmem_cache_create - Create a cache. * @name: A string which is used in /proc/slabinfo to identify this cache. * @size: The size of objects to be created in this c
2017-09-27 15:44:26
1636
3
原创 sysfs系统--文件和目录的创建
sysfs是Linux的特殊文件系统,这个文件系统主要作用是在用户态展示设备的信息。 Linux计算机系统中,可以在根目录下面找到sys目录,这个目录就是利用sysfs文件系统进行创建的。 打开sys目录,可以看到设备的分类显示,如下所示:yxf@yxf-PC:sys$ lsblock bus class dev devices firmware fs hyper
2017-09-27 13:55:19
1432
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人