Diary

天天请客不穷,夜夜做贼不富

实验:跟踪分析Linux内核的启动过程

——————————-实验开始gdb————————————————-

进入gdb进行一步一步调试:

break start_kernel:

start_kernel()中调用了一系列初始化函数,以完成kernel本身的设置。 这些动作有的是公共的,有的则是需要配置的才会执行的。

在start_kernel()函数中,

  • 输出Linux版本信息(printk(linux_banner))

  • 设置与体系结构相关的环境(setup_arch())

  • 页表结构初始化(paging_init())

  • 使用"arch/alpha/kernel/entry.S"中的入口点设置系统自陷入口(trap_init())

  • 使用alpha_mv结构和entry.S入口初始化系统IRQ(init_IRQ())

  • 核心进程调度器初始化(包括初始化几个缺省的Bottom-half,sched_init())

  • 时间、定时器初始化(包括读取CMOS时钟、估测主频、初始化定时器中断等,time_init())

  • 提取并分析核心启动参数(从环境变量中读取参数,设置相应标志位等待处理,(parse_options())

  • 控制台初始化(为输出信息而先于PCI初始化,console_init())

  • 剖析器数据结构初始化(prof_buffer和prof_len变量)

  • 核心Cache初始化(描述Cache信息的Cache,kmem_cache_init())

  • 延迟校准(获得时钟jiffies与CPU主频ticks的延迟,calibrate_delay())

  • 内存初始化(设置内存上下界和页表项初始值,mem_init())

  • 创建和设置内部及通用cache(“slab_cache”,kmem_cache_sizes_init())

  • 创建uid taskcount SLAB cache(“uid_cache”,uidcache_init())

  • 创建文件cache(“files_cache”,filescache_init())

  • 创建目录cache(“dentry_cache”,dcache_init())

  • 创建与虚存相关的cache(“vm_area_struct”,“mm_struct”,vma_init())

  • 块设备读写缓冲区初始化(同时创建"buffer_head"cache用户加速访问,buffer_init())

  • 创建页cache(内存页hash表初始化,page_cache_init())

  • 创建信号队列cache(“signal_queue”,signals_init())

  • 初始化内存inode表(inode_init())

  • 创建内存文件描述符表(“filp_cache”,file_table_init())

  • 检查体系结构漏洞(对于alpha,此函数为空,check_bugs())

  • SMP机器其余CPU(除当前引导CPU)初始化(对于没有配置SMP的内核,此函数为空,smp_init())

  • 启动init过程(创建第一个核心线程,调用init()函数,原执行序列调用cpu_idle() 等待调度,init())

至此start_kernel()结束,基本的核心环境已经建立起来了。

【转)kernel 启动过程之三, start_kernel()函数 概叙】

break rest_init:

break kernel_init:

break run_init_process

启动完成:

================================================

Linux系统启动过程

关于linux系统的启动流程我们可以按步进行划分为如下:

POST加电自检–>BIOS(Boot Sequence)–>加载对应引导上的MBR(bootloader)–>主引导设置加载其BootLoader–>Kernel初始化–>initrd—>/etc/init进程加载/etc/inittab



详解linux系统的启动过程及系统初始化



Linux启动过程详解-《别怕Linux编程》之八

===============================================

sunfy + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

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

本次实现是实验模拟操作系统是如何工作的。

mykernel

上图作证:


实验使用linux-3.9.4进行模拟。模拟操作系统如何进行进程管理以及中断处理。

Process Control Block 即PCB(进程控制块)。也称之为 Task Controlling Block。

查阅

WIKI

The role of the PCBs is central in process management: they are accessed and/or modified by most OS utilities, including those involved with scheduling, memory and I/O resource access and performance monitoring. It can be said that the set of the PCBs define the current state of the operating system. Data structuring for processes is often done in terms of PCBs. For example, pointers to other PCBs inside a PCB allow the creation of those queues of processes in various scheduling states (“ready”, “blocked”, etc.) that we previously mentioned.

可见PCB由操作系统创建和管理。同时PCB包含了足够充分的信息,这样就可以中断一个进程,并且在恢复执行该进程时就好像未被中断过一样。(《Operating Systems Internals and Design Principles》)

在mykernel中mypcb.h既是声明PCB数据结构头的文件。


PCB中定义了pid,state,stack,thread,task_entry,*next结构成员。

在定义了PCB类型的数据结构后,定义了实例变量tPCB.

在声明了PCB数据结构类型之后,Linux内核开始运作。

相关代码在mymain.c中。


该段代码在创建和管理PCB,也就是为进程设置足够充分的信息并保留下来,以便操作系统进行进程控制管理。
这是创建的一个进程。该进程是每隔1000万个时间单位打印出特定格式的信息。

为了实现多进程时间片轮转,还需要一个中断进程,不停的发出中断信号。这就是myinterrupt.c代码所执行的内容。


这就是当满足调剂时执行的中断程序。

这就是本次实验的主干内容。

可以说进程是由程序代码和相关数据还有PCB组成的。对于一个但处理器计算机,在任何时候最多只有一个进程在执行。而在运行的这个进程状态为运行态。

  • sunfy + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000