瑞典网站后缀网站建设项目选题
2026/4/18 13:10:54 网站建设 项目流程
瑞典网站后缀,网站建设项目选题,广州市安全平台,英文网页设计欣赏嵌入式Linux软件中断概述 一、软件中断概述 软件中断#xff08;SoftIRQ#xff09;是Linux内核中中断处理的下半部机制#xff0c;用于延迟处理非紧急的中断任务#xff0c;平衡系统实时性和吞吐量。 1.1 软件中断特点 延迟执行#xff1a;在中断上下文中标记#xff0c…嵌入式Linux软件中断概述一、软件中断概述软件中断SoftIRQ是Linux内核中中断处理的下半部机制用于延迟处理非紧急的中断任务平衡系统实时性和吞吐量。1.1 软件中断特点延迟执行在中断上下文中标记在合适时机处理可抢占处理过程中可以被更高优先级任务抢占多核并行每个CPU有独立的软件中断处理优先级机制HI_SOFTIRQ优先级最高RCU_SOFTIRQ最低1.2 软件中断类型软中断类型编号说明典型用途HI_SOFTIRQ0高优先级tasklet高实时性要求任务TIMER_SOFTIRQ1定时器处理时钟中断下半部NET_TX_SOFTIRQ2网络发送网络数据包发送NET_RX_SOFTIRQ3网络接收网络数据包接收(NAPI)BLOCK_SOFTIRQ4块设备块设备I/O完成IRQ_POLL_SOFTIRQ5IRQ轮询中断轮询机制TASKLET_SOFTIRQ6普通tasklet一般延迟任务SCHED_SOFTIRQ7调度负载均衡和调度HRTIMER_SOFTIRQ8高精度定时器高精度时钟处理RCU_SOFTIRQ9RCU回调RCU延迟释放二、软件中断核心数据结构2.1 软件中断向量表c// 软件中断处理函数定义struct softirq_action {void (*action)(struct softirq_action *);};// 全局软中断向量表每个CPU独立static struct softirq_action softirq_vec[NR_SOFTIRQS]__cacheline_aligned_in_smp;2.2 每CPU软件中断状态c// 每个CPU的软中断状态typedef struct {unsigned int __softirq_pending; // 挂起的软中断位图unsigned int ipi_pending; // IPI中断} irq_cpustat_t;DECLARE_PER_CPU_SHARED_ALIGNED(irq_cpustat_t, irq_stat);2.3 Tasklet数据结构c// Tasklet结构体struct tasklet_struct {struct tasklet_struct *next; // 链表指针unsigned long state; // 状态位atomic_t count; // 引用计数void (*func)(unsigned long); // 处理函数unsigned long data; // 函数参数};// Tasklet状态定义enum {TASKLET_STATE_SCHED, // Tasklet已调度TASKLET_STATE_RUN, // Tasklet正在运行};三、软件中断执行流程3.1 完整执行流程图┌─────────────────┐│ 硬件中断触发 │└────────┬────────┘│▼┌─────────────────┐│ 硬件中断处理程序 │└────────┬────────┘│▼┌─────────────────┐│ raise_softirq() │└────────┬────────┘│▼┌─────────────────┐│ 设置pending位图 │└────────┬────────┘│▼┌─────────────────┐│ irq_exit() │└────────┬────────┘├────────────────────────────┐│是否需要立即处理? │▼ │┌─────────────────┐ ││ invoke_softirq()│ │└────────┬────────┘ ││ │▼ │┌─────────────────┐ ││ __do_softirq() │ │└────────┬────────┘ ││ │▼ │┌─────────────────┐ ││ 处理pending软中断 │ │└─────────────────┘ ││ ││ │▼ │┌─────────────────┐ ││ wakeup_softirqd()│◀─────────────────┘└────────┬────────┘│▼┌─────────────────┐│ ksoftirqd线程唤醒 │└────────┬────────┘│▼┌─────────────────┐│ run_ksoftirqd() │└────────┬────────┘│▼┌─────────────────┐│ __do_softirq() │└─────────────────┘3.2 详细执行步骤步骤1硬件中断触发软件中断c// 硬件中断处理中触发软件中断irqreturn_t handle_irq_event(struct irq_desc *desc){// … 硬件中断处理 …// 触发对应的软件中断if (need_softirq) {__raise_softirq_irqoff(softirq_nr);}return IRQ_HANDLED;}步骤2中断退出路径cvoid irq_exit(void){// … 中断退出处理 …// 检查并处理软件中断if (!in_interrupt() local_softirq_pending())invoke_softirq();}步骤3决定处理方式cstatic inline void invoke_softirq(void){if (force_irqthreads) {// 强制使用线程化处理wakeup_softirqd();} else {// 如果ksoftirqd正在运行唤醒它if (__this_cpu_read(ksoftirqd) __this_cpu_read(ksoftirqd)-state TASK_RUNNING)wakeup_softirqd();else__do_softirq(); // 直接处理}}四、软件中断处理机制4.1 __do_softirq() 核心处理casmlinkage __visible void __do_softirq(void){unsigned long end jiffies MAX_SOFTIRQ_TIME; // 时间限制int max_restart MAX_SOFTIRQ_RESTART; // 重启次数限制__u32 pending;// 1. 获取pending的软中断pending local_softirq_pending();// 2. 进入软中断上下文__local_bh_disable_ip(RET_IP, SOFTIRQ_OFFSET);restart:// 3. 清除pending位允许新中断set_softirq_pending(0);// 4. 开启本地中断local_irq_enable();// 5. 处理所有pending的软中断h softirq_vec;while ((softirq_bit ffs(pending))) {unsigned int vec_nr softirq_bit - 1;// 执行软中断处理函数 h-action(h); h; pending softirq_bit;}// 6. 关闭本地中断local_irq_disable();// 7. 检查是否有新的软中断pending local_softirq_pending();if (pending) {// 如果未超时且不需要调度重启处理if (time_before(jiffies, end) !need_resched() –max_restart)goto restart;// 否则唤醒ksoftirqd线程 wakeup_softirqd();}// 8. 退出软中断上下文__local_bh_enable(SOFTIRQ_OFFSET);}4.2 软件中断初始化cvoid __init softirq_init(void){int cpu;// 为每个CPU初始化tasklet链表for_each_possible_cpu(cpu) {per_cpu(tasklet_vec, cpu).tail per_cpu(tasklet_vec, cpu).head;per_cpu(tasklet_hi_vec, cpu).tail per_cpu(tasklet_hi_vec, cpu).head;}// 注册各软中断类型的处理函数open_softirq(TASKLET_SOFTIRQ, tasklet_action);open_softirq(HI_SOFTIRQ, tasklet_hi_action);open_softirq(TIMER_SOFTIRQ, run_timer_softirq);open_softirq(NET_TX_SOFTIRQ, net_tx_action);open_softirq(NET_RX_SOFTIRQ, net_rx_action);// … 其他软中断注册}五、ksoftirqd内核线程5.1 ksoftirqd线程定义c// SMP热插拔线程定义static struct smp_hotplug_thread softirq_threads {.store ksoftirqd, // 每CPU线程指针.thread_should_run ksoftirqd_should_run, // 运行条件.thread_fn run_ksoftirqd, // 线程函数.thread_comm “ksoftirqd/%u”, // 线程名称.setup ksoftirqd_setup, // 设置函数.cleanup ksoftirqd_cleanup, // 清理函数};5.2 ksoftirqd线程函数cstatic void run_ksoftirqd(unsigned int cpu){// 设置线程名称和调度参数snprintf(current-comm, sizeof(current-comm), “ksoftirqd/%u”, cpu);sched_set_fifo_low(current);while (!kthread_should_stop()) {// 1. 检查是否有pending的软中断if (!local_softirq_pending()) {// 无pending进入睡眠set_current_state(TASK_INTERRUPTIBLE);schedule();continue;}__set_current_state(TASK_RUNNING); // 2. 处理软中断 do { __do_softirq(); } while (!kthread_should_stop() local_softirq_pending()); // 3. 让出CPU cond_resched(); set_current_state(TASK_INTERRUPTIBLE);}__set_current_state(TASK_RUNNING);}5.3 嵌入式系统调优配置cstatic int ksoftirqd_setup(unsigned int cpu){struct sched_param param { .sched_priority 1 };struct task_struct *tsk per_cpu(ksoftirqd, cpu);cpumask_t cpumask;// 1. 设置实时优先级sched_setscheduler_nocheck(tsk, SCHED_FIFO, param);// 2. 设置CPU亲和性绑定到小核cpumask_clear(cpumask);if (cpu_is_little(cpu))cpumask_set_cpu(cpu, cpumask);elsecpumask_set_cpu(get_little_core(), cpumask);set_cpus_allowed_ptr(tsk, cpumask);// 3. 设置nice值set_user_nice(tsk, -10);return 0;}六、Tasklet机制6.1 Tasklet执行流程┌─────────────┐│tasklet初始化 │└──────┬──────┘│▼┌─────────────┐│tasklet_schedule│└──────┬──────┘│▼┌─────────────┐│ 设置SCHED状态 │└──────┬──────┘│▼┌─────────────┐│ 添加到CPU链表 │└──────┬──────┘│▼┌─────────────┐│ 触发软中断 │└──────┬──────┘│▼┌─────────────┐│tasklet_action│└──────┬──────┘│▼┌─────────────┐│ 执行处理函数 │└─────────────┘6.2 Tasklet调度与处理c// Tasklet调度void __tasklet_schedule(struct tasklet_struct *t){unsigned long flags;local_irq_save(flags);// 添加到per-CPU链表t-next NULL;*__this_cpu_read(tasklet_vec.tail) t;__this_cpu_write(tasklet_vec.tail, (t-next));// 触发TASKLET_SOFTIRQraise_softirq_irqoff(TASKLET_SOFTIRQ);local_irq_restore(flags);}// Tasklet处理static __latent_entropy void tasklet_action(struct softirq_action *a){struct tasklet_struct *list;// 获取当前CPU的tasklet链表local_irq_disable();list __this_cpu_read(tasklet_vec.head);__this_cpu_write(tasklet_vec.head, NULL);__this_cpu_write(tasklet_vec.tail, this_cpu_ptr(tasklet_vec.head));local_irq_enable();// 处理所有taskletwhile (list) {struct tasklet_struct *t list;list list-next;if (tasklet_trylock(t)) { if (!atomic_read(t-count)) { // 执行tasklet处理函数 t-func(t-data); tasklet_unlock(t); continue; } tasklet_unlock(t); } // 重新调度未处理的tasklet local_irq_disable(); t-next NULL; *__this_cpu_read(tasklet_vec.tail) t; __this_cpu_write(tasklet_vec.tail, (t-next)); __raise_softirq_irqoff(TASKLET_SOFTIRQ); local_irq_enable();}}七、嵌入式系统优化策略7.1 CPU亲和性配置bash将ksoftirqd绑定到特定CPUtaskset -p 1 $(pidof ksoftirqd/0) # 绑定到CPU0taskset -p 2 $(pidof ksoftirqd/1) # 绑定到CPU1将网络中断绑定到特定CPUecho 2 /proc/irq/100/smp_affinity # IRQ 100绑定到CPU17.2 内核参数调优bash调整网络软中断处理预算echo 600 /proc/sys/net/core/netdev_budgetecho 60000 /proc/sys/net/core/netdev_budget_usecs启用RPSReceive Packet Steeringecho f /sys/class/net/eth0/queues/rx-0/rps_cpus设置实时优先级chrt -f 50 $(pidof ksoftirqd/0)chrt -f 50 $(pidof ksoftirqd/1)7.3 负载均衡策略c// 软中断负载均衡static void migrate_softirq(int src_cpu, int dst_cpu){unsigned int pending per_cpu(irq_stat, src_cpu).__softirq_pending;int i;for_each_set_bit(i, pending, NR_SOFTIRQS) {// 迁移可迁移的软中断if (softirq_vec[i].migratable) {per_cpu(irq_stat, src_cpu).__softirq_pending ~(1 i);per_cpu(irq_stat, dst_cpu).__softirq_pending | (1 i);wake_up_process(per_cpu(ksoftirqd, dst_cpu));}}}八、网络软中断(NAPI)8.1 NAPI处理流程cstatic __latent_entropy void net_rx_action(struct softirq_action *h){struct softnet_data *sd this_cpu_ptr(softnet_data);unsigned long time_limit jiffies 2;int budget netdev_budget;LIST_HEAD(list);// 获取poll列表list_splice_init(sd-poll_list, list);while (!list_empty(list)) {struct napi_struct *n;// 检查预算和时间 if (unlikely(budget 0 || time_after_eq(jiffies, time_limit))) goto softnet_break; n list_first_entry(list, struct napi_struct, poll_list); // 执行NAPI poll函数 int work n-poll(n, budget); budget - work; if (work budget) { // 处理完成 list_del(n-poll_list); napi_complete_done(n, work); }}return;softnet_break:// 将未处理的设备放回列表list_splice_tail(list, sd-poll_list);// 触发下一次软中断__raise_softirq_irqoff(NET_RX_SOFTIRQ);}九、实时性优化9.1 实时补丁(RT-Preempt)支持cifdef CONFIG_PREEMPT_RT// 实时补丁中的软中断线程化struct softirq_thread {struct task_struct *thread;struct sched_param param;int cpu;wait_queue_head_t wait;bool running;};static DEFINE_PER_CPU(struct softirq_thread, softirq_threads);// 实时补丁中的软中断处理static int softirq_thread_fn(void *data){struct softirq_thread *sirq data;sched_setscheduler_nocheck(current, SCHED_FIFO, sirq-param);set_cpus_allowed_ptr(current, cpumask_of(sirq-cpu));while (!kthread_should_stop()) {wait_event_interruptible(sirq-wait,kthread_should_stop() ||local_softirq_pending() sirq-softirq_mask);sirq-running true; sirq-handler(); sirq-running false;}return 0;}endif9.2 延迟测量c// 软中断延迟测量struct softirq_latency {ktime_t enter_time;ktime_t exit_time;unsigned int max_latency_ns;unsigned int total_latency_ns;unsigned int count;};static DEFINE_PER_CPU(struct softirq_latency[NR_SOFTIRQS], softirq_latencies);static inline void softirq_enter(int nr){struct softirq_latency *lat per_cpu(softirq_latencies, smp_processor_id())[nr];lat-enter_time ktime_get();}static inline void softirq_exit(int nr){struct softirq_latency *lat per_cpu(softirq_latencies, smp_processor_id())[nr];ktime_t delta ktime_sub(ktime_get(), lat-enter_time);unsigned int delta_ns (unsigned int)ktime_to_ns(delta);lat-total_latency_ns delta_ns;lat-count;if (delta_ns lat-max_latency_ns)lat-max_latency_ns delta_ns;// 延迟超限警告if (delta_ns SOFTIRQ_LATENCY_WARN_THRESHOLD_NS) {printk_deferred_once(KERN_WARNING“softirq %d (%s) took %u ns\n”,nr, softirq_to_name[nr], delta_ns);}}十、监控与调试10.1 监控命令bash查看软中断统计cat /proc/softirqs输出示例CPU0 CPU1HI: 5 2TIMER: 123456 789012NET_TX: 123 456NET_RX: 456789 123456BLOCK: 12 34TASKLET: 56 78SCHED: 234567 345678HRTIMER: 12 34RCU: 789012 456789查看ksoftirqd线程状态ps -eLo pid,tid,psr,pcpu,pri,rtprio,ni,policy,stat,wchan:20,comm | grep ksoftirq输出示例PID TID PSR %CPU PRI RTPRIO NI POLICY STAT WCHAN COMMAND12 12 0 1.2 20 - 0 SCHED S smp_call_function ksoftirqd/013 13 1 0.8 20 - 0 SCHED S smp_call_function ksoftirqd/1跟踪软中断事件echo 1 /sys/kernel/debug/tracing/events/irq/softirq_entry/enableecho 1 /sys/kernel/debug/tracing/events/irq/softirq_exit/enablecat /sys/kernel/debug/tracing/trace_pipe10.2 性能分析bashCPU使用率分析包含软中断mpstat -P ALL 1输出示例12:00:00 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle12:00:01 all 5.2 0.0 3.1 0.2 0.1 1.5 0.0 0.0 0.0 89.912:00:01 0 6.1 0.0 4.2 0.3 0.2 2.1 0.0 0.0 0.0 87.112:00:01 1 4.3 0.0 2.0 0.1 0.0 0.9 0.0 0.0 0.0 92.7查看系统中断统计cat /proc/interrupts查看网络软中断统计cat /proc/net/softnet_stat十一、常见问题排查11.1 软中断负载过高bash检查哪个CPU软中断负载高watch -n 1 ‘cat /proc/softirqs’检查网络软中断watch -n 1 ‘cat /proc/net/softnet_stat | column -t’检查ksoftirqd线程状态top -H -p $(pgrep ksoftirqd)使用perf分析软中断热点perf record -g -a -e irq:softirq_entry sleep 10perf report11.2 实时性问题排查bash检查实时延迟cyclictest -t1 -p 80 -n -i 10000 -l 10000跟踪软中断延迟echo 1 /sys/kernel/debug/tracing/events/irq/softirq_raise/enableecho 1 /sys/kernel/debug/tracing/events/irq/softirq_entry/enableecho 1 /sys/kernel/debug/tracing/events/irq/softirq_exit/enablecat /sys/kernel/debug/tracing/trace_pipe /tmp/softirq_trace.txt分析延迟分布trace-cmd report -i /tmp/softirq_trace.txt | grep “softirq” |awk ‘{print $5}’ | sort -n | uniq -c十二、总结12.1 关键要点分层处理机制硬件中断 → 软件中断 → ksoftirqd线程实时性平衡中断上下文中快速标记线程上下文中长时间处理多核优化每个CPU有独立的软中断处理支持负载均衡可配置性通过内核参数和调度策略优化性能监控完善通过/proc、调试接口和跟踪点全面监控12.2 嵌入式系统注意事项CPU亲和性合理绑定中断和线程到特定CPU实时性配置根据应用需求设置优先级和调度策略资源限制在资源受限环境中合理配置预算和时间限制功耗管理与CPU空闲状态和电源管理机制协同工作理解Linux软件中断的实现机制和执行流程对于嵌入式系统开发和性能优化至关重要。通过合理的配置和调优可以在保证实时性的同时提高系统吞吐量。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询