内核代码

 1  static int ksoftirqd(void * __bind_cpu)
 2 362 {
 3 363         int bind_cpu = (int) (long) __bind_cpu;
 4 364         int cpu = cpu_logical_map(bind_cpu);
 5 365
 6 366         daemonize();
 7 367         current->nice = 19;
 8 368         sigfillset(&current->blocked);
 9 369
10 370         /* Migrate to the right CPU */
11 371         current->cpus_allowed = 1UL << cpu;
12 372         while (smp_processor_id() != cpu)
13 373                 schedule();
14 374
15 375         sprintf(current->comm, "ksoftirqd_CPU%d", bind_cpu);
16 376
17 377         __set_current_state(TASK_INTERRUPTIBLE);
18 378         mb();
19 379
20 380         ksoftirqd_task(cpu) = current;
21 381
22 382         for (;;) {
23 383                 if (!softirq_pending(cpu))
24 384                         schedule();
25 385
26 386                 __set_current_state(TASK_RUNNING);
27 387
28 388                 while (softirq_pending(cpu)) {
29 389                         do_softirq();
30 390                         if (current->need_resched)
31 391                                 schedule();
32 392                 }
33 393
34 394                 __set_current_state(TASK_INTERRUPTIBLE);
35 395         }
36 396 }
 61 asmlinkage void do_softirq()
 62 {
 63         int cpu = smp_processor_id();
 64         __u32 pending;
 65         unsigned long flags;
 66         __u32 mask;
 67
 68         if (in_interrupt())
 69                 return;
 70
 71         local_irq_save(flags);
 72
 73         pending = softirq_pending(cpu);
 74
 75         if (pending) {
 76                 struct softirq_action *h;
 77
 78                 mask = ~pending;
 79                 local_bh_disable();
 80 restart:
 81                 /* Reset the pending bitmask before enabling irqs */
 82                 softirq_pending(cpu) = 0;
 83
 84                 local_irq_enable();
 85
 86                 h = softirq_vec;
 87
 88                 do {
 89                         if (pending & 1)
 90                                 h->action(h);
 91                         h++;
 92                         pending >>= 1;
 93                 } while (pending);
 94
 95                 local_irq_disable();
 96
 97                 pending = softirq_pending(cpu);
 98                 if (pending & mask) {
 99                         mask &= ~pending;
100                         goto restart;
101                 }
102                 __local_bh_enable();
103
104                 if (pending)
105                         wakeup_softirqd(cpu);
106         }
107
108         local_irq_restore(flags);
109 }
时间: 2024-11-20 00:06:07

内核代码的相关文章

完成一个简单的时间片轮转多道程序内核代码

王康 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 " 分别是1 存储程序计算机工作模型,cpu执行程序的基础流程: 2 函数调用堆栈:各种寄存器和存储主要是为了指令的传取值,通过eip,esp,eax,ebp和程序内存的分区,搭配push pop call return leave等一系列指令完成函数调用操作. 3 中断:多道批程序! 在复习一下上一讲的几个重要指令

驱动相关的内核代码分析

arch\arm\include\asm\Io.h #define __raw_readl(a) (__chk_io_ptr(a), *(volatile unsigned int __force   *)(a)) #define __raw_writel(v,a) (__chk_io_ptr(a), *(volatile unsigned int __force   *)(a) = (v)) 注:(volatile unsigned int __force   *)指针强制转换为unsigne

对一个简单的时间片轮转多道程序内核代码的浅析

这周在网易云课堂上学习了<Linux内核分析>——操作系统是如何工作的.本周学习内容有利用 mykernel 实验模拟计算机平台和利用 mykernel 实验模拟计算机硬件平台两部分内容. 这是实验楼中 mykernel 平台运行的结果: 下面是一段一个简单的时间片轮转多道程序内核代码: 1 /* 2 * linux/mykernel/myinterrupt.c 3 * 4 * Kernel internal my_timer_handler 5 * 6 * Copyright (C) 201

debian内核代码执行流程(一)

本文根据debian开机信息来查看内核源代码. 系统使用<debian下配置dynamic printk以及重新编译内核>中内核源码来查看执行流程. 使用dmesg命令,得到下面的开机信息: [ 0.000000] Initializing cgroup subsys cpuset [ 0.000000] Initializing cgroup subsys cpu [ 0.000000] Linux version 3.2.57 ([email protected]) (gcc versio

linux内核设计的艺术--载入内核代码

在BIOS触发0x19中断将磁盘的第一个扇区(512B)载入到内存中后.计算机才真正開始运行磁盘上的程序.而这512B的程序就是bootsect.s,此时处理器还处于实模式内存寻址的最大范围是1M(0x0000-0xFFFF),接下来我们看看在bootsect.s的第一批代码中做了些什么? </pre><pre name="code" class="cpp">SYSSIZE = 0x3000 //内核程序的大小 SETUPLEN = 4 //

Linux Kernel系列 - 黄牛X内核代码凝视

Hanks.Wang - 专注于操作系统与移动安全研究.Linux-Kernel/SELinux/SEAndroid/TrustZone/Encription/MDM    Mail - [email protected] 牛X的内核代码凝视 大牛的代码质量高稳定性好,并且逻辑清晰易读性比較强,今天看到Linux Kernel红黑树的代码时,瞬间被大牛的代码凝视秒杀了,看到这样凝视的代码真的有阅读的欲望.啥也不说了,上图吧 watermark/2/text/aHR0cDovL2Jsb2cuY3N

Linux0.11内核剖析--内核代码(kernel)--sched.c

1.概述 linux/kernel/目录下共包括 10 个 C 语言文件和 2 个汇编语言文件以及一个 kernel 下编译文件的管理配置文件 Makefile.其中三个子目录中代码注释的将放在后面的文章进行.本文主要对这 13 个代码文件进行注释. 首先我们对所有程序的基本功能进行概括性地总体介绍, 以便一开始就对这 12 个文件所实现的功能和它们之间的相互调用关系有个大致的了解,然后逐一对代码进行详细地注释.本文地址:http://www.cnblogs.com/archimedes/p/l

tcp_tw_recycle检查tcp_timestamps的内核代码

注意:本文档中的内核代码的版本号:linux-4.0.5 /************************************************* * Author : Samson * Date : 07/14/2015 * Test platform: * gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2 * GNU bash, 4.3.11(1)-release (x86_64-pc-linux-gnu) * Nginx version: * Nginx 1

(转):从内核代码聊聊pipe的实现

来源: http://luodw.cc/2016/07/09/pipeof/ 用linux也有两年多了,从命令,系统调用,到内核原理一路学过来,我发现我是深深喜欢上这个系统:使用起来就是一个字"爽":当初在看 linux内核原理时,对linux内核源码有种敬畏的心理,不敢涉入,主要是看不懂,直到最近实习的时候,在某次分享会上,某位老师分享了OOM机制, 我很感兴趣,就去看内核代码,发现,原来我能看懂了:所以想写篇博客,分享下从内核代码分析pipe的实现: 这部分内容说简单也很简单,说难

[转] LINUX内核代码编程规范

这是一个简短的文档,描述了linux内核的首选代码风格.代码风格是因人而异的,而且我 不愿意把我的观点强加给任何人,不过这里所讲述的是我必须要维护的代码所遵守的风格, 并且我也希望绝大多数其他代码也能遵守这个风格.请在写代码时至少考虑一下本文所述的 风格. 首先,我建议你打印一份GNU代码规范,然后不要读它.烧了它,这是一个具有重大象征性 意义的动作. 不管怎样,现在我们开始: 第一章:缩进 制表符是8个字符,所以缩进也是8个字符.有些异端运动试图将缩进变为4(乃至2)个字符 深,这几乎相当于尝