我已经开始为我的操作系统课程寻找 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 下创建目录。我计划更改此目录结构作为我作业的一部分。那么,能否请您指出负责创建此特定内存目录的文件和方法?
我的 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) 我想使用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()执行得很好.
你知道吗?
当其中一个sys文件被更改时,是否可以通知模块?我的任务是做一个控制模块内缓冲区大小的文件,我想在文件中的值改变时调整缓冲区的大小.我的另一个想法(如果我不能通知模块)是每次使用模块时检查前一个值,然后调整缓冲区的大小.
为了处理sysfs读取,我需要创建一个show添加到kobj_attribute结构中的函数。函数原型定义为:
ssize_t (*show)(struct kobject *kobj, struct kobj_attribute *attr,
char *buf);
Run Code Online (Sandbox Code Playgroud)
显然我需要向buf参数写入数据,但是可以写入的字节数上限是多少?它是在任何地方定义的吗?
我正在使用beaglebone使用sysfs接口从特定引脚访问数字输入.我可以改变输出状态而不是输入:(.我做的是,我有两个引脚pinA和pinB.pinA我做了输出而pinB我做了输入.将pinA连接到pinB.通过发送将pinA配置为输出引脚通过传入将sysf和pinB中的direction属性作为输入.然后我将PinA的值更改为1并将其作为输出给出1(我使用LED测试).但是当我读取PinB的值时,它仅给出0,即使我将0传递给pinA的值.可能是什么原因?
谢谢 :)
从文档中:
- store() 应该返回缓冲区使用的字节数。如果整个缓冲区已被使用,则仅返回计数参数。
它对这个值有什么作用?如果我从大小为 FOO 的缓冲区读取 4 个字节而不是 6 个字节,有什么区别?
假设gpio X可以作为输入引脚在sysfs中导出,在这之后,将在/ sys/class/gpio /中创建一个名为gpioX的目录.gpioX /包含少量文件,例如"value",表示gpio X的当前状态(高或低).
当施加到引脚X的信号改变其状态(例如从低到高)时会发生什么(在内核空间中)?
我的意思是,在转换之前,gpioX/value包含"low",但之后它将包含"high"值.操作系统如何更新此文件?
我认为需要一个中断机制.它是否使用中断机制来更新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) 我正在尝试从 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_now和smb347-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。
我的问题是:
编辑
voltage_now文件名中的错字sysfs ×10
linux ×6
linux-kernel ×6
c ×4
gpio ×3
kernel ×3
interrupt ×2
android ×1
android-ndk ×1
beagleboard ×1