`
xitong
  • 浏览: 6158841 次
文章分类
社区版块
存档分类
最新评论

linux内核阅读总结

 
阅读更多
接着上篇CFS学习总结,下面对很久前看的一些Linux内核的主要模块写了个简单的总结,本总结个人针对某个模块的回忆,并不针对源码,主要目的是一方面加强自己的记忆,另一方面提炼出一些东西与大家分享(有时候代码看多了,对某个模块反而没有了一个整体的概念)。

一、Linux启动过程分析

Linux的启动过程可以分为四个阶段:系统上电阶段,BIOS阶段,引导程序阶段,Linux内核阶段。

(1)系统上电阶段

对于x86体系结构来说,CPU上电后,eip = 0xffff fff0, CPU执行eip指向的指令,通常这是条跳转指令,即跳转到BIOS的入口。

(2)BIOS阶段

BIOS主要完成两个功能:加电自检,即POST(Power On Self Test)和加载内核引导程序,这里特指MBR(Master Boot Record主引导记录区512字节),POST过程主要完成系统硬件的检测,比如内存检测,系统总线检测等。

(3)引导程序阶段

这里说的内核引导程序包括两部分:MBR中的主引导程序和活动分区中的次引导程序。MBR中的主引导程序包含446字节的程序和64字节的磁盘分区表,主引导程序会扫描磁盘分区表,寻找活动的磁盘分区,将活动分区中的次引导程序加载到内存执行,次引导程序负责完成加载内核的任务。

(4)Linux内核阶段

内核被加载到内存后,首先为内核的运行做前期的准备,主要包括以下几个主要步骤:

  • 设置c程序运行的堆栈
  • 清空BSS段
  • 设置中断描述符表(IDT)
  • 设置全局描述符表(GDT)
  • 置位CR0的PE位,开启保护模式(保护模式开启后必须紧跟一条长跳转指令,用来清空指令预取队列,并重新设置%CS段寄存器)
  • 调用内核解压函数– decompress_kernel(),并跳转到解压内核的入口
  • 设置CR0的PG位,开启分页机制

基本的思想就是在内存中找一块安全的内存区,通常在内核数据段或堆结束的地方,在这段内存中将物理地址0开始的一段内存同时映射虚拟地址空间的0xC000 0000和0x0000 0000开始的地址处。

  • 跳转到start_kernel
二、Linux系统调用执行流程

Linux系统调用的执行流程可以描述为:

(1)应用程序调用C库中的函数

(2)C库函数的实现为触发int 0x80系统调用中断,系统调用号在%eax中

(3)操作系统拿中断向量号0x80查询中断向量表,执行对应的中断处理函数

(4)中断处理函数拿系统调用号%eax查询系统调用表,执行相应的系统调用

(5)系统调用执行完成后返回应用程序


三、Linux中断分类和中断处理过程

中断的初始化主要包括:中断向量表的初始化,中断数组的初始化,中断处理函数的注册等。


中断产生和处理过程中硬件执行的操作:

设备通过中断请求线(IRQ线)向中断控制器发送一个中断信号,中断控制器接收到中断信号后,一方面经过译码电路将中断信号转化为中断号,保存在指定的IO ports中,另一方面通过与CPU的INTR管脚直接相连的INT线向CPU发送中断信号;

CPU收到中断信号后,等执行完当前指令,在执行下一条指令前,去检查有无中断处于Pending状态,如果有,通过INTA向中断控制器发送响应信号,并将中断号通过Data Line取回,然后读取IDT表,获得该中断号对应的IDT表中的第i项,然后根据IDT[i]描述符中指定的段选择子,去GDT表中查找,获得中断处理程序的基址,然后用基址+IDT[i]中指定的中断处理程序的偏移地址,来获得中断处理程序的地址,当然,在读取IDT和GDT表时还会有一些安全性检查。

CPU去判断有没有发生特权级的变化(用户态陷入内核态),如果有,通过tr寄存器获得TSS段的基址,从中读取内核态堆栈的ss和esp,此时就将用户态的堆栈切换到了内核态的堆栈,接着将用户态的ss和esp保存在内核堆栈中,如果此中断的类型是故障(fault),则重新修改cs和eip的值为产生中断的这条指令的地址,以便中断处理完成后,重新执行这条指令。然后,在内核栈中保存eflags,cs和eip的值,如果有硬件出错码,也将其保存到堆栈上,最后将cs:eip的值赋值为中断处理函数的基址+IDT[i]的偏移。

从用户态进入中断与从内核态进入中断的堆栈示意图如下。


IDT表的初始化:通过set_intr_gate()和trap_init(),后者用于初始化20个异常和一个系统调用相关的中断0x80。

在init_IRQ()中通过循环调用set_intr_gate(vector,interrupt[i])来初始化vector对应的IDT表项,这里的interrupt[256]数组,通过下面的代码把所有中断的处理函数都定义为统一的入口:common_interrupt。

体系结构无关的中断处理过程:do_IRQ()。

irq_desc数据包含了224个irq_desc_t描述符,每一个中断号对应一个描述符,这个描述符中的action链表,它指向irqaction的数据结构,代表这个中断对应的处理函数,共享同一中断向量的所有的处理函数都挂在这个链表上,通过遍历这个链表,并查是否要是设备注册的处理函数(dev_id)。

软中断(softirq)由内核静态分配,在编译时就确定了,个数有限,目前内核支持8/9个,具有优先级,主要与定时器,网络包的收发,块设备,调度,Tasklet等有关。在特定的点检查有无可执行的软中断:

(1)local_bh_enable重新激活软中断时

(2)do_IRQ完成中断处理过程后

(3)ksoftirqd被唤醒时

Tasklet是I/O驱动程序中实现可延迟函数的首选,建立在软中断HI_SOFTIRQ和TASKLET_SOFTIRQ之上,二者的区别是优先级不同,这两种Tasklet由对应的数组tasklet_vec和tasklet_hi_vec来管理,数组的每一项对应一个CPU,即tasklet是与CPU绑定的。

Workqueue由工作队列和工作者线程两部分构成,工作者线程会定期的扫描工作队列有无可处理的任务,软中断和tasklet运行在中断上下文,所以不可睡眠,workquue运行在进程上下文,可睡眠。


分享到:
评论

相关推荐

    《Linux内核精髓:精通Linux内核必会的75个绝技》迷你书

    鉴于此,《Linux内核精髓:精通Linux内核必会的75个绝技》选取了资源管理(CPU、内存、进程等)、文件系统、网络、虚拟化、省电、调试、概要分析...,总结出了75个能有助于读者深刻理解Linux内核精髓的技巧和最佳实践...

    Linux2.6内核总结

    Linux2.6内核总结,供大家学习参考。。

    linux内核总结,一份详细的资料

    linux内核总结,帮你好好学习linux

    Linux内核阅读

    读核感悟-Linux内核启动-内核的生成...........................................2 读核感悟-Linux内核启动-从hello world说起...................................3 读核感悟-Linux内核启动-BIOS.....................

    linux内核调试方法总结

    十 使用SkyEye构建Linux内核调试环境 1 SkyEye的安装和μcLinux内核编译 2 使用SkyEye调试 3 使用SkyEye调试内核的特点和不足 十一 KDB 1 入门 2 初始化并设置环境变量 3 激活 KDB 4 KDB 命令 5 技巧和诀窍 6 结束语...

    LINUX内核修炼之道

    将Linux内核的修炼之道总结为四个层次:第一层次目的是对Linux以及内核有个全面的认识和了解,掌握Linux内核源代码的分析方法。第二个层次讨论了内核中系统初始化、系统调用、中断处理、进程管理及调度、内存管理、...

    操作系统Linux内核编译实验报告.docx

    操作系统Linux内核编译实验报告

    深入分析与理解linux内核笔记总结(重点难点解析)

    深入分析与理解linux内核笔记总结(重点难点解析)

    linux内核知识全面总结 全是免分资源

    linux内核知识全面总结 全是免分资源

    linux内核编译实验报告

    详细描述编译linux内核的步骤及个人心得

    [14本经典Android开发教程]-8-Linux内核阅读心得体会

    [14本经典Android开发教程] 8 Linux内核阅读心得体会 读核感悟 2 读核感悟 Linux内核启动 内核的生成 2 读核感悟 Linux内核启动 从hello world说起 3 读核感悟 Linux内核启动 BIOS 5 读核感悟 Linux内核启动 setup...

    linux内核阅读心得

    -Linux内核启动-内核的生成...........................................2 读核感悟-Linux内核启动-从hello world说起...................................3 读核感悟-Linux内核启动-BIOS.............................

    linux内核源码解析

    虽然所选择的版本较低, 但该内核已能够正常编译运行,其中已经包括了LINUX工作原理的精髓,通过阅读其源代码能快速地完全理解内核的运作机 制。书中首先以 Linux 源代码版本的变迁历史为主线,详细介绍了 Linux 系统的...

    linux内核移植说明(持续更新)

    linux内核移植总结,当前总结版本2.6.35

    Linux内核精髓:精通Linux内核必会的75个绝技

    鉴于此,《Linux内核精髓:精通Linux内核必会的75个绝技》选取了资源管理(CPU、内存、进程等)、文件系统、网络、虚拟化、省电、调试、概要分析...,总结出了75个能有助于读者深刻理解Linux内核精髓的技巧和最佳实践...

    Linux 内核完全注释

    但该内核已能够正常编译运行,其中已经包括了LINUX 工作原理的精髓,通过阅读其源代码能快速地完全理解内核的运作 机制。书中首先以Linux 源代码版本的变迁历史为主线,详细介绍了Linux 系统的发展历史,着重说明了...

    Linux 内核学习经验总结

    Linux 内核学习经验总结,Linux 内核学习经验总结,Linux 内核学习经验总结

    LINUX内核总结(PPT课件)

    自己写的linux内核总结,主要是概念性的解释,可帮助理解内核各块的机制,细节忽略。主要包括: 系统调用 内存管理 进程管理 虚拟文件系统(VFS) 信号机制 内核初始化过程(这块很简略) 内核是基于杭州中天微的...

    《Linux内核修炼之道》精华版之方法论

    将Linux内核的修炼之道总结为四个层次:第一层次目的是对Linux以及内核有个全面的认识和了解,掌握Linux内核源代码的分析方法。第二个层次讨论了内核中系统初始化、系统调用、中断处理、进程管理及调度、内存管理、...

    linux内核的经典书

    linux内核经典书 不错的总结,很正确

Global site tag (gtag.js) - Google Analytics