我是设备驱动程序编程的新手.我正在通过以下网站. http://www.codeproject.com/KB/system/driverdev.aspx
我只是对"二进制"一词感到困惑.特定的声明说"链接器构建最终的二进制文件,并根据PE头中的选项......".所以我的问题是二进制在设备驱动程序编程中意味着什么?
是否可以在linux pc上查询特定的串口是否已连接/断开?我们有什么方法可以读取sysfs信息来查询特定端口是否连接?
这是我对开放阅读/写作文件的理解.
在应用程序层,我可以调用该fopen()函数.
该fwrite()函数将调用系统调用open().
操作系统收到open()呼叫后,会将命令传递给VFS(虚拟文件系统).
VFS查找文件名,包括所需的任何目录,并进行必要的访问检查.
如果这是在RAM缓存中,则不需要磁盘访问.如果没有,VFS会向特定文件系统发送一个读取请求,该请求可能是EXT4.
然后,EXT4文件系统驱动程序将确定该目录所在的磁盘块.然后它将向磁盘设备驱动程序发送读取命令.
所以现在让我说我想读一个连接到主板的i2c设备A. 文件目录是/ dev/i2c/A.
所有设备都有一个主要编号吗?例如,Linux OS将180设置为USB的主要编号.那么在设备方面,每个USB设备中是否有一个主要的数字180?
如果第一个问题的答案为否,那么Linux操作系统如何确定哪种类型的设备A,它只是根据文件目录?
我认为第二个问题的答案可能是:在启动初始化阶段,有一些代码已经使用export()之类的东西将该端口挂载到文件系统?事实上,在启动阶段之后,文件目录/ dev/i2c/A就存在,并且它与i2c设备的主要编号绑定.因此,当我想打开dev/i2c/A时,OS会为我找到合适的i2c驱动程序,而不是SPI或USB驱动程序.我不确定这部分,我需要更多相关信息.
在启动阶段后立即将设备安装到文件系统时会发生上述情况.那么如果我有一个usb会发生什么,在插入后,如何将这个usb安装到具有正确的主号码180的文件系统?我想在安装阶段开始之前插入usb时会有一个irq?
我很难理解何时应该编写设备驱动程序,而不是仅仅通过outb我的用户空间程序将操作码直接发送到硬件.我最初认为我应该为硬件创建简单的例程,但现在我开始认为算法应该保留在用户空间中.
假设我正在编程一个假想的机器人手臂.我可以在Linux内核模块中编写几个函数,这些函数可以自动执行常见任务所需的硬件输出(例如,将arm移动到HOME位置,从装配线开始处的已知位置拾取新块等).但是,在阅读了有关设备驱动程序的更多信息之后,似乎经验法则是尽可能使设备驱动程序尽可能接近特定于硬件的代码,从而将"繁重的"算法留给用户空间.
这让我感到困惑,因为如果设备驱动程序实现的唯一函数是简单的操作码调用,那么用户空间程序使用设备文件而不是直接调用outb/ 的原因是什么inb?
我想我想弄清楚的是:我如何决定内核空间而不是用户空间中的功能?
我正在浏览Linux内核源代码,并在其中一个汇编文件中找到了_bss_start C varianle,但无法找到它被实际定义和初始化的位置.
看起来_bss_start是bss段的起始地址,但是在内核源代码中使用值初始化的位置和方式,我正在查看linux源码2.6.25.
我查看了文件asm-generic/section.h,其定义如下
extern char _bss_start[]
Run Code Online (Sandbox Code Playgroud)
但是如何定义_bss_start,DS寄存器是用来初始化它的
我是编写设备驱动程序的新手.
我想在ARM平台上为外设编写设备驱动程序.
第一个问题:在ARM平台上为外围设备编写设备驱动程序与在Linux中使用x86编写设备驱动程序有什么不同?
第二个问题:我检查了/ proc/iomem文件以查看处理器的当前地址映射.但是,并非所有外围设备(包括我要访问的外围设备)都不存在于该文件中.如何包含外设的地址范围?
第三个问题:设备树在编写设备驱动程序时的重要性是什么?
我有几个注册的中断分配给gpios,并在用户空间中应用.如何通知应用程序有关发生的中断和有哪些中断?
可能fasync适用于此目标,但我可以找到如何从中断处理程序向用户空间应用程序发送信息的示例.
如果你能提供一些有用的例子,那就太好了.
提前致谢.
我使用Atmel uC将输入切换到BeagleBone上的GPIO线,每500 ms从高到低.我在我的Linux内核模块中为此注册了一个处理程序,但由于某种原因没有调用处理程序.
我的模块代码是 -
#define GPIO 54
#define GPIO_INT_NAME "gpio_int"
#define GPIO_HIGH gpio_get_value(GPIO)
#define GPIO_LOW (gpio_get_value(GPIO) == 0)
short int irq_any_gpio = 0;
int count =0;
enum { falling, rising } type;
static irqreturn_t r_irq_handler(int irq, void *dev_id)
{
count++;
printk(KERN_DEBUG "interrupt received (irq: %d)\n", irq);
if (irq == gpio_to_irq(GPIO))
{
type = GPIO_LOW ? falling : rising;
if(type == falling)
{
printk("gpio pin is low\n");
}
else
printk("gpio pin is high\n");
}
return IRQ_HANDLED;
}
void r_int_config(void) { …Run Code Online (Sandbox Code Playgroud) 我试图了解通过VFIO分配给VM(来宾KVM)的设备的中断处理的工作原理,但是没有任何线索?
假设我有一个通过VFIO直接分配给Guest VM的设备(设备直通),并且该设备有硬件中断吗?
接下来发生什么?
我是Linux驱动程序开发的新手.我想知道Linux驱动程序在不同芯片上的工作原理.例如,同样的uart驱动程序在allwinner和sitara socs上工作吗?allwinner和sitara socs是否有相同的uart外围设备?