当前位置: 首页 > 面试题库 >

如何从Linux内核空间(即从自定义系统调用)添加自定义扩展属性

仲浩旷
2023-03-14
问题内容

如何添加类似于命令行功能的扩展属性setfattr -n user.custom_attrib -v 99 ex1.txt,但是如何在内核中通过自定义系统调用来实现。我看了一下linux/xattrib.h,尝试从内核空间进行任何设置都没有运气。每当我使用vfs_setxattr(struct dentry *, const char *, const void *, size_t, int);它时,它都会重新引导整个VM。最后,我尝试将新的整数类型作为扩展属性添加到文件,并且我还将需要检索该扩展属性。我需要使用内核空间中允许的功能。


问题答案:

我能得到工作的扩展属性:vfs_setxattr(struct dentry *, const char *, const void *, size_t, int); 主要的问题是const void *需要一个char *传递。该代码看起来像这样:

char * buf = "test\0";
int size = 5;     //number of bytes needed for attribute
int flag = 0;     //0 allows for replacement or creation of attribute
int err;          //gets error code negative error and positive success

err = vfs_setxattr(path_struct.dentry, "user.custom_attrib", buf, size, flag);

我也能够开始vfs_getxattr(struct dentry *, const char *, const void *, size_t);工作。缓冲区,void *又是我卡住的地方。我必须分配一个缓冲区来保存正在传递的扩展属性。所以我的代码看起来像这样:

char buf[1024];
int size_buf = 1024;
int err;

err = vfs_getxattr(path_struct.dentry, "user.custom_attrib",buf, size_buf);

因此,buf将保留来自dentry的指定文件中的值。错误代码对于找出正在发生的事情非常有帮助。使用命令行工具也是如此。

要安装命令行工具:

sudo apt-get install attr

要从命令行手动设置属性:

setfattr -n user.custom_attrib -v "test_if working" test.txt

要从命令行手动获取属性:

getfattr -n user.custom_attrib test.txt

我无法弄清楚您是否可以将诸如int的不同类型传递给扩展的atrributes,而我的尝试使我不胜枚举内核构建的次数。希望这对某些人有所帮助,或者如果有人有任何更正,请告诉我。



 类似资料:
  • Home assistant 支持设备显示的高度自定义,你可以给设备更换昵称、图标、图标以及隐藏设备等。 设置方法 设备的个性化由 customize 模块定义,默认配置文件 configuration.yaml 中 customize 位于 homeassistant模块下: homeassistant: # 名称,可为中文 name: 家 # 纬度 latitude: !sec

  • 目前 Mars 支持自定义 xlog 的加密部分和长短连协议加解包部分。需要强调的是想要自定义这些扩展,需要在本地编译 Mars 才可以,编译方法见 Mars Android 接入指南 和 Mars iOS/OS X 接入指南 中的编译部分。切记,在自定义实现时,可以增加函数,但是不能删除头文件中已有的函数,也不能修改头文件中的函数原型。 自定义 xlog 加密 xlog 的具体实现可以参考微信终

  • 用户自定义扩展是用户自己创建的 JavaScript 文件,对 Selenium IDE 现有的功能进行定制以及功能扩展。通常这种定制和扩展是以自定义命令的形式来体现的,当然也不仅限于命令。 这里可以找到很多有用的扩展。 注意:这部分信息已经过时,我们将很快修改。 也许最受欢迎的 Selenium IDE 扩展就是流程控制,流程控制扩展将提供 while 循环和条件判断。这个扩展是 goto_se

  • 当我们在开发某些东西时,经常会需要我们自己的 error 类来反映在我们的任务中可能出错的特定任务。对于网络操作中的 error,我们需要 HttpError,对于数据库操作中的 error,我们需要 DbError,对于搜索操作中的 error,我们需要 NotFoundError,等等。 我们自定义的 error 应该支持基本的 error 的属性,例如 message,name,并且最好还有

  • 我正在尝试为我的Laravel(5.2)API项目设置单元测试。在使用单元测试之前,我想为它们定义一个自定义名称空间,因此我创建了文件。像这样: 然后,我创建了一个文件夹下的文件夹,并将我的单元测试放在该文件夹与以下命名空间: 现在,当我想运行单元测试时,我得到以下错误: 所以基本上,Laravel认为在Test命名空间中可以找到类,而不是Laravel的命名空间。 我还在文件: 我也尝试过运行这

  • 通过Envoy架构很容易扩展网络过滤器和HTTP过滤器。 有关如何添加网络过滤器和构建库并建立依赖关系的示例,请参见envoy-filter-example。 返回