我有一块C代码,它有一块内存(静态数组)可以模仿文件操作(它有类似于fopen/ fcloseetc的API ).因此,使用这个模仿FileSystem编译的任何代码都可以将这些API用作FileSystem以满足他们的所有需求:)
但我想知道,如果可能以某种方式将这些API注册到Linux系统/ mouning这个文件系统,从而使任何客户端能够通过使用普通的FileSystem调用来使用这个FS(无需任何静态链接它与My_FileSystem).
在寻找解决方案时,我遇到了将my_FileSystem作为驱动程序的想法!=>是否可以将我的代码编译为设备驱动程序(使用驱动程序中的内存块)并安装此File_system @ say "/mnt/MyFs",并转移文件系统调用,如USB驱动程序吗?(如果可以这样做,请你解释它是如何完成的,或者指出我可以阅读的内容).
我不想将这些添加为新的系统调用并重新编译内核(并使ppl的生活想要使用这个困难).
这主要适用于运行Linux的嵌入式系统......但也欢迎其他建议.:)
谢谢,
MicroKernel :)
linux filesystems device-driver linux-device-driver linux-kernel
Linux内核模块对内存使用有任何限制,即代码段大小或全局内存量或任何内容.
我正在写一个内核驱动程序通过i2c接口,我在多个地方从总线接口芯片读取.一些是通过ioctl从用户空间完成的,而其他一些是在中断时发生的.从ioctl完成的读取工作正常,但从中断完成的读取会导致核心转储(参见下文).
以下是相关的代码部分:
static struct i2c_client *pcf8575_client; //global i2c client handle
static void
pcf8575_init_client(struct i2c_client *client) {
.
.
.
pcf8575_client = client;
.
.
.
}
static int
pcf8575_ioctl(struct inode *inode,struct file *file,unsigned int request,unsigned long argument)
{
.
.
.
pcf8575_read_char(pcf8575_client, &key); //works fine here, gets back appropriate value
.
.
.
}
static irqreturn_t i2c_keys_isr (int irq, void *data)
{
int result;
static char last_key, key;
static struct i2c_client *pcf8575_client;
pcf8575_client = (struct i2c_client*) data;
.
.
. …Run Code Online (Sandbox Code Playgroud) 我正在尝试调试代码中的一些函数.不幸的是,gdb在系统中不可用,所以目前通过printk消息(它是一个Linux内核驱动程序)完成调试.
有一些函数被调用一些参数.我想知道是否可以知道该功能的用户和方式.
谢谢.
我对这个功能感到困惑:
void*page_address(struct page*page)
其中(1)"根据"Linux Kerenl developpement 3rd edition"将给定页面转换为其逻辑地址"(2)"根据"了解linux内核>>"返回与页面框架相关的线性地址"(3)根据"了解linux虚拟内存管理器""返回页面的物理地址"
哪一个是正确的呢?
让我们看(1):这个函数采用指向物理页面(页面框架)的指针,那个指针不是"与该页面框架相关联的逻辑地址"吗?那么指针值和返回值之间有什么区别呢?谢谢.
最近,我正在尝试为Linux开发一个alsa驱动程序(实际上是Android TV).我遇到了一个关于alsa(alsa指的是Advanced Linux Sound Architecture)设备处理的问题
实际上,我已经研究了alsa-lib-1.0.27.1和tinyalsa(用于android设备)的部分源代码.我研究了三星设备的音频驱动程序.
用户空间应用程序使用/ dev/snd/pcmXXXXX来播放/捕获音频数据.但是,有一个问题.如果只有一个音频设备,它很好;
/dev/snd/
??? by-path
? ??? pci-0000:02:02.0 -> ../controlC0
??? controlC0
??? midiC0D0
??? pcmC0D0c
??? pcmC0D0p
??? pcmC0D1p
??? timer
Run Code Online (Sandbox Code Playgroud)
但是,如果有多个设备(例如,当我插入USB音频设备时).
/dev/snd/
??? by-path
? ??? pci-0000:02:02.0 -> ../controlC0
??? controlC0
??? controlC1 //new Control channel
??? midiC0D0
??? pcmC0D0c
??? pcmC0D0p
??? pcmC0D1p
??? pcmC1D0c //new card,new capture channel
??? pcmC1D0p //new card,new playback channel
??? timer
Run Code Online (Sandbox Code Playgroud)
用户应用程序如何正确处理这些设备.
三星司机让我很困惑.==> Linux的3.5.4 /设备/三星/克雷斯波/ libaudio/AudioHardware.cpp
status_t AudioHardware::AudioStreamInALSA::open_l()
{
//.....
ALOGV("open pcm_in driver");
TRACE_DRIVER_IN(DRV_PCM_OPEN)
mPcm …Run Code Online (Sandbox Code Playgroud) 我试图弄清楚驱动程序中的文件操作是如何工作的.我知道有几个文件操作,但这些操作的函数是用几个参数调用的,而操作本身是在没有任何参数的情况下定义的.
所以,如果我有这个 -
static const struct file_operations proc_myled_operations = {
.open = proc_myled_open,
.read = seq_read,
.write = proc_myled_write,
.llseek = seq_lseek,
.release = single_release
};
Run Code Online (Sandbox Code Playgroud)
现在我知道内核级驱动程序只能作为来自用户应用程序的文件进行访问.这是一个嵌入式系统,所以我有一些LED可以通过写入它们的存储器映射寄存器来打开.
所以.write或"proc_myled_write"调用将在我通过使用fopen打开此文件然后使用fputs打开此文件来执行我可以执行的指令时执行.但是如果.write被映射为"proc_myled_write并且这个函数有这样的参数 -
static ssize_t proc_myled_write(struct file *file, const char __user * buf,
size_t count, loff_t * ppos)
Run Code Online (Sandbox Code Playgroud)
争论会怎样?使用这些参数没有函数调用上述函数.我在几个司机中看过这个.我刚用过这个,因为这是一个简单的例子.文件操作如何映射到这些函数?例如,用户空间中的"写入"如何跟踪驱动程序中的写入?
谢谢.
如何将平台特定文件转换为设备树?
我理论上知道设备树.请解释它如何在覆盆子pi板或任何其他板上工作.
如果我在Linux中运行一些命令行应用程序,如何判断该进程访问(读取和/或写入)哪些文件?我想我需要在文件系统驱动程序中放置一些钩子并重新编译内核,或类似的东西?有没有更简单的方法?
我正在使用FTDI D2XX驱动程序API与FTDI设备进行通信.它给了我一些关于设备的信息,比如locid,serialnumber,description,但这还不够.
如何/dev/ttyUSBXX使用此API 获取设备编号()或总线或端口.
谢谢
linux ×5
linux-kernel ×5
driver ×2
kernel ×2
alsa ×1
android ×1
audio ×1
c ×1
d2xx ×1
debugging ×1
device-tree ×1
filesystems ×1
ftdi ×1
libusb ×1
memory ×1