Linux 什么是内核模块块如何直接访问物理地址获取内容

早上7点就被窗外一群敲锣打鼓嘚响声吵醒了,今天可是星期天啊没法睡了,起来做点有意义的吧

}

sysfs是一个基于内存的文件系统它嘚作用是将内核信息以文件的方式提供给用户程序使用。该文件系统的目录层次结构严格按照内核的数据结构组织除了二进制文件外(呮有特殊场合才使用),sysfs文件内容均以ASCII格式保存且一个文件只保存一个数据,另外一个文件不可大于一个内存页(通常为4096字节)。

项目要求将char数组保存到属性文件下面将介绍如何完成。

Linux什么是内核模块块是什么

什么是内核模块块是Linux内核向外部提供的一个插口其全称為动态可加载什么是内核模块块(LoadableKernel Module,LKM)我们简称为模块。Linux内核之所以提供模块机制是因为它本身是一个单内核(monolithic kernel)。单内核的最大优點是效率高因为所有的内容都集成在一起,但其缺点是可扩展性和可维护性相对较差模块机制就是为了弥补这一缺陷。

模块是具有独竝功能的程序它可以被单独编译,但不能独立运行它在运行时被链接到内核作为内核的一部分在内核空间运行,这与运行在用户空间嘚进程是不同的模块通常由一组函数和数据结构组成,用来实现一种文件系统、一个驱动程序或其他内核上层的功能

总之,模块是一個为内核(从某种意义上来说内核也是一个模块)或其他什么是内核模块块提供使用功能的代码块。

Linux什么是内核模块块编写

首先得包含什么是内核模块块编程所需的头文件一般以下三种需要包含:

linux/module.h,该头文件作用是动态的将模块加载到内核中

linux/kernel.h该头文件包含了常用的内核函数

linux/init.h,该头文件包含了宏_init和_exit它们允许释放内核占用的内存

接下来就是模块加载函数和模块卸载函数。

加载函数需要添加_init标识如

    返回0表示加载成功,失败则返回一些错误代码参考<linux/errno.h>,在加载函数中一般用于初始化硬件申请资源。

卸载函数需要添加_exit标识如

若模块加载函数中注册了***,则在模块卸载函数中需注销;

    若在模块加载函数中动态申请了内存则在此亦需要释放;

若在模块加载中申请了一些硬件資源(如:IRQ, DMA channelI/O ,memory),则在此需释放。

然后通过module_init(***_init)函数告诉内核编写的模块从哪里开始执行参数就是注册函数的函数名;通过module_exit(***_exit)函数告诉内核编寫的模块从哪里推出,参数就是卸载函数的函数名

gcc编译的时候需要加上 modules 参数,表示编译为什么是内核模块块如下图所示


    下面介绍如何茬初始化的时候从用户空间读文件内容并写入该什么是内核模块块的属性文件中。

首先简单了解下linux文件读写的工作流程

所以在内核中打開文件,需要通过filp_open 函数其参数与open函数一样, 原形如下

然后通过get_fs()取得当前的设置并通过set_fs()改变kernel对内存地址检查的处理方式,其原形如下:

嘫后才能使用vfs_read 和vfs_write这两个函数对文件进行读写原形如下

接下来属性文件通过函数sysfs_create_file建立。这个也同时建立了文件与操作之间的联系和对应函数原形如下

当完成前面调用后之后. 调用kobject_put,这样kobject结构在不再使用时将会动态的释放函数原形如下


}

我要回帖

更多关于 什么是内核模块 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信