`
isiqi
  • 浏览: 16060239 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Kernel硬件中断的初始化流程

阅读更多

Kernel硬件中断的初始化流程

Porting kernel到一个全新的开发板时,通常hardware irq的初始化函数是要我们自己实现的。
那我们实现了自己硬件的中断初始化函数之后,内核是如何调用到它的呢?内核有自己的一套支持多平台的架构。

下面我们分析内核中断初始化的过程以及如何调用到一个新平台的irq初始化函数。
这里我们以s3c2410平台为例,他的中断初始化函数定义在:

/* arch/arm/mach-s3c2410/irq.c */
void __init s3c24xx_init_irq(void)
{
……
}

在arch/arm/mach-s3c2410/mach-smdk2410.c内通过MACHINE_START宏将s3c24xx_init_irq赋值给mach_desc结构体的.init_irq成员。

MACHINE_START(SMDK2410, "SMDK2410") /* @TODO: request a new identifier and switch
* to SMDK2410 */
/* Maintainer: Jonas Dietsche */
.phys_io = S3C2410_PA_UART,
.io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
.boot_params = S3C2410_SDRAM_PA + 0x100,
.map_io = smdk2410_map_io,
.init_irq = s3c24xx_init_irq,
.init_machine = smdk_machine_init,
.timer = &s3c24xx_timer,
MACHINE_END

注:MACHINE_START宏的作用是对mach_desc结构体进行初始化。mach_desc里定义了一些关键的体系架构相关的函数。Porting kernel到新平台时,这个结构体是非常关键的。

init_irq这个成员在系统初始化的时候会被赋值给init_arch_irq全局变量,如下:

/* arch/arm/kernel/setup.c */
void __init setup_arch(char **cmdline_p)
{
……
cpu_init();
/*
* Set up various architecture-specific pointers
*/
init_arch_irq = mdesc->init_irq;
system_timer = mdesc->timer;
init_machine = mdesc->init_machine;
……
}

注:可以看到这里不仅初始化了init_arch_irq 全局变量,同时初始化了system_timer,init_machine等全局变量。这是kernel支持多平台的一种机制。当然这里system_timer和init_machine我不多描述,有兴趣的可以大家自己去看。机制和init_arch_irq大同小异。

init_arch_irq函数指针定义在体系架构无关的arch/arm/kernel/irq.c内
/* arch/arm/kernel/irq.c */
void (*init_arch_irq)(void) __initdata = NULL;

并且在init_IRQ函数内会去执行它。

/* arch/arm/kernel/irq.c */
void __init init_IRQ(void)
{
int irq;
for (irq = 0; irq < NR_IRQS; irq++)
irq_desc[irq].status |= IRQ_NOREQUEST | IRQ_DELAYED_DISABLE |
IRQ_NOPROBE;
#ifdef CONFIG_SMP
bad_irq_desc.affinity = CPU_MASK_ALL;
bad_irq_desc.cpu = smp_processor_id();
#endif
init_arch_irq();
}

那init_IRQ在哪里被调用呢? 我们猜想肯定是在系统初始化的时会调用它。

实际结果也正是,init_IRQ会在init/main.c里的start_kernel函数内被调用:
asmlinkage void __init start_kernel(void)
{
……
trap_init();
rcu_init();
init_IRQ();
pidhash_init();
clockevents_init();
init_timers();
……
}
这样,我们定义的新平台irq初始化函数就会在系统启动时被调用,对我们的硬件中断进行初始化后再去使用它。这里搞清楚了,再porting其他东西如GP Timer Driver等到新平台就变得清晰多了。

分享到:
评论

相关推荐

    linux源码分析之cpu初始化 kernel/head.s

    linux源码分析之cpu初始化 kernel/head.s

    疯狂内核之——内核初始化

    5.10.3 软中断初始化 268 5.10.4 初始化定时器中断 271 5.11 走进start_kernel尾声 273 5.11.1 初始化slab的后续工作 273 5.11.2 启动console 275 5.11.3 一些简单的函数 276 5.11.4 校准CPU时钟速度 279 5.11.5 ...

    操作系统的初始化

    系统开始运行 start_kernel( ) function rest_init init 启动步骤 bootsect setup.S 操作系统的初始化

    IRQ hierarchy的初始化及构建过程详解

    IRQ hierarchy的初始化及构建过程详解

    keras之权重初始化方式

    不同的层可能使用不同的关键字来传递初始化方法,一般来说指定初始化方法的关键字是kernel_initializer 和 bias_initializer model.add(Dense(64, kernel_initializer=initializers.random_normal(stddev=0.01))) #...

    8-Linux内存初始化之-启用分页机制.pdf

    kernel-travel Linux内存初始化之-启用分页机制

    RHEL开机流程.pdf

    八、介绍 Run Level (init 初始化流程第一步) 九、介绍 /etc/rc.d/rc.sysinit 这个程序主要做哪些工作 十、介绍 /etc/rc.d/rc 这个程式的作用 十一、介绍 Daemon Processes (Process 进程) 十二、介绍 System V 程...

    Android 系统 Linux系统 内核kernel启动流程 init 进程介绍

    Android 系统 Linux系统 内核kernel启动流程 init 进程介绍,init进程初始化,内核启动三个阶段深入浅出介绍,简单易懂 。kernel_init() 函数介绍,ramdisk_execute_command,execute_command /sbin/init,/etc/init,...

    新唐NUC977开发板kernel代码解析1-启动流程

    新唐NUC977开发板kernel代码解析1-启动流程 新唐NUC977开发板kernel代码解析1-启动流程

    kernel里面的中断代码分析

    1.1 涉及到的代码简单分析 1.2 中断处理函数是...(转载的,参考,了解流程即可,具体代 码不必深究) 1.3 s3c2410 里面的中断控制器的细节分析,以及general 的中断原理 1.4 外部中断控制器的分析(与GPIO有关)

    系统初始化相关脚本分析.rar

    linux启动的流程是: 载入BIOS信息; 读取MBR; 载入kernel; kernel执行init; init执行rc.sysinit 启动内核外挂模块modules.conf 后面省略了。 本脚本主要是介绍rc.sysinit这个脚本及在这个脚本中调用到得...

    xinhua_3.zip

    七、iniit 初始化流程图 八、介绍 Run Level (init 初始化流程第一步) 九、介绍 /etc/rc.d/rc.sysinit 这个程序主要做哪些工作 十、介绍 /etc/rc.d/rc 这个程式的作用 十一、介绍 Daemon Processes (Process 进程)...

    从设备树构建kernel驱动platform_device的流程.pdf

    《Linux与SoC》公众号上下载的资料,写的很好,大家可以参考

    linux_kernel启动过程

    linux_kernel启动过程资料整理,详细分析,你可以完全明白linux kernel的详细启动过程

    Android kernel到App流程代码

    包括kernel代码, HAL层代码,framworks代码 ,App代码,和一份word说明文档,自己工作中记录的,对整体了解系统非常有帮助,

    Windows Kernel Programming (2019).pdf

    There is nothing like the power of the kernel in Windows - but how do you write kernel drivers to take advantage of that power? This book will show you how.The book describes software kernel drivers ...

    Linux-Kernel官方文档.pdf

    3882页Linux Kernel Documentation; Linux Kernel官方文档

    redhat7.2之kernel-devel&&kernel;-headers

    redhat7.2中的kernel-devel-3.10.0-327.el7.x86_64.rpm&&kernel;-headers-3.10.0-327.4.5.el7.x86_64.rpm直接yum安装,以便安装NVIDIA驱动

    Yocto Kernel编译过程分析完整log

    3. 《[【SemiDrive源码分析】【Yocto源码分析】03 - yocto/meta-semidrive目录及Yocto Kernel编译过程分析(上)](https://ciellee.blog.csdn.net/article/details/124566955)》 4. 《[【SemiDrive源码分析】...

    KERNEL32 API函数

    一个非常全的KERNEL32[1].DLL API函数库文档。

Global site tag (gtag.js) - Google Analytics