构造一个简单的Linux系统MenuOS

一、linux内核源代码简介

三大法宝(存储程序计算机、函数调用堆栈、中断)和两把宝剑(中断上下文的切换:保存现场和恢复现场、进程上下文的切换)

1、在linux内核源码里面arch占有的代码量相当庞大。arch/x86目录下的代码是我们重点关注的。

2、内核启动相关的代码基本都在init目录下(main.c)。

  start_kernel是初始化linux内核的起点。

  start_kernel相当于c程序中的main函数

3、linux内核的核心代码在kernel目录中

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

init是第一个用户态进程,是1号进程。

内核启动:

三、跟踪调查linux内核的启动过程

1.使用gdb跟踪调试内核的方法

启动内核:qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S/*在开始之前将CPU冻结*/

/*在1234端口上创建了一个gdb server -gdb tcp::1234 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项*/

另开一个shell窗口

  1. gdb
  2. (gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表/*将带有符号表的内核镜像加载进来*/
  3. (gdb)target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
  4. (gdb)break start_kernel # 断点的设置可以在target remote之前,也可以在之后/*设置断点跟踪内核*/

当前状态被冻结:

启动gdb:

加载linux符号表,启动到start_lernel位置:

start_kernel向下的代码,另设断点:

在start_kernel的尾部:

2、简单分析一下start_kernel

main.c中的

asmlinkage __visible void __init start_kernel(void)
501{
502 char *command_line;
503 char *after_dashes;
504
505 /*
506 * Need to run as early as possible, to initialize the
507 * lockdep hash:
508 */
509 lockdep_init();
510 set_task_stack_end_magic(&init_task); /*定义&init_task全局变量,即手工创建的PCB,0号进程即最终的idle进程*/
511 smp_setup_processor_id();
512 debug_objects_early_init();
513
514 /*
515 * Set up the the initial canary ASAP:
516 */
517 boot_init_stack_canary();
518
519 cgroup_init_early();
520
521 local_irq_disable();
522 early_boot_irqs_disabled = true;
523
524/*
525 * Interrupts are still disabled. Do necessary setups, then
526 * enable them
527 */

所有的模块在初始化的时候都会通过init,都会通过start_kernel来调用模块进行初始化。

trap init:初始化一些中断向量

设置中断门:

start_kernel最后一句rest init:

init_process是linux系统的1号进程,是第一个用户态进程,默认是根目录下的程序。

kthreadd创建一个内核线程。

当系统没有进程需要执行时就调度到idel进程(0号进程

四、总结

  这一周学习的是构造一个简单的linux系统,在linux内核源码里面arch占有的代码量相当庞大,arch/x86目录下的代码是我们重点关注的,内核启动相关的代码基本都在init目录下,linux内核的核心代码在kernel目录中,我们主要了解start_kernel函数的执行过程。我们通过在实验楼里构造一个简单的linux系统来慎入料及构造过程。同时还学习到init称为1号进程,从start_lernel起一直存在,在WINDOWS系统上称为system idel,0号进程创建了1号进程,还创建了其他服务的内核线程,这样系统就启动起来了,这就是内核的启动过程。

《Linux内核分析》第三周笔记 构造一个简单的Linux系统MenuOS的更多相关文章

  1. 第三周:构造一个简单的LINUX系统MENUOS

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

  2. Linux内核分析第三周学习笔记

    linux内核分析第三周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...

  3. LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS

    LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163. ...

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

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

  5. linux内核分析第三周

    20135103王海宁 linux内核分析第三周 http://mooc.study.163.com/course/USTC-1000029000  按照课堂提供的方法,命令行一行行敲上去,我是手机缓 ...

  6. Linux内核分析第三周学习博客——跟踪分析Linux内核的启动过程

    Linux内核分析第三周学习博客--跟踪分析Linux内核的启动过程 实验过程截图: 过程分析: 在Linux内核的启动过程中,一共经历了start_kernel,rest_init,kernel_t ...

  7. LINUX内核分析第八周学习总结——进程的切换和系统的一般执行过程

    LINUX内核分析第八周学习总结——进程的切换和系统的一般执行过程 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/c ...

  8. Linux内核分析——第三周学习笔记20135308

    第三周 构造一个简单的Linux系统MenuOS 计算机三个法宝: 1.存储程序计算机 2.函数调用堆栈 3.中断 操作系统两把宝剑: 1.中断上下文的切换:保存现场和恢复现场 2.进程上下文的切换 ...

  9. Linux内核分析第三周学习总结:构造一个简单的Linux系统MenuOS

    韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.Linux内 ...

随机推荐

  1. Spark学习之路 (二十二)SparkStreaming的官方文档

    官网地址:http://spark.apache.org/docs/latest/streaming-programming-guide.html 一.简介 1.1 概述 Spark Streamin ...

  2. 启动报错:Access denied for user 'root'@'localhost' (using password:YES)

    项目启动报错:Access denied for user 'root'@'localhost' (using password:YES) 原因:root帐户默认不开放远程访问权限,所以需要修改一下相 ...

  3. WorldWind源码剖析系列:图层管理器按钮类LayerManagerButton和菜单条类MenuBar

    WorldWindow用户定制控件类中所包含的的可视化子控件主要有:图层管理器按钮类LayerManagerButton和菜单条类MenuBar.BmngLoader类中所包含的的可视化子控件主要有: ...

  4. 配置openfire环境

    Openfire 的安装和配置 1. 下载最新的openfire安装文件 官方下载站点:http://www.igniterealtime.org/downloads/index.jsp#openfi ...

  5. Android 连续按两次back键退出系统

    需求:在程序的首页,连续按两次back键退出Androd程序. 第一步:新建一个GApplication类继承Application,在GApplication中添加一个用于存放Activity的集合 ...

  6. 03-Centos7安装部署Mirrorgate-踩坑记录

    FAQ 1.没有安装bzip2 解决方法 yum -y install bzip2 > phantomjs-prebuilt@2.1.16 install /root/test/mirrorga ...

  7. 20155308 《网络攻防》 Exp3 免杀原理与实践

    20155308 <网络攻防> Exp3 免杀原理与实践 基础问题回答 杀软是如何检测出恶意代码的? 基于特征来检测:恶意代码中一般会有一段有较明显特征的代码也就是特征码,如果杀毒软件检测 ...

  8. 20155339 Exp6 信息搜集与漏洞扫描

    20155339 Exp6 信息搜集与漏洞扫描 实验后回答问题 (1)哪些组织负责DNS,IP的管理. 全球根服务器均由美国政府授权的ICANN统一管理,负责全球的域名根服务器.DNS和IP地址管理. ...

  9. Spring-data-jpa 学习笔记(一)

    Spring家族越来越强大,作为一名javaWeb开发人员,学习Spring家族的东西是必须的.在此记录学习Spring-data-jpa的相关知识,方便后续查阅. 一.spring-data-jpa ...

  10. HTML基础语法

    目录 HTML基础语法 1.全局架构标签 2.标题 3.段落 4.文本 5.属性 6.链接 7.图片 8.列表 9.表格 10.区块 11.布局 12.表单 13.框架 14.头部 HTML基础语法 ...