Linux 内核文件系统模块结构体关系图

1 篇文章 0 订阅
1 篇文章 0 订阅

导言

很久没有更新csdn博客了,工作两年,学习了不少新东西,很多都没有来的及整理,用过不久很快就忘记了,写到博客中做个记录。

关系图

下图为去年学习文件系统时所画,有参考网上其他博主的资料,也有自己整理,如果有大佬发现不正确的地方欢迎指正,一定及时回复并更正。
请添加图片描述

关系图使用方式

我们可以根据关系图梳理出各个结构之间的关系,然后在实践环境中进行验证。

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/fs_struct.h>
#include <linux/path.h>
#include <linux/sched.h>
#include <linux/dcache.h>
#include <linux/list.h>

//模块许可证声明(必须)
MODULE_LICENSE("GPL");
//模块加载函数(必须)
static int test_dentry_init(void)
{
    //获取当前文件的入口目录
    struct dentry *dentry_pwd = current->fs->pwd.dentry;

    // 获取当前文件的上一级入口目录
    struct dentry *dentry_parent = current->fs->pwd.dentry->d_parent;

    // 获取当前文件的入口目录名结构体
    struct qstr name = current->fs->pwd.dentry->d_name;


    //显示父目录名称
    printk("The name of dentry_parent is %s\n", dentry_parent->d_name.name);

    //判断父子目录项对应super_block是否一样
    printk("dentry_parent->d_sb = %p, dentry_pwd->d_sb = %p\n", dentry_parent->d_sb, dentry_pwd->d_sb);

    struct dentry *dentry=NULL;
    // 分配一个目录项缓存结构体
    dentry = d_alloc(dentry_parent, &name);

    // 显示当前文件名
    printk("The name of current dentry is %s\n", dentry_pwd->d_name.name);

    // 显示返回结果文件名
    printk("After \"d_alloc\" the name of the dentry is %s\n", dentry->d_name.name);

    //判断d_alloc是否有对dentry的d_hash项和d_lru项进行初始化
    printk("dentry.d_hash is unhashed: %d, dentry.d_lru is NULL: %d\n", d_unhashed(dentry), dentry->d_lru.next == NULL);

    
    //遍历current dentry的子目录项链表
    struct dentry *tmp = NULL;
    int i = 0;
    if(!spin_trylock(&dentry_parent->d_lockref.lock)){
	printk("try lock fail\n");
        return 1;    
    }
    list_for_each_entry(tmp, &dentry_parent->d_subdirs, d_child){
	/*排除掉负状态的dentry,未添加这个判读的时候
        会将很多inode为空的dentry name打印出来数量有
	上千个甚至更多个,所以就可以理解为什么dentry
	在路径查找的时候会借助dentry_hashtable了*/
	if(tmp->d_inode == NULL)   
		continue;
	if(!spin_trylock(&tmp->d_lockref.lock)){
            printk("try lock fail\n");
            return 1;
        }

        printk("dentry_parent's child%d name is: %s\n", i++, tmp->d_name.name);
	
	spin_unlock(&tmp->d_lockref.lock);
    }
    spin_unlock(&dentry_parent->d_lockref.lock);

    return 0;
}
//模块卸载函数(必须)
static void test_dentry_exit(void)
{
    printk(KERN_INFO "Hello World exit/n");
}

module_init(test_dentry_init);
module_exit(test_dentry_exit);
obj-m += test_dentry.o
#generate the path
CURRENT_PATH:=$(shell pwd)
#the current kernel version number
LINUX_KERNEL:=$(shell uname -r)
#the absolute path
LINUX_KERNEL_PATH:=/usr/src/kernels/$(LINUX_KERNEL)
#complie object
all:
	make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
#clean
clean:
	make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean

运行结果

在这里插入图片描述

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
[14本经典Android开发教程] 8 Linux内核阅读心得体会 读核感悟 2 读核感悟 Linux内核启动 内核的生成 2 读核感悟 Linux内核启动 从hello world说起 3 读核感悟 Linux内核启动 BIOS 5 读核感悟 Linux内核启动 setup辅助程序 6 读核感悟 Linux内核启动 内核解压缩 8 读核感悟 Linux内核启动 开启页面映射 9 读核感悟 Linux内核启动 链接脚本 11 读核感悟 伪装现场 系统调用参数 13 读核感悟 伪装现场 fork 系统调用 15 读核感悟 伪装现场 内核线程: 17 读核感悟 伪装现场 信号通信 19 读核感悟 kbuild系统 内核模块的编译 22 读核感悟 kbuild系统 编译到内核和编译成模块的区别 24 读核感悟 kbuild系统 make bzImage的过程 26 读核感悟 kbuild系统 make menuconfig 31 读核感悟 文件系统 用C来实现面向对象 32 读核感悟 设计模式 用C来实现虚函数表和多态 32 读核感悟 设计模式 用C来实现继承和模板 33 读核感悟 设计模式 文件系统和设备的继承和接口 34 读核感悟 设计模式 文件系统与抽象工厂 36 读核感悟 阅读源代码技巧 查找定义 37 读核感悟 阅读源代码技巧 变量命名规则 42 读核感悟 内存管理 内核中的页表映射总结 43 读核感悟 健壮的代码 exception table 内核中的刑事档案 44 读核感悟 定时器 巧妙的定时器算法 45 读核感悟 内存管理 page fault处理流程 45 读核感悟 文件读写 select实现原理 47 读核感悟 文件读写 poll的实现原理 49 1 功能介绍: 49 2 关键的结构体: 49 3 poll的实现 49 4 性能分析: 50 读核感悟 文件读写 epoll的实现原理 50 1 功能介绍 50 2 关键结构体: 51 3 epoll create的实现 53 4 epoll ctl的实现 53 5 epoll wait的实现 54 6 性能分析 54 读核感悟 同步问题 同步问题概述 55 1 同步问题的产生背景 55 2 内核态与用户态的区别 55 读核感悟 同步问题 内核态自旋锁的实现 56 1自旋锁的总述 56 2非抢占式的自旋锁 56 3 锁的释放 57 4 与用户态的自旋锁的比较 57 5 总结 58 读核感悟 内存管理 free命令详解 58 读核感悟 文件读写 2 6 9内核中的AIO 59 1 AIO概述 59 2 内核态AIO的使用 61 读核感悟 文件读写 内核态AIO相关结构体 61 1 内核态AIO操作相关信息 61 2 AIO上下文: 63 3 AIO ring 63 4 异步I O事件的返回信息 64 读核感悟 文件读写 内核态AIO创建和提交操作 65 1 AIO上下文的创建 io setup 65 2 AIO请求的提交:io submit实现机制 66 读核感悟 文件操作 AIO操作的执行 66 1 在提交时执行AIO 66 2 在工作队列中执行AIO 66 3 负责AIO执行的核心函数aio run iocb 67 4 AIO操作的完成 67 读核感悟 文件读写 内核态是否支持非direct I O方式的AIO 67 已上传7本: [14本经典Android开发教程] 1 Android开发从入门到精通 http: download csdn net detail cleopard 8355245 [14本经典Android开发教程] 2 Android开发手册 API函数详解 http: download csdn net detail cleopard 8374487 [14本经典Android开发教程] 3 Android SDK 中文开发文档 http: download csdn net detail cleopard 8380429 [14本经典Android开发教程] 4 Android应用程序开发36技 http: download csdn net detail cleopard 8380495 [14本经典Android开发教程] 5 linux Android基础知识总结 http: download csdn net detail cleopard 8380529 [14本经典Android开发教程] 6 Android驱动开发入门及手机案例开发分析教程 http: download csdn net detail cleopard 8388019 [14本经典Android开发教程] 7 Android编程入门教程 http: download csdn net detail cleopard 8388043 剩余8本稍后上传 @或直接从这里寻找@ http: download csdn net user cleopard album @更多@ http: cleopard download csdn net 福利 http: xuemeilaile com 17份软件测试文档 http: download csdn net album detail 1425 13份WPF经典开发教程 http: download csdn net album detail 1115 C#资料合辑二[C#桌面编程入门篇] http: download csdn net album detail 957 C#资料合辑一[C#入门篇] http: download csdn net album detail 669 [Csharp高级编程 第6版 ] 共8压缩卷 http: download csdn net album detail 667 10个[精品资源]Java学习资料合辑[一] http: download csdn net album detail 663 10个C#Socket编程代码示例 http: download csdn net album detail 631 6份GDI+程序设计资源整合[全零分] http: download csdn net album detail 625 2014年移动游戏行业数据分析 http: download csdn net detail cleopard 8340331 一文读懂2014年全球互联网广告新生态 http: download csdn net detail cleopard 8340303">[14本经典Android开发教程] 8 Linux内核阅读心得体会 读核感悟 2 读核感悟 Linux内核启动 内核的生成 2 读核 [更多]
linux系统下USB键盘驱动源码+使用文档说明 如何编写Linux下的USB键盘驱动 1. 指定USB键盘驱动所需的头文件: #include /*内核头文件,含有内核一些常用函数的原型定义*/ #include /*定义内存分配的一些函数*/ #include /*模块编译必须的头文件*/ #include /*输入设备相关函数的头文件*/ #include /*linux初始化模块函数定义*/ #include /*USB设备相关函数定义*/ 2. 定义键盘码表数组: /*使用第一套键盘扫描码表:A-1E;B-30;C-2E…*/ static unsigned char usb_kbd_keycode[256] = { 0, 0, 0, 0, 30, 48, 46, 32, 18, 33, 34, 35, 23, 36, 37, 38, 50, 49, 24, 25, 16, 19, 31, 20, 22, 47, 17, 45, 21, 44, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 28, 1, 14, 15, 57, 12, 13, 26, 27, 43, 43, 39, 40, 41, 51, 52, 53, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 87, 88, 99, 70,119,110,102,104,111,107,109,106, 105,108,103, 69, 98, 55, 74, 78, 96, 79, 80, 81, 75, 76, 77, 71, 72, 73, 82, 83, 86,127,116,117,183,184,185,186,187,188,189,190, 191,192,193,194,134,138,130,132,128,129,131,137,133,135,136,113, 115,114, 0, 0, 0,121, 0, 89, 93,124, 92, 94, 95, 0, 0, 0, 122,123, 90, 91, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 42, 56,125, 97, 54,100,126,164,166,165,163,161,115,114,113, 150,158,159,128,136,177,178,176,142,152,173,140 }; 3. 编写设备ID表: static struct usb_device_id usb_kbd_id_table [] = { { USB_INTERFACE_INFO(3, 1, 1) },/*3,1,1分别表示接口类,接口子类,接口协议;3,1,1为键盘接口类;鼠标为3,1,2*/ { } /* Terminating entry */ }; MODULE_DEVICE_TABLE (usb, usb_kbd_id_table);/*指定设备ID表*/ 4. 定义USB键盘结构体: struct usb_kbd { struct input_dev *dev; /*定义一个输入设备*/ struct usb_device *usbdev;/*定义一个usb设备*/ unsigned char old[8]; /*按键离开时所用之数据缓冲区*/ struct urb *irq/*usb键盘之中断请求块*/, *led/*usb键盘之指示灯请求块*/; unsigned char newleds;/*目标指定灯状态*/ char name[128];/*存放厂商名字及产品名字*/ char phys[64]
读核感悟-Linux内核启动-内核的生成...........................................2 读核感悟-Linux内核启动-从hello world说起...................................3 读核感悟-Linux内核启动-BIOS.................................................5 读核感悟-Linux内核启动-setup辅助程序........................................6 读核感悟-Linux内核启动-内核解压缩...........................................8 读核感悟-Linux内核启动-开启页面映射.........................................9 读核感悟-Linux内核启动-链接脚本............................................11 读核感悟-伪装现场-系统调用参数.............................................13 读核感悟-伪装现场-fork()系统调用...........................................15 读核感悟-伪装现场-内核线程:...............................................17 读核感悟-伪装现场-信号通信.................................................19 读核感悟-kbuild系统-内核模块的编译.........................................22 读核感悟-kbuild系统-编译到内核和编译成模块的区别...........................24 读核感悟-kbuild系统-make bzImage的过程.....................................26 读核感悟-kbuild系统-make menuconfig........................................31 读核感悟-文件系统-用C来实现面向对象........................................32 读核感悟-设计模式-用C来实现虚函数表和多态..................................32 读核感悟-设计模式-用C来实现继承和模板......................................33 读核感悟-设计模式-文件系统和设备的继承和接口...............................34 读核感悟-设计模式-文件系统与抽象工厂.......................................36 读核感悟-阅读源代码技巧-查找定义...........................................37 读核感悟-阅读源代码技巧-变量命名规则.......................................42 读核感悟-内存管理-内核中的页表映射总结.....................................43 读核感悟-健壮的代码-exception table-内核中的刑事档案.......................44 读核感悟-定时器-巧妙的定时器算法...........................................45 读核感悟-内存管理-page fault处理流程.......................................45 读核感悟-文件读写-select实现原理...........................................47 读核感悟-文件读写-poll的实现原理...........................................49 1 功能介绍:.............................................................49 2 关键的结构体:.........................................................49 3 poll的实现.............................................................49 4 性能分析:.............................................................50 读核感悟-文件读写-epoll的实现原理..........................................50 1 功能介绍...............................................................50 2 关键结构体:...........................................................51 3 epoll_create的实现.....................................................53 4 epoll_ctl的实现........................................................53 5 epoll_wait的实现.......................................................54 6 性能分析...............................................................54 读核感悟-同步问题-同步问题概述.............................................55 1 同步问题的产生背景.....................................................55 2 内核态与用户态的区别...................................................55 读核感悟-同步问题-内核态自旋锁的实现.......................................56 1自旋锁的总述............................................................56 2非抢占式的自旋锁........................................................56 3 锁的释放...............................................................57 4 与用户态的自旋锁的比较.................................................57 5 总结...................................................................58 读核感悟-内存管理-free命令详解.............................................58 读核感悟-文件读写-2.6.9内核中的AIO.........................................59 1 AIO概述................................................................59 2 内核态AIO的使用.......................................................61 读核感悟-文件读写-内核态AIO相关结构体......................................61 1 内核态AIO操作相关信息.................................................61 2 AIO上下文:............................................................63 3 AIO ring...............................................................63 4 异步I/O事件的返回信息.................................................64 读核感悟-文件读写-内核态AIO创建和提交操作..................................65 1 AIO上下文的创建-io_setup().............................................65 2 AIO请求的提交:io_submit实现机制......................................66 读核感悟-文件操作-AIO操作的执行............................................66 1.在提交时执行AIO........................................................66 2.在工作队列中执行AIO....................................................66 3.负责AIO执行的核心函数aio_run_iocb.....................................67 4 AIO操作的完成..........................................................67 读核感悟-文件读写-内核态是否支持非direct I/O方式的AIO.....................67
抱歉,我无法提供片或表。但是,我可以为您提供有关Linux内核系统模块结构体关系的一些基本信息。 在Linux内核中,系统模块是一种可加载的代码,可以动态地添加到内核中,以提供特定的功能。这些模块可以独立地编译和加载,从而增强了内核的灵活性和可扩展性。 系统模块结构体关系主要体现在模块的源代码中。以下是一些常见的结构体和它们之间的关系: 1. `module`结构体:这是Linux内核中表示一个系统模块的主要结构体。它包含了模块的各种属性和方法,例如模块的名称、初始化函数、清理函数等。 2. `list_head`结构体:这是Linux内核中用于链接各个模块结构体模块之间通过`list_head`结构体形成链表,以便进行遍历和管理。 3. `module_init()`和`module_exit()`函数:这些函数是由系统模块定义的初始化和清理函数。它们用于在模块加载和卸载时执行相应的操作。 4. `EXPORT_SYMBOL()`宏:这个宏用于将模块中的符号(如函数、变量)导出,以便其他模块内核可以使用。 这些结构体和函数之间的关系可以根据具体的模块内核版本而有所不同。此外,内核还包含了其他用于管理和加载模块结构体和函数,例如`request_module()`函数用于请求加载指定的模块。 请注意,这只是一个概述,实际的内核模块结构可能更加复杂。如果您对特定的模块内核版本有更具体的问题,我可以尝试为您提供更详细的信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值