LinuxZone

LinuxZone.net
Linux系统网——精选每一篇高品质的技术干货
  1. 首页
  2. 开源快讯
  3. 正文

一些关于Linux内核中常用的结构体函数指针的理解动机

2023年8月5日 148点热度

一些关于Linux内核中常用的结构体函数表针的理解动机

在看linux内核代码的时侯常常就能看见一些结构体上面的成员跟我们往年见的到一些结构体不一样,常见的构架体如下边的代码:

struct a{
    int i;
    char b;
    struct c;
};

而内核中又见有这样的一些结构体:

const struct a{
    .a  = read,
    .b  = write,
    };

这些结构体我甚少见,但是好多书籍上没有见过这样的结构体,搜索了一些资料,写下一些对这种结构体的理解

事例

首先放上三段代码作为一个反例

先放上第一段代码:

struct address_space_operations {
    int (*writepage)(struct page *page, struct writeback_control *wbc);
    int (*readpage)(struct file *, struct page *);
    /* Write back some dirty pages from this mapping. */
    int (*writepages)(struct address_space *, struct writeback_control *);
    /* Set a page dirty.  Return true if this dirtied it */
    int (*set_page_dirty)(struct page *page);
    int (*readpages)(struct file *filp, struct address_space *mapping,
            struct list_head *pages, unsigned nr_pages);
    int (*write_begin)(struct file *, struct address_space *mapping,
                loff_t pos, unsigned len, unsigned flags,
                struct page **pagep, void **fsdata);
    int (*write_end)(struct file *, struct address_space *mapping,
                loff_t pos, unsigned len, unsigned copied,
                struct page *page, void *fsdata);
    /* Unfortunately this kludge is needed for FIBMAP. Don't use it */
    sector_t (*bmap)(struct address_space *, sector_t);
    void (*invalidatepage) (struct page *, unsigned int, unsigned int);
    int (*releasepage) (struct page *, gfp_t);
}

这是第二段代码:

const struct address_space_operations v9fs_addr_operations = {
    .readpage = v9fs_vfs_readpage,
    .readpages = v9fs_vfs_readpages,
    .set_page_dirty = __set_page_dirty_nobuffers,
    .writepage = v9fs_vfs_writepage,
    .write_begin = v9fs_write_begin,
    .write_end = v9fs_write_end,
    .releasepage = v9fs_release_page,
    .invalidatepage = v9fs_invalidate_page,
    .launder_page = v9fs_launder_page,
    .direct_IO = v9fs_direct_IO,
};

这是第三段代码:

static int v9fs_vfs_readpage(struct file *filp, struct page *page)
{
    return v9fs_fid_readpage(filp->private_data, page);
}

首先,我们可以看见,我们常见的那个结构体方式就是第二段代码中的这些方式。而看懂这些方式就是我们这个文章的目的。

linux内核源码结构_linux源码结构_linux源码剖析

我们先须要晓得的是,这个结构体上面的东西是函数表针,也就是说,这个成员的变量是跟函数有关的。

我们先看第二段代码,第二段代码不仅上面的东西以外,外边的那层还是我们熟悉的东西:结构体

const struct address_space_operations v9fs_addr_operations

听到这个,我们其实晓得了v9fs_addr_operations是类型为结构体address_space_operations的变量。

好了linux源码结构,如今我们晓得v9fs_addr_operations的类型是结构体address_space_operations,那我们就瞧瞧第一段代码:

第一段代码上面,我们看见了好多申明,比如

int (*readpage)(struct file *, struct page *);

这儿就是申明了结构体中address_space_operations的一个readpage的函数表针,说明了结构体address_space_operations中有一个名为readpage的,入参为(structfile*,structpage*)的一个函数。

至此,我们就晓得了这个结构体上面的申明是咋回事了。

之后我们再看回第二段代码,这时我们就晓得了v9fs_addr_operations中的readpage是指向函数v9fs_vfs_readpage的了。并且v9fs_vfs_readpage又是哪些东西呢?这个时侯请看第三段代码。

linux源码结构_linux源码剖析_linux内核源码结构

这儿就实现了v9fs_vfs_readpage。v9fs_vfs_readpage上面实际调用的是v9fs_fid_readpage(filp->private_data,page);这个函数。

为此linux论坛linux vi命令,大体的流程我归纳如下:

v9fs_addr_operations.readpage(filp->private_data,page)->v9fs_fid_readpage(filp->private_data,page);

那为何要搞的如此复杂呢?

我个人觉得linux源码结构,这些方式有点类似于面向对象的具象。把一大类具有相同特点的操作具象下来,用我们文章中的事例,对于地址空间的操作,基本就是读、写、设脏等等的操作,这样可以把这种操作具象成一个对象,在这儿用一个结构体structaddress_space_operations来搞定,这样,address_space_operations就是这种操作的一个父类。

之后如今要对v9fs进行操作,我们只须要实例化一个具体针对v9fs的对象,这时侯我们就生成一个类型为structaddress_space_operations的对象v9fs_addr_operations。在上面将须要调用的操作指向我们具体的函数,能够实现对于多种函数实现的情境下统一插口拉

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: linux系统 函数指针 指针变量 结构体类型
最后更新:2023年8月5日

Linux系统网

每日更新,欢迎收藏♥ 不积跬步无以至千里,加油,共勉。

点赞
< 上一篇
下一篇 >

Linux系统网

每日更新,欢迎收藏♥
不积跬步无以至千里,加油,共勉。

最新 热点 随机
最新 热点 随机
五款优秀的Linux服务器操作系统(CGSL) Linuxdevicedriver的概念系统调用是怎么样的呢? Windows和linux服务器的区别,你知道几个? gdb调试运行中的Python进程步骤 修改ssh默认端口号的方法及注意事项!服务器 企业应用程序的未来提供动力?——Linux服务器 Coredump:程序异常原因解析 Linux和Windows操作系统在服务器中的优势有哪些 设置开机自启动的方法和操作环境 Linux内核版本查看命令大全命令排查方法 Linux中可以使用xxd命令来查看二进制文件的内容和结构 mysql默认密码策略无法修改简单的密码必须要做 Linux开机自启动的常用方法来设置Linux系统启动命令 VisualStudio调试器的转储文件是怎样的?| 串口驱动框架分析之u-boot串口接收缓冲中的示例 常用命令/文件处理、基础功能介绍 不同操作系统发行的软件包可否混用? Linux系统如何添加开机启动自动启动的方式有很多种 ftp命令是标准的文件传输协议的用户接口,ftp Ubuntu16.04下完美切换Python版本(亲测)
如何删除不要的应用软件?Linux安装源程序包CentOS上离线搭建SVN服务器的操作字符设备架构的大概原理、常用的数据结构和函数安装系统设计不合理,十招不需要顺序执行!5个最稳定的Linux发行版,你值得拥有!Linux内核体系体系结构简析图(上报)|维护者名单linux增加/根目录的磁盘空间(基于LVM)问题引出makemenuconfig和makeconfig内核的配置方式linux sdio wifi 驱动 STM3232ff1010概览为例对标准库开发进行LinuxCrontab日志的几种方式查看日志管理工具的作用构建定制化的Linux-3.5内核构建步骤及使用方法!单片机开发转入嵌入式开发的工程师是怎么做的MySQL数据库如何在Linux系统上面进行自动备份创建备份目录Linux内核裁剪——无模块支持(title-引导条)如何通过rar官方源码包正确安装unrar包编译安装解压命令2023年第一个符合OpenGLES3.1标准的GPU驱动程序(IPO)管理用户(user)的工具或命令;Linux基础知识:一个文件复制到当前文件夹如果系统没有自动检测到你的打印机,这篇文章教你关于Linux管理员权限命令的一些常见问题及解决办法
文章目录查找并显示给定命令的绝对路径补充说明 centos openldap 快速掌握CentOS下OpenLDAP的搭建与使用技巧 服务器安全狗Linux安装教程-linuxVPS平安狗安装 一下怎么查看linux端口被哪个进程占用的方法命令 现代调试技术可以分为软件仿真调试和硬件仿真易于 基于Linux内核的基本思想Linux的特性和特性 基于go-cqhttp的PythonSDKHTTPAPI插件 MySQL查询DB2版本(详解如何查询MySQL中的DB2) Linux网络协议栈安装攻略 (伶回合)Linux常用命令-1.2文件处理命令写 nanopia64开发板手册:NanoPiA6453架构的驱动源码 linux,实时补丁 在阿里云上安装桌面环境,轻松享受高效办公! 全球最流行的操作系统(作业系统)内核之一 网络技术—本地用户和组课堂笔记 linux系统是装在固态还是机械上?推荐将linuxdebian硬盘安装? Linux下磁盘的分区,文件系统的格式化与raid设备 VisualStudio调试器的转储文件是怎样的?| 新版LinuxShell编程实训(全)docx项目完整教程 优盘中安装Linux系统的注意事项!中的所有数据
标签聚合
linux服务器 文件 命令 软件 文件目录 操作 目录 内核 linux系统 应用
书籍
课程
技术群
技术干货大合集↓
  • 2023年11月 / 88篇
  • 2023年10月 / 94篇
  • 2023年9月 / 90篇
  • 2023年8月 / 92篇
  • 2023年7月 / 96篇
  • 2023年6月 / 91篇
  • 2023年5月 / 93篇
  • 2023年4月 / 91篇
  • 2023年3月 / 69篇
友情链接:

Linux书籍 | Linux命令 | Linux系统 | RHCE红帽认证 | Linux软件 | Linux教程 | CentOS系统 | Linux内核 | Linux服务器 | Linux大神 | IT资源 | Linux系统

COPYRIGHT © 2024 LinuxZone.net ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang