当前位置: 主页 > 电脑系统维修 > Linux内核中读写资料数据的办法

Linux内核中读写资料数据的办法

发布时间:02-03 18:51点击:

  有时分需求正在Linuxkernel--大多是正在需求调剂的驱动顺序--中读写资料数据。正在kernel中操作资料没有规范库可用,需求应用kernel的一些因变量,该署因变量次要有: filp_open() filp_close(), vfs_read() vfs_write(),set_fs(),get_fs()等,该署因变量正在linux/fs.h和asm/uaccess.h头资料中申明。上面引见次要方法

  1. 翻开资料

  filp_open()正在kernel中能够翻开资料,其雏形如次:

  strcut file filp_open(const char filename, int open_mode, int mode);

  该因变量前往strcut file构造表针,供后继因变量操作运用,该前往值用IS_ERR()来测验其无效性。

  参数注明

  filename: 标明要翻开或者创立资料的称号(囊括径全体)。正在内核中翻开的资料时需求留意翻开的机遇,很简单涌现需求翻开资料的驱动很早就加载并翻开资料,但需求翻开的资料所正在设施还没有有荷载到资料零碎中,而招致翻开失利。

  open_mode: 资料的翻开形式,其取值与规范库中的open呼应参数相似,能够取O_CREAT,O_RDWR,O_RDONLY等。

  mode: 创立资料时气用,安装创立资料的读写权限,其它状况能够匆略设为0

  2. 读写资料

  kernel中资料的读写操作能够运用vfs_read()和vfs_write,正在运用这两个因变量前需求注明一下get_fs()和 set_fs()这两个因变量。

  vfs_read() vfs_write()两因变量的雏形如次:

  ssize_t vfs_read(struct file filp, char __user buffer, size_t len, loff_t pos);

  ssize_t vfs_write(struct file filp, const char __user buffer, size_t len, loff_t pos);

  留意这两个因变量的第二个参数buffer,后面都有__user润饰符,这就请求这两个buffer表针都该当指向用空的外存,假如对于该参数传送kernel时间的表针,这两个因变量都会前往失利-EFAULT。但正在Kernel中,咱们正常没有简单生成用户时间的表针,或者许方便当运用用户时间外存。要使这两个读写因变量运用kernel时间的buffer表针也能准确任务,需求运用set_fs()因变量或者宏(set_fs()能够是宏界说),假如为因变量,其雏形如次:

  void set_fs(mm_segment_t fs);

  该因变量的作用是改观kernel对于外存地点审查的解决形式,实在该因变量的参数fs只要两个取值:USER_DS,KERNEL_DS,辨别专人用户时间和内核时间,默许状况下,kernel取值为USER_DS,即对于用户时间地点审查并做变换。那样要正在这种对于外存地点做审查变换的因变量中运用内核时间地点,就需求运用set_fs(KERNEL_DS)停止安装。get_fs()正常也能够是宏界说,它的作用是获得以后的安装,这两个因变量的正常用法为:

  mm_segment_t old_fs;

  old_fs = get_fs();

  set_fs(KERNEL_DS);

  ...... //与外存相关的操作

  set_fs(old_fs);

  再有一些其它的内核因变量也有用__user润饰的参数,正在kernel中需求用kernel时间的外存接替时,都能够运用相似方法。

  运用vfs_read()和vfs_write()最初需求留意的小半是最初的参数loff_t pos,pos所指向的值要初始化,标明从资料的什么中央开端读写。

  3. 开放读写资料

  int filp_close(struct filefilp, fl_owner_t id);

  该因变量的运用很容易,第二个参数正常传送NULL值,也有用current-files作为实参的。

  运用之上因变量的其它留意点:

  1. 实在Linux Kernel组没有同意正在kernel中的读写资料(那样做能够会反应到战略和保险成绩),对于内核需求的资料形式,最好由使用层合作实现。

  2. 正在可加载的kernel module中运用这种形式读写资料能够使模块加载失利,缘由是内核子能够没有EXPORT你所需求的一切该署因变量。

  3. 综合之上某些因变量的参数能够看出,该署因变量的准确运转需求依托于历程,因而,有些因变量没有能正在中缀的handle或者Kernel中没有归于任可历程的代码中施行,要不能够涌现瓦解,要防止这种状况发作,能够正在kernel中创立内核线程,将该署因变量放正在线程下施行(创立内核线程的形式请参数kernel_thread()因变量)。

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
电脑维修