Linux中断太快怎么办(linux中断处理)

纸扎戏偶

本篇文章给大家谈谈Linux中断太快怎么办,以及linux中断处理对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

  • 1、linux0.11的bios中断,该怎么处理
  • 2、linux 中断 下半部 处理时间过长 怎么办
  • 3、Linux内核中断如何避
  • 4、linux vps下文件太多,打包老是中断怎么办?

1、linux0.11的bios中断,该怎么处理

貌似在系统启动后会重新建立中断向量表,LINUX不使用BIOS中的中断向量表。

u-boot做的只是初始化系统启动时需要的硬件环境等等,应该是整个过程都包括,u-boot完成后pc直接指向os的第一行指令开始执行。

------解决方案--------------------

linux系统启动后运行在保护模式下,重新设置的中断门

中断向量表是在实模式下使用的

2、linux 中断 下半部 处理时间过长 怎么办

一、中断处理为什么要下半部?

Linux在中断处理中间中断处理分了上半部和下半部,目的就是提高系统的响应能力和并发能力。通俗一点来讲:当一个中断产生,调用该中断对应的处理程序(上半部)然后告诉系统,对应的后半部可以执行了。然后中断处理程序就返回,下半部会在合适的时机有系统调用。这样一来就大大的减少了中断处理所需要的时间。

二、那些工作应该放在上半部,那些应该放在下半部?

没有严格的规则,只有一些提示:

1、对时间非常敏感,放在上半部。

2、与硬件相关的,放在上半部。

3、不能被其他中断打断的工作,放在上半部。

以上三点之外的,考虑放在下半部。

三、下半部机制在Linux中是怎么实现的?

下半部在Linux中有以下实现机制:

1、BH(在2.5中删除)

2、任务队列(task queue,在2.5删除)

3、软中断(softirq,2.3开始。本文重点)

4、tasklet(2.3开始)

5、工作队列(work queue,2.5开始)

四、软中断是怎么实现的(以下代码出自2.6.32)?

软中断不会抢占另外一个软中断,唯一可以抢占软中断的是中断处理程序。

软中断可以在不同CPU上并发执行(哪怕是同一个软中断)

1、软中断是编译期间静态分配的,定义如下:

struct softirq_action { void (*action)(struct softirq_action *); };

/*

* PLEASE, avoid to allocate new softirqs, if you need not _really_ high

* frequency threaded job scheduling. For almost all the purposes

* tasklets are more than enough. F.e. all serial device BHs et

* al. should be converted to tasklets, not to softirqs.

*/

enum {

HI_SOFTIRQ=0,

TIMER_SOFTIRQ,

NET_TX_SOFTIRQ,

NET_RX_SOFTIRQ,

BLOCK_SOFTIRQ,

BLOCK_IOPOLL_SOFTIRQ,

TASKLET_SOFTIRQ,

SCHED_SOFTIRQ,

HRTIMER_SOFTIRQ,

RCU_SOFTIRQ, /* Preferable RCU should always be the last softirq */

NR_SOFTIRQS

};

/*

* map softirq index to softirq name. update 'softirq_to_name' in * kernel/softirq.c when adding a new softirq.

*/

extern char *softirq_to_name[NR_SOFTIRQS];

static struct softirq_action softirq_vec[NR_SOFTIRQS] __cacheline_aligned_in_smp;

说明:

(1)、软中断的个数书上说是32,看来到这个版本已经发生变化了。

(2)、void (*action)(struct softirq_action *);传递整个结构体指针在于当结构体成员发生变化是,接口不变。

2、系统执行软中断一个注册的软中断必须被标记后才会执行(触发软中断),通常中断处理程序会在返回前标记它的软中断。在下列地方,待处理的软中断会被执行:

(1)、从一个硬件中断代码处返回。

(2)、在ksoftirqd内核线程。

(3)、在那些显示检查和执行待处理的软中断代码中。

ksoftirqd说明:

每个处理器都有一个这样的线程。所有线程的名字都叫做ksoftirq/n,区别在于n,它对应的是处理器的编号。在一个双CPU的机器上就有两个这样的线程,分别叫做ksoftirqd/0和ksoftirqd/1。为了保证只要有空闲的处理器,它们就会处理软中断,所以给每个处理器都分配一个这样的线程。

执行软中断的代码如下:

asmlinkage void __do_softirq(void)

{

struct softirq_action *h;

__u32 pending;

int max_restart = MAX_SOFTIRQ_RESTART;

int cpu;

pending = local_softirq_pending();

account_system_vtime(current);

__local_bh_disable((unsigned long)__builtin_return_address(0));

lockdep_softirq_enter();

cpu = smp_processor_id();

restart:

/* Reset the pending bitmask before enabling irqs */

set_softirq_pending(0);

local_irq_enable();

h = softirq_vec;

do {

if (pending 1) {

int prev_count = preempt_count();

kstat_incr_softirqs_this_cpu(h - softirq_vec);

trace_softirq_entry(h, softirq_vec);

h-action(h);

trace_softirq_exit(h, softirq_vec);

if (unlikely(prev_count != preempt_count())) {

printk(KERN_ERR "huh, entered softirq %td %s %p"

"with preempt_count %08x,"

" exited with %08x?\n", h - softirq_vec,

softirq_to_name[h - softirq_vec],

h-action, prev_count, preempt_count());

preempt_count() = prev_count;

}

rcu_bh_qs(cpu);

}

h++;

pending = 1;

} while (pending);

local_irq_disable();

pending = local_softirq_pending();

if (pending --max_restart)

goto restart;

if (pending)

wakeup_softirqd();

lockdep_softirq_exit();

account_system_vtime(current);

_local_bh_enable();

}

3、编写自己的软中断

(1)、分配索引,在HI_SOFTIRQ与NR_SOFTIRQS中间添加自己的索引号。

(2)、注册处理程序,处理程序:open_softirq(索引号,处理函数)。

(3)、触发你的软中断:raise_softirq(索引号)。

4、软中断处理程序注意

(1)、软中断处理程序执行的时候,允许响应中断,但自己不能休眠。

(2)、如果软中断在执行的时候再次触发,则别的处理器可以同时执行,所以加锁很关键。

3、Linux内核中断如何避

首先我阐明一下,用锁的情况只有两种:

线程

文件

内核程序在使用的时候也脱离不了这两种锁的概念。

中断,是信号,是否要处理中断信号?或者产生中断信号?

对信号来说只有:

信号屏蔽、信号捕捉、信号排队、可重如函数等概念。

你想问的问题,我没猜测,在处理某个信号时,不想让其他信号中断,那么使用信号屏蔽字:

先设置要屏蔽的信号集,要保存的信号集,初始信号集,可供协调使用的函数有几个:

#include signal.h

signal(这个不建议使用,应为有些老的实现是有问题的),设置信号处理程序

sig_atomic_t 数据类型

sigprocmask,设置信号屏蔽字

sigaction,设置信号处理程序,功能跟强悍,可控性更好

sigsuspend,以原子性方式,等待某些信号发生,然后返回

你具体要做啥不清楚,但使用上面的信号相关的函数,肯定能实现你的功能。参考APUE的论述。

4、linux vps下文件太多,打包老是中断怎么办?

你是说 web 上打包中断?

vps 一般可以 ssh 上去吧,用 tar 命令可以将文件夹打包,例如

tar cvzf myweb.tar.gz /www

解包命令是

tar zxvf myweb.tar.gz

关于Linux中断太快怎么办和linux中断处理的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

文章版权声明:除非注明,否则均为我爱教程术原创文章,转载或复制请以超链接形式并注明出处。