吕松鸿 + 原创作品转载请注明出处 + 《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. windows 2012 抓明文密码方法

    windows 2012 抓明文密码方法 默认配置是抓不到明文密码了,神器mimikatz显示Password为null Authentication Id : 0 ; 121279 (0000000 ...

  2. [python]关于列表增加元素的几种操作

    1.insert方法,该方法包含两个参数,第一个参数为插入的位置参数,第二个参数为插入内容 a = [0,0,0] b = [1,2,3] a.insert(0,b) print a 输出: [[1, ...

  3. Kafka学习之路 (一)Kafka的简介

    一.简介 1.1 概述 Kafka是最初由Linkedin公司开发,是一个分布式.分区的.多副本的.多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/ng ...

  4. Scala学习之路 (三)Scala的基本使用

    一.Scala概述 scala是一门多范式编程语言,集成了面向对象编程和函数式编程等多种特性.scala运行在虚拟机上,并兼容现有的Java程序.Scala源代码被编译成java字节码,所以运行在JV ...

  5. pycharm同步

    只有专业版的才能同步服务器 按照这个来:https://zhuanlan.zhihu.com/p/35067462 3.然后配置映射信息 local path是自己的工程的本地目录路径, Deploy ...

  6. nano,pico文本编辑器,debian执行crontab -e

    debian执行crontab -e的时候出现: Edit this file to introduce tasks to be run by cron.## Each task to run has ...

  7. 学习Kali Linux必须知道的几点

    Kali Linux 在渗透测试和白帽子方面是业界领先的 Linux 发行版.默认情况下,该发行版附带了大量入侵和渗透的工具和软件,并且在全世界都得到了广泛认可.即使在那些甚至可能不知道 Linux ...

  8. Python2.7-random

    random 模块,实现了各种分布下的伪随机数生成器.对于整数,可以从一个范围中随机挑选:对于序列,可以随机挑选其中的元素但不改变原序列,也可以对序列中的元素进行重新排列.此外,模块还封装了各种分布函 ...

  9. JS获取客户端公网IP和IP地址

    网上解决方案 1.通过搜狐接口 获取方式如下: //网页端引入脚本 <script type="text/javascript" src="http://pv.so ...

  10. 编程检查d:\test.txt文件是否存在,若在则显示该文件的名称和内容。

    下面放两种方法 老师写的: import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExcept ...