码迷,mamicode.com
首页 > 系统相关 > 详细

3构造一个简单的linux系统MenuOS

时间:2017-03-06 15:05:53      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:doc   启动   cpu   第一个   源码   进程间通信   border   查找   最大   

 

1 linux内核源码简介

技术分享

documentation文档;fs filesystem;ipc 进程间通信;核心代码都在kernel;mm memory management

init目录:

技术分享

技术分享

arch代码量占比最大,支持不同cpu和体系结构

技术分享

2 构造一个简单的linux系统

initrd 指定根文件系统

技术分享

技术分享

-S在系统启动时冻结;-s 启动gdb server

技术分享

被freeze,之后加载符号表

技术分享

技术分享

之后按c会启动到start_kernel位置,list则会看到start的代码:

技术分享

3 跟踪调试linux内核的启动过程:

在Init_start_kernel中:

技术分享

不管分析内核哪一个部分都会涉及start_kernel调用初始化

技术分享

trap_init涉及中断

技术分享

设置了很多硬件中断门

技术分享

这里SYSCALL_VECTOR是系统调用(也是一种中断,通过指令方式)

start_kernel最后一句是rest_init,其中有一句kernel_thread

技术分享

kernel_thread:

技术分享

这里run_init_process是1号用户态进程创建,在根目录下,如果没有就查找bin,etc等等的init;

rest_init:还有一个kthread内核进程来管理这些进程

技术分享

最后有一句:

技术分享

技术分享

技术分享

即0号进程,会一直存在即system.idle

在这里0号进程创建了kernel_init其他进程

技术分享

4 实验:

1,根文件系统

技术分享

2,gdb跟踪

技术分享

技术分享技术分享

补充:

技术分享

5 分析kernel启动过程

      start_kernel()类似C程序中的main函数。在start_kernel()函数之前,内核的代码都是用汇编写的,主要工作是完成一些最基本的初始化与环境设置工作;在start_kernel()中Linux将完成整个系统的内核初始化,在start_kernel的最后,是调用rest_init函数,在rest_init函数中,内核将产生第一个真正的进程,即pid=1的1号进程,而在start_kernel函数中init_task是静态制造出来的,pid=0,我们可以在start_kernel函数的开始处,看到其被初始化的代码,它试图将从最早的汇编代码一直到start_kernel的执行都纳入到init_task进程上下文中,在其初始化工作完成后,就会成为系统的idle进程。事实上在更早前的sched_init函数中,通过init_idle(current, smp_processor_id())函数的调用就已经把init_task初始化成了一个idle task,init_idle函数的第一个参数current就是&init_task,在init_idle中将会把init_task加入到cpu的运行队列中,这样当运行队列中没有别的就绪进程时,init_task(也就是idle task)将会被调用,它的核心是一个while(1)循环,在循环中它将会调用schedule函数以便在运行队列中有新进程加入时切换到该新进程上。

3构造一个简单的linux系统MenuOS

标签:doc   启动   cpu   第一个   源码   进程间通信   border   查找   最大   

原文地址:http://www.cnblogs.com/wk2016just/p/6509492.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!