Articles of 中断

在linux内核中的指令{interrupt do_IRQ}是什么意思?

linux内核文件arch / x86 / kernel / entry_64.S中的指令{interrupt do_IRQ}是什么意思? 是中断一个指令还是一个macros? 定义在哪里? 如何使用它 ? 847 common_interrupt: 848 XCPT_FRAME 849 addq $-0x80,(%rsp) /* Adjust vector to [-256,-1] range */ 850 interrupt do_IRQ 851 /* 0(%rsp): old_rsp-ARGOFFSET */

如何确定USB设备的IRQ号码?

我是驾驶员发展新手。 但是,我购买了一个OSR USB FX2学习工具包,它附带了Windows内核/用户模式驱动程序的示例代码。 不过,我在Linux(Ubuntu 12)中编写驱动程序。 我已经成功地发送了控制命令并从设备接收到控制命令的返回。 我也能够通过设备支持的BULK OUT / IN端点成功发送和读取数据。 还有一个我还没有完成的实验。 该设备有以下端点: 1. BULK (OUT) –> Address 0x06 2. BULK (IN) –> Address 0x88 3. INTERRUPT (IN) –> Address 0x81 我无法弄清楚如何findINTERRUPT(IN)端点的IRQ号码 。 我明白如何使用以下方法安装IRQ处理程序: int request_irq (unsigned int irq, irq_handler_t handler, unsigned long irqflags, const char * devname, void * dev_id); 并用正确的函数原型编写处理程序。 但是,我想知道如何find设备中断的IRQ行(IRQ编号)? 也就是说,如何确定上面的request_irq函数中参数unsigned int […]

networkingstream量上的软件中断

在我的电脑上有3G,Wifi和LAN端口。 我想build立一个Linux软件来显示绿色,如果有networkingstream量和红色的没有networkingstream量。 TCPDUMP可以提供实时统计信息,但会产生较高的CPU负载。 所以我想知道是否可以通过软件中断得到实时统计数据? 每当有networkingstream量时,就会产生一个软件中断。 提前致谢

CPU上下文会被ptrace中断,用户空间堆栈还是内核堆栈?

在Linux x86_64上,当我使用ptrace来停止进程时,所有线程的CPU上下文会被保存,还是只保存进程的CPU上下文? 进程的用户空间堆栈或内核堆栈上的上下文是什么? 或者别的地方? 还是多份? 对于其他情况(而不是ptrace),哪里可以中断(包括exception和系统调用)CPU上下文保存,内核堆栈,用户空间堆栈或其他地方? ptrace是一个中断吗? 更新 看来,ptrace的上下文pt_regs_x86_t,保存的位置是由程序员决定的。 但是内核是否也会为被中断的上下文存储一个副本?

中断ID到名称映射

我正在Linux系统上运行一些基准testing,并logging中断的ID。 我想将中断ID映射到它的名字。 例如,中断号码。 7对应于pagefaultexception。 猫/ proc /中断不帮助。 在这个文件中,有些中断是由它们的ID标识的(例如,定时器中断为0),而一些中断则由一个低温MACRO(例如:用于性能监视中断的PMI)

将两个数字卡连接到星号箱时的IRQ问题

我有两个Digium Wildcard TDM800P,每个都有8个FXO端口。 当我连接两个同时IRQ未命中开始显示使我的电脑无响应和无法使用。 一张卡的工作正常,但我需要所有16个FXO端口工作,以接收来自我的电话公司的电话。 有没有办法让这些卡互相通信,这样就不会产生太多的中断。 或者调整Linux为每个卡分配不同的IRQ。 我曾尝试禁用audio,ACPI和USB端口。 仍然太多的IRQ未命中。

x86:中断处理程序循环

我试图通过IDT处理内核中断。 我在Linux下使用Intel x86。 我已经设置了我的IDT和我的中断条目,我启动了一些testing来查看我的中断处理程序。 当我尝试int $0x0 ,它完美的作品:我的处理程序被调用,但是当我尝试一些exception与推错的代码,我进入一个无限循环。 模式如下: 当exception到达时,我的处理程序的第一部分在ASM中,并调用一个通用的C部分。 my_handler.c void handler(int i) { printf("Exception %d caught\n", i); } my_handlers.S common: pushal pushl %ds pushl %es pushl %fs pushl %gs addl $48, %esp // 4 4-bytes segments pushed // + 8 4-bytes registers (pushal) ` // esp points on exception code call handler // call […]

如何从linux内核生成稳定的37kHz GPIO触发器?

目前我有一个微控制器负责处理红外TX载波的产生,但是我开始想知道是否可以处理它,并在Linux端做这个工作 – 这样就降低了embedded式系统的成本。 我在飞思卡尔i.mx233(454MHz ARM9)上运行,如果我通过/dev/mem直接访问registry,我可以实现相当稳定的5MHz触发GPIO引脚。 由于我需要37kHz,我开始寻找放慢速度的方法,但是至less对于这个目的, nanowait()似乎太粗糙了。 我find了一个在rand循环中调用rand()的解决scheme,我似乎可以很好地生成38.4kHz的信号,但是根据示波器,有时会出现一些不可接受的抖动。 (据我所知,这样做对于资源来说是相当浪费的,但是当TX需要完成的时候,系统并没有真正的其他任务) 我的问题:Freescales内核代码(3.8分支)没有CONFIG_PREEMPT_RT补丁,所以这也许是我应该考虑的一件事,但在此之前: 我可以通过编写一个内核模块来从内核驱动GPIO来实现更精确的性能吗? 我需要从用户空间(要发送的数据)读取一些数据,但除此之外,我只需要在GPIO末尾以指定的频率触发LED,所以驱动程序应该非常简单。 我可以强制我的驱动程序的优先级,以便其他任务不会中断这个GPIO触发? (数据发送目前大约需要400ms,而且很less完成) 有没有更好的方法来创build每37kHz的中断,这样我就不会通过软件停止系统? 微控制器是完成这种任务,但如果可能的话,这将是很好的避免这种成本开销…

关于linux内核中的中断上下文,primefaces上下文和进程上下文

据我所知,我们可以通过在linux内核中涉及in_interrupt()来validation我们是否处于中断上下文中。 当进入或退出hardirq或softirq时, in_interrupt()函数的执行由thread_info->preempt_count计数。 所以,当in_interrupt()返回非零时,表示我们正在处理hardirq或softirq。 但是,我的问题是当我们涉及local_bh_disable()函数,它增加了thread_info->preempt_count ,所以in_interrupt()函数返回非零。 因此,我们现在怎么能确定我们是否处于中断环境。 在我看来,primefaces上下文是本地中断被禁用 这里是我现在处于内核模式的情况,我想访问用户态地址空间,但是我不知道在中断上下文中访问userland地址空间是否无效,是在进程上下文还是中断上下文中运行,所以我想通过涉及in_interrupt()函数来确定是否在进程上下文中。 然后,我得到的返回值大于零,因此,我认为我现在处于中断环境,不会访问用户级。 然而,也许有一些函数暗示涉及local_bh_disable来增加thread_info->preempt_count来禁用sortirq,但事实上,我们正在进程上下文中,只是禁用了softirq,因此,我们可以安全地访问用户地址空间但我们犯了一个错误。

Linux内核中的硬件中断堆栈上半部分?

我知道Linux内核在2.6.32之前把线程内核栈作为ISR栈,在2.6.32之后,内核使用分离栈,如果错了请纠正我。 你会告诉我什么时候ISR堆栈被设置/设置,或者如果有的话就销毁。 或者告诉我源文件名和行号? 提前致谢。 2014年10月17日更新: Linux中有几种堆栈。 下面是我知道的3个主要(不是全部)。 用户空间进程栈,每个用户空间任务都有自己的栈,这是在任务创build时由mmap()创build的。 内核栈为用户空间任务,每个用户空间任务一个,在do_fork() – > copy_process() – > dup_task_struct() – > alloc_thread_info()内创build并用于system_call。 在arch / x86 / kernel / irq_32.c中定义的每个CPU(2.6之后)的硬件中断堆栈(上半部分): DEFINE_PER_CPU(struct irq_stack *, hardirq_stack); do_IRQ() – > handle_irq() – > execute_on_irq_stack()切换中断堆栈 请让我知道这些是否正确。