linux怎么读

更新时间:2023-01-02 14:51:36 阅读: 评论:0


2023年1月2日发(作者:新概念英语官方网站)

Linux编写内核模块及⽂件读写

sysfs是什么

sysfs是⼀个基于内存的⽂件系统,它的作⽤是将内核信息以⽂件的⽅式提供给⽤户程序使⽤。该⽂件系统的⽬录层次结构严格按照内核的

数据结构组织。除了⼆进制⽂件外(只有特殊场合才使⽤),sysfs⽂件内容均以ASCII格式保存,且⼀个⽂件只保存⼀个数据,另外,⼀

个⽂件不可⼤于⼀个内存页(通常为4096字节)。

项⽬要求将char数组保存到属性⽂件,下⾯将介绍如何完成。

Linux内核模块是什么

内核模块是Linux内核向外部提供的⼀个插⼝,其全称为动态可加载内核模块(LoadableKernelModule,LKM),我们简称为模块。

Linux内核之所以提供模块机制,是因为它本⾝是⼀个单内核(monolithickernel)。单内核的最⼤优点是效率⾼,因为所有的内容都集成

在⼀起,但其缺点是可扩展性和可维护性相对较差,模块机制就是为了弥补这⼀缺陷。

模块是具有独⽴功能的程序,它可以被单独编译,但不能独⽴运⾏。它在运⾏时被链接到内核作为内核的⼀部分在内核空间运⾏,这与运⾏

在⽤户空间的进程是不同的。模块通常由⼀组函数和数据结构组成,⽤来实现⼀种⽂件系统、⼀个驱动程序或其他内核上层的功能。

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

Linux内核模块编写

⾸先得包含内核模块编程所需的头⽂件,⼀般以下三种需要包含:

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

linux/kernel.h,该头⽂件包含了常⽤的内核函数

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

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

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

staticint__init***_init(void)

返回0表⽰加载成功,失败则返回⼀些错误代码,参考,在加载函数中⼀般⽤于初始化硬件,申请资源。

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

staticvoid__exit***_exit(void)

⼀般在该函数完成以下⼏件事情,

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

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

若在模块加载中申请了⼀些硬件资源(如:IRQ,DMAchannel,I/O,memory),则在此需释放。

然后通过module_init(***_init)函数告诉内核编写的模块从哪⾥开始执⾏,参数就是注册函数的函数名;通过module_exit(***_exit)函数告

诉内核编写的模块从哪⾥推出,参数就是卸载函数的函数名。

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

下⾯介绍如何在初始化的时候从⽤户空间读⽂件内容并写⼊该内核模块的属性⽂件中。

内核模块读写⽂件

⾸先简单了解下linux⽂件读写的⼯作流程

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

strcutfile*filp_open(constchar*filename,intopen_mode,intmode);

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

voidt_fs(mm_gment_tfs);

然后才能使⽤vfs_read和vfs_write这两个函数对⽂件进⾏读写。原形如下

ssize_tvfs_read(structfile*filp,char__ur*buffer,size_tlen,loff_t*pos);

ssize_tvfs_write(structfile*filp,constchar__ur*buffer,size_tlen,loff_t*pos);

最后通过filp_clo关闭⽂件。

具体实现过程如下:

内核模块创建属性⽂件

⾸先调⽤kobject_create_and_add函数,动态创建⼀个kobject结构并注册到sysfs,函数原形如下

structkobject*kobject_create_and_add(constchar*name,structkobject*parent)

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

intsysfs_create_file(helloworld_kobj,&hello_value_attribute)

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

voidkobject_put(structkobject*kobj)

具体实现过程如下

本文发布于:2023-01-02 14:51:36,感谢您对本站的认可!

本文链接:http://www.wtabcd.cn/fanwen/fan/90/78382.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:derrick
下一篇:colombia
标签:linux怎么读
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图