标签: sysfs

linux内核如何创建sysfs?

我已经开始为我的操作系统课程寻找 linux 内核代码。我对 sys 文件系统 (sysfs) 感兴趣。我有兴趣了解 sysfs 何时以及如何创建?linux内核代码中的哪些文件生成了这个文件系统?

我已经在我的系统上设置了 linux 内核并开始通过代码进行调试。

我参考了这个文档来了解 sysfs 文件系统: [sysfs] : https://www.kernel.org/doc/Documentation/filesystems/sysfs.txt

但是本文档只解释了目录结构、目录的创建和读/写属性。我对内核如何在引导期间创建这些目录更感兴趣。我知道以下方法负责在 sysfs 中创建目录。

   int sysfs_create_file(struct kobject *kobj, struct attribute *attr);
Run Code Online (Sandbox Code Playgroud)

此函数接受 kboject 结构、属性并使用这些在 sysfs 中创建目录。

我知道在启动时,内核会检测内存并在 sys/devices/system/memory 下创建目录。我计划更改此目录结构作为我作业的一部分。那么,能否请您指出负责创建此特定内存目录的文件和方法?

linux operating-system kernel linux-kernel sysfs

5
推荐指数
1
解决办法
4812
查看次数

来自用户空间的 sysfs 文件上的 poll() 和来自内核空间的 sysfs_notify() 无法同时工作

我的 raspi 内核模块是为了获得双光栅而编写的,如果两个输入 gpio\xc2\xb4s 边缘中的每一个都上升并且发生中断,则读取单调时间。时间值通过普通的 sysfs 文件传递​​到用户空间(而不是开发文件)。这很好用。

\n\n

我的用户空间实现应该读取这些值并计算物体通过光栅的最终速度。目前,这个问题可以通过定期读取 sysfs 文件来解决。如果值发生变化,则会选取并使用新值。

\n\n

为了节省资源,我想 poll() 相关 sysfs 文件上的 POLLPRI。在内核模块内部,sysfs_notify() 应该向用户空间提供相关 sysfs 文件的更改状态和值。

\n\n

但是我在用户空间中的 poll() 永久阻塞。我也尝试将 POLLIN 作为事件。结果是 poll() 函数立即返回。

\n\n

这是我的代码...

\n\n
// [...]\n\nstatic struct kobject *gpio; // dir /sys/kernel/gpio\n\nstatic ssize_t gpio17s_show(struct kobject *kobj,struct kobj_attribute\n            *attr,char *buf)\n{\n    return sprintf(buf,"%li",sec1);\n}\n\nstatic ssize_t gpio17s_store(struct kobject *kobj,struct kobj_attribute\n            *attr,const char *buf,size_t count)\n{\n    sscanf(buf,"%li",&sec1);\n    return count;\n}\n\n}\n\n// [...] (two more files)\n\nstatic ssize_t gpio26n_show(struct kobject *kobj,struct kobj_attribute\n            *attr,char *buf)\n{\n    sysfs_notify(gpio,NULL,"gpio26n"); // Is this the right place, the …
Run Code Online (Sandbox Code Playgroud)

c linux-kernel sysfs

5
推荐指数
1
解决办法
4052
查看次数

Linux用户空间GPIO使用sysfs进行中断

我想使用sysfs在用户空间上使用GPIO中断.我使用这些命令:

[root@at91]:gpio109 > echo 109 > export
[root@at91]:gpio109 > cd gpio109/
[root@at91]:gpio109 > ll
-rw-r--r--    1 root     0            4096 Jan  1 00:17 direction
drwxr-xr-x    2 root     0               0 Jan  1 00:17 power
lrwxrwxrwx    1 root     0               0 Jan  1 00:17 subsystem -> ../../gpio
-rw-r--r--    1 root     0            4096 Jan  1 00:17 uevent
-rw-r--r--    1 root     0            4096 Jan  1 00:17 value
Run Code Online (Sandbox Code Playgroud)

gpio运行良好,但我无法使用中断.我到处读到我必须有一个边缘文件来轮询这个文件.但在我的系统上,此文件不存在.我做了很多尝试找到解决方案,但仍然没有成功.

我的目标是Linux内核2.6.30上的AT91SAM9263.

在我的电路板启动时,我收到了关于中断的消息:

AT91: 160 gpio irqs in 5 banks
Run Code Online (Sandbox Code Playgroud)

这表明该功能at91_gpio_irq_setup()执行得很好.

你知道吗?

linux kernel interrupt sysfs gpio

4
推荐指数
1
解决办法
9306
查看次数

sysfs中的内核模块参数 - 对更改的快速反应

当其中一个sys文件被更改时,是否可以通知模块?我的任务是做一个控制模块内缓冲区大小的文件,我想在文件中的值改变时调整缓冲区的大小.我的另一个想法(如果我不能通知模块)是每次使用模块时检查前一个值,然后调整缓冲区的大小.

c kernel-module linux-kernel sysfs

4
推荐指数
1
解决办法
2987
查看次数

可用于 sysfs 读取的最大字节数

为了处理sysfs读取,我需要创建一个show添加到kobj_attribute结构中的函数。函数原型定义为

ssize_t (*show)(struct kobject *kobj, struct kobj_attribute *attr,
            char *buf);
Run Code Online (Sandbox Code Playgroud)

显然我需要向buf参数写入数据,但是可以写入的字节数上限是多少?它是在任何地方定义的吗?

c linux-kernel sysfs

4
推荐指数
1
解决办法
1355
查看次数

Beaglebone gpio输入无法正常工作

我正在使用beaglebone使用sysfs接口从特定引脚访问数字输入.我可以改变输出状态而不是输入:(.我做的是,我有两个引脚pinA和pinB.pinA我做了输出而pinB我做了输入.将pinA连接到pinB.通过发送将pinA配置为输出引脚通过传入将sysf和pinB中的direction属性作为输入.然后我将PinA的值更改为1并将其作为输出给出1(我使用LED测试).但是当我读取PinB的值时,它仅给出0,即使我将0传递给pinA的值.可能是什么原因?

谢谢 :)

linux embedded-linux beagleboard sysfs gpio

3
推荐指数
1
解决办法
1万
查看次数

为什么 Linux 内核的 sysfs API 中的存储函数需要返回已使用的字节?

从文档中:

  • store() 应该返回缓冲区使用的字节数。如果整个缓冲区已被使用,则仅返回计数参数。

它对这个值有什么作用?如果我从大小为 FOO 的缓冲区读取 4 个字节而不是 6 个字节,有什么区别?

linux kernel sysfs

3
推荐指数
1
解决办法
2661
查看次数

当GPIO更改状态时,sysfs如何更新?

假设gpio X可以作为输入引脚在sysfs中导出,在这之后,将在/ sys/class/gpio /中创建一个名为gpioX的目录.gpioX /包含少量文件,例如"value",表示gpio X的当前状态(高或低).

当施加到引脚X的信号改变其状态(例如从低到高)时会发生什么(在内核空间中)?

我的意思是,在转换之前,gpioX/value包含"low",但之后它将包含"high"值.操作系统如何更新此文件?

我认为需要一个中断机制.它是否使用中断机制来更新sysfs?

interrupt linux-kernel sysfs gpio

3
推荐指数
1
解决办法
2258
查看次数

从内核模块创建 sysfs 条目

我想将一个大于 1024 个字符的字符串传递给我的模块(文件系统)。由于内核参数限制为 1024 个字符,有人建议改用 sysfs。

我试图在我的 super.c 类中包含这个示例,以便在 sysfs 中为我的模块创建一个字符串 'filename' 和字符串 'code' 条目。

static decl_subsys(myfs, NULL, NULL);

struct myfs_attr {
    struct attribute attr;
    char *value;
};

static struct myfs_attr fname = {
    .attr.name="filename",
    .attr.owner = THIS_MODULE,
    .attr.mode = 0644,
    .value = "/my/test/path",
};

static struct myfs_attr code = {
    .attr.name="code",
    .attr.owner = THIS_MODULE,
    .attr.mode = 0644,
    .value = "0101",
};
Run Code Online (Sandbox Code Playgroud)

编译我的模块时出现很多错误(第 41 行是 decl_subsys):

fs/myfs/super.c:41:26: error: expected ‘)’ before ‘(’ token
fs/myfs/super.c:50:2: error: unknown …
Run Code Online (Sandbox Code Playgroud)

c linux kernel-module linux-kernel sysfs

3
推荐指数
1
解决办法
3914
查看次数

Android 上 /sys/class/power_supply 中的多个电池条目

我正在尝试从 NDK 应用程序读取电池信息。我知道要完成此任务的唯一方法是读取值/sys/class/power_supply。我的困难是我找到了多个类型为“电池”的条目,但我不知道该使用哪一个。

在带有 KitKat 4.4.4 的 Nexus 10 上,我看到:

$ ls /sys/class/power_supply
ds2784-fuelgauge
manta-battery
smb347-battery
# other non-battery entries
Run Code Online (Sandbox Code Playgroud)

类型=电池,适用于所有三个。例如:

$ cat /sys/class/power_supply/ds2784-fuelgauge/type
Battery
Run Code Online (Sandbox Code Playgroud)

在 AndroidBatteryManager代码中,他们只是遍历电池设备并获取第一个具有所需条目的设备(http://androidxref.com/4.4.4_r1/xref/system/core/healthd/BatteryMonitor.cpp)。但是,在我的 Nexus 10 上,它们具有不同的值。例如,对于ds2784-fuelgauge/voltage_nowsmb347-battery/voltage_now

$ cat ds2784-fuelgauge/voltage_now
4153100
$ cat smb347-battery/voltage_now
4300000
Run Code Online (Sandbox Code Playgroud)

ds2784-fuelgauge/voltage_now似乎定期更新(例如,当我开始一项计算量大的任务时它会发生变化),但smb347-battery/voltage_now似乎已修复。当我比较ds2784-fuelgauge/current_now和时,我看到了类似的效果smb347-battery/current_now

我的问题是:

  1. 为什么这里有多个带有 type=battery 的条目?
  2. 我如何以一般方式区分它们?
  3. 我应该使用哪一种?

编辑

  • 修复了voltage_now文件名中的错字
  • 强调所有三个设备的 type=Battery

linux android android-ndk sysfs

3
推荐指数
1
解决办法
8743
查看次数