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

一、Linux内核源码简介

1.操作系统的两把宝剑

  • 中断上下文的切换——保存现场&恢复现场
  • 进程上下文的切换

2.Linux内核源代码简介

(1)打开内核源代码页面

  • arch/目录:支持不同CPU的源代码;其中的X86是重点
  • init/目录:内核启动相关的代码基本都在该目录中
  • start_kernel函数就相当于普通C程序的main函数
  • kernel/目录:Linux内核核心代码在kernel目录中

(2)README

提供内核的各种编译方法、生成文件的查看方法。例如:

  • INSTALLING 如何安装内核源代码
  • make mrproper 清理安装时生成的中间代码

二、构造一个简单的Linux系统

1. 运行MenuOS系统

在实验楼的虚拟机环境里,打击打开shell,使用下面的命令

cd LinuxKernel/

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img

# -initrd:指明一个根文件系统

  • 启动实验的Linux系统MenuOS,实际上就是一个在Linux内核的基础上,再运行一个简单菜单命令行程序。
  • 在MenuOS>的提示符下输入help,看到其全部支持的命令:

    help、version、quit

2. 使用gdb跟踪调试内核

  • 使用带参数命令启动MenuOS,使得系统在刚启动时,暂停等待调试器跟踪执行。

    qemu -kernel linux-3.18./arch/x86/boot/bzImage -initrd rootfs.img -s -S
    # -S 在CPU初始化之前,冻结CPU
    # -s 1234端口上创建一个tcp接口。若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项
  • 另开一个shell窗口,启动gdb。

    (gdb)file linux-3.18./vmlinux
    # 在gdb界面中targe remote之前加载符号表
    (gdb)target remote:
    # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
    (gdb)break start_kernel
    # 在start_kernel函数入口处设置断点
    (gdb)c
    # 使得系统运行到start_kernel处停住
    (gdb)list
    # 显示当前行所在位置上下的代码

三、简单分析start_kernel

(1)全局变量 init_task

全局变量init_task,即手工创建的PCB,0号进程初始化,0号进程就是最终的idle。

500asmlinkage __visible void __init start_kernel(void)
{
char *command_line;
char *after_dashes; /*
506 * Need to run as early as possible, to initialize the
507 * lockdep hash:
508 */
lockdep_init();
set_task_stack_end_magic(&init_task);//init_task即手工创建的PCB,0号进程及最终的idle进程
smp_setup_processor_id();
debug_objects_early_init();

(2)初始化一些中断向量 trap_init()

中断向量表的初始化函数,设置了很多中断门(Interrupt Gate)

set_intr_gate:设置中断门

(3)内存管理模块初始化 mm_init()

(4)调度模块初始化 sched_init()

函数内做了很关键的一步初始化——对0号进程,即idle进程进行初始化。

(5)其它模块初始化 rest_init()

kernel_thread(kernel_init,NULL,CLONE_FS)中的kernel_init包含一个run_init_process,创建了一号进程,即第一个用户态进程。之后创建了kthreadd,一个内核线程来管理系统的资源。

  • 创建了一号进程后,kernel_thread函数通过405行的kthreadd管理线程;
  • 由cpustartupentry(CPUHPONLINE);——>cpuidleloop();——>static void cpuidle_loop(void):
  • cpuidleloop中有一个while循环,当start_kernel启动之后,她就一直存在。当系统没有进场需要执行的时候就调度到idle进程

四、总结

1.kernelthread是0号进程,它创建了1号进程kernelinit,以及它的一些服务的内核线程,这样整个系统及启动起来了;

2.然后init进程会再启动一些进程。

第三周:构造一个简单的LINUX系统MENUOS的更多相关文章

  1. 《Linux内核分析》 第三周 构造一个简单的Linux系统MenuOS

    Linux内核分析 第三周 构造一个简单的Linux系统MenuOS 张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/ ...

  2. 20135327郭皓--Linux内核分析第三周 构造一个简单的Linux系统MenuOS

    Linux内核分析第三周  构造一个简单的Linux系统MenuOS 前提回顾 1.计算机是如何工作的三个法宝 1.存储程序计算机 2.函数调用堆栈 3.中断 2.操作系统的两把宝剑 中断上下文的切换 ...

  3. linux内核分析 第三周 构造一个简单的Linux系统MenuOS

    一.计算机的三个法宝 存储程序计算机,函数调用堆栈,中断二.操作系统的两把剑:1.中断上下文的切换,保存现场和恢复现场2.进程上下文的切换. 三.linux内核源代码的分析: ·arch/目录保存支持 ...

  4. Linux内核分析第三周——构造一个简单的Linux系统MenuOS

    构造一个简单的Linux系统MenuOS 李雪琦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/UST ...

  5. 第三周 构造一个简单的Linux系统MenuOS

    一.   Linux内核源代码简介 稳定版内核:Linux-3.18.6 Linux内核源代码的目录结构: arch目录:在Linux内核源代码里占有的比重很大,因为Linux内核支持很多的体系结构, ...

  6. Linux内核设计第三周——构造一个简单的Linux系统

    Linux内核设计第三周 ——构造一个简单的Linux系统 一.知识点总结 计算机三个法宝: 存储程序计算机 函数调用堆栈 中断 操作系统两把宝剑: 中断上下文的切换 进程上下文的切换 linux内核 ...

  7. 第三周——构建一个简单的Linux系统MenuOS

    [洪韶武 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ] 第三周  构建一个 ...

  8. 《Linux内核分析》第三周 构建一个简单的Linux系统MenuOS

    [刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK THREE ...

  9. 第三周 构造一个简单的Linux系统

    20135331文艺 首先 在上周内容中我们学习了 计算机三个法宝: 1.存储程序计算机 2.函数调用堆栈 3.中断 本周中得知 操作系统两把宝剑: 1.中断上下文的切换:保存现场和恢复现场 2.进程 ...

  10. 《Linux内核分析》第三周笔记 构造一个简单的Linux系统MenuOS

    构造一个简单的Linux系统MenuOS 一.linux内核源代码简介 三大法宝(存储程序计算机.函数调用堆栈.中断)和两把宝剑(中断上下文的切换:保存现场和恢复现场.进程上下文的切换) 1.在lin ...

随机推荐

  1. java将Excel文件上传并解析为List数组

    前端 //导入excel文件 layui.use('upload', function() { var upload =layui.upload; //指定允许上传的文件类型 var uploadIn ...

  2. 配置好jdk后,cmd编写java -version还是报找不到jdk

    找了好长时间没查出问题在哪,配置的都没有问题,最后搜了搜网上发现,jdk的这两行得在最上面才行.

  3. Vmware Vcenter6.5 全新安装及群集配置介绍

    转 Vmware Vcenter6.5 全新安装及群集配置介绍 2016年12月31日 14:27:12 ccitzy01 阅读数:97772 标签: vmware   [摘要] VMwarevCen ...

  4. requirejs原理深究以及r.js和gulp的打包【转】

    转自:http://blog.csdn.net/why_fly/article/details/75088378 requirejs原理 requirejs的用法和原理分析:https://githu ...

  5. cookie的详解

    cookie是如何出生的 由于HTTP协议是无状态的,而服务器端的业务必须是要有状态的.Cookie诞生的最初目的是为了存储web中的状态信息,以方便服务器端使用.比如判断用户是否是第一次访问网站.目 ...

  6. BZOJ3632:外太空旅行(最大团,DFS)

    Description 在人类的触角伸向银河系的边缘之际,普通人上太空旅行已经变得稀松平常了.某理科试验班有n个人,现在班主任要从中选出尽量多的人去参加一次太空旅行活动. 可是n名同学并不是和平相处的 ...

  7. 把php session 会话保存到redis

    php的session会话默认时以文件形式保存在php.ini配置文件设置的会话缓存目录,文件保存会话的效率很低,每当每个用户登录一次就会在服务器上生成一个唯一的session_id文件,当用户登录量 ...

  8. CVE-2017-8046(Spring Data Rest RCE)

    环境搭建参考第一个链接,springboot启动文件如下,不同的启类,将Application.class修改一下就可以了,直接debug.注意:默认版本是2.0.3版本,修改成低版本,看一下mvn下 ...

  9. Array对象的方法

    * Array.isArray(对象)---->判断这个对象是不是数组 * instanceof关键字 * .concat(数组,数组,数组,...) 组合一个新的数组 * .every(函数) ...

  10. 使用uploadify多文件上传,单个删除上传成功的图片

    总体思路:在用uploadify上传成功一张图片,用js生成相应的元素,放到指定的位置,并且加上删除的标志.在保存的时候,把是img的所有的值,放到对应到字段里. jsp: <tr> &l ...