构造一个简单的Linux系统MenuOS

linux内核目录结构

  • arch目录包括了所有和体系结构相关的核心代码。它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是Intel CPU及与之相兼容体系结构的子目录。PC机一般都基于此目录。

  • include目录包括编译核心所需要的大部分头文件,例如与平台无关的头文件在include/linux子目录下。

  • init目录包含核心的初始化代码(不是系统的引导代码),有main.c和Version.c两个文件。这是研究核心如何工作的好起点。

  • mm目录包含了所有的内存管理代码。与具体硬件体系结构相关的内存管理代码位于arch/*/mm目录下。

  • drivers目录中是系统中所有的设备驱动程序。它又进一步划分成几类设备驱动,每一种有对应的子目录,如声卡的驱动对应于drivers/sound。

  • ipc目录包含了核心进程间的通信代码。

  • modules目录存放了已建好的、可动态加载的模块。

  • fs目录存放Linux支持的文件系统代码。不同的文件系统有不同的子目录对应,如ext3文件系统对应的就是ext3子目录。

  • Kernel内核管理的核心代码放在这里。同时与处理器结构相关代码都放在arch/*/kernel目录下。

  • net目录里是核心的网络部分代码,其每个子目录对应于网络的一个方面。

  • lib目录包含了核心的库代码,不过与处理器结构相关的库代码被放在arch/*/lib/目录下。

  • scripts目录包含用于配置核心的脚本文件。

  • documentation目录下是一些文档,是对每个目录作用的具体说明。

QEMU是一个面向完整PC系统的开源仿真器。在本次实验中它就起到仿真一个Linux系统的作用。

  • -kernel 引用一个linux内核
  • -initrd 初始化一个临时的RAM磁盘,是系统引导过程中挂载的一个临时文件系统。

start_kernel

  • start_kernel函数之前的内容基本都是汇编语言,而从该函数开始内核进入c语言部分,功能则是内核主要功能的初始化。
  • 步骤如下:
    • smp_setup_processor_id(); 制定当前cpu的逻辑号,当系统中只有一个cpu的情况,则此函数不做出操作
    • lockdep_init(); 初始化内核依赖的关系表(hash表)
    • localirq_disable(); 关闭当前CPU中断
    • early_boot_irqs_off(); early_boot_irqs_enabled,通过该标记可以让我们知道是否在early bootup code。
    • early_init_irq_lock_class(); 设置所有IRQ描述符的锁是统一的锁还是各有各的小锁
    • lock_kernel(); 获得大内核锁,该锁可以用来锁定整个内核。
    • time_init(); 初始化tick控制功能,注册clockevents的框架
    • boot_cpu_init(); 设置第一个CPU核为活跃CPU核。若系统为单CPU核系统,则设置仅有的CPU为活跃CPU核。
    • printk(KERN_NOTICE); printk(linux_banner);输出打印版本信息。
    • setup_arch(&command_line); 设置与初始化硬件体系相关的环境并调用
    • setup_per_cpu_areas(); 每个cpu分配pre-cpu结构内存
    • sched_init(); 进程调度器初始化
    • preempt_disable(); 内核的抢占
    • printk(boot_command_line); 提取分析核心启动参数过程(从bootloader中传递)
    • build_all_zonelists(); 建立系统内存页区(zone)链表
    • printk(KERN_NOTICE "Kernel command line: %s/n", boot_command_line); 打印Linux启动命令行参数
    • parse_early_param(); 解析早期格式的内核参数
    • trap_init(); 设置CPU的异常处理函数。
    • init_IRQ(); 初始化IRQ中断和终端描述符。
    • pidhash_init(); 初始化hash表
    • init_timers(); 初始化定时器Timer相关的数据结构。
    • hrtimers_init(); 对高精度时钟进行初始化。
    • softirq_init(); 初始化软中断。
    • time_init(); 初始化系统时间
    • profile_init();对内核的一个性能测试工具profile进行初始化。
    • local_irq_enable(); 使能IRQ中断
    • console_init(); 初始化控制台以显示printk的内容
    • 接下来就是执行rest_init();

进程产生

  • 从rest_init()开始,Linux系统就开始产生进程,通过kernel(kernel_init,NULL,CLONE_FS)启动内核进程kernel_init,也就是1号进程,它管理调度其他的内核进程,并由kthread_create_list全局链表管理其内核线程列表。
  • 接着创建二号进程kthreadadd()
  • 当系统没有进程需要执行的时候,就会调度到idle进程,也就是0号进程,它自系统开始运作时便一直存放于系统之中。在某种角度来说,它创建了1号进程和其他的进程。

实验截图

  • 设置start_kernel的断点与rest_init的断点
  • 运行至rest_init处时的系统运行图
  • rest_init函数处的上下文
  • start_kernel函数处的上下文

参考文献

池彬宁原创作品转载请注明出处 + 《linux内核分析》mooc课程http://mooc.study.163.com/course/ustc-1000029000 ”

Linux内核分析-构造一个简单的Linux系统MenuOS的更多相关文章

  1. Linux内核分析— —构造一个简单的Linux系统MenuOS(20135213林涵锦)

    Linux内核分析— —构造一个简单的Linux系统MenuOS 实验内容 Linux内核的启动过程,从start_kernel到init进程启动 使用实验楼的虚拟机打开shell cd LinuxK ...

  2. Linux内核分析——构造一个简单的Linux系统MenuOS

    马悦+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.Linux内核源代码简 ...

  3. Linux内核分析—完成一个简单的时间片轮转多道程序内核代码

    ---恢复内容开始--- 20135125陈智威 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-10 ...

  4. 20135239益西拉姆 Linux内核分析 汇编一个简单的c程序并分析其指令过程

    益西拉姆+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 第一周linux内核分析 学习笔记 一.计算机 ...

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

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

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

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

  7. 《Linux内核分析》第三周学习小结 构造一个简单的Linux系统OS

    郝智宇 无转载 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 第三周 构造一个简单的Linux系统Me ...

  8. Linux内核分析 笔记三 构造一个简单的Linux系统MenuOS ——by王玥

    一.知识点总结 (一)Linux源代码简介 arch/x86目录下的代码是我们重点关注的 内核启动相关代码都在init目录下 start_kernel函数相当于普通C程序的main函数 linux的核 ...

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

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

随机推荐

  1. javascript的基础知识整理

    Basic ObjectsArray Properties constructor  属性返回对创建此对象的数组函数的引用 object.constructor prototype 属性使您有能力向对 ...

  2. NOIP2018考前抱佛脚——图论基础复习

    目录 存图方式 邻接矩阵存图 邻接表存图 链式前向星 最小生成树 例1 P1536 村村通 题目描述 输入输出格式 输入输出样例 标程 例2 P1546 最短网络 Agri-Net 题目背景 题目描述 ...

  3. ethereumjs/ethereumjs-util

    ethereumjs/ethereumjs-util Most of the string manipulation methods are provided by ethjs-util 更多的字符串 ...

  4. lambda函数详解

    lambda函数的作用就是可以编写内嵌的无名函数,而不必写成独立的函数: 结构:[]为开始,(参数){函数体} 例如: 1. auto lambdaFun1 = [](int a) {std::cou ...

  5. SQL 字符串分割表函数

    --字符串分割表函数 ) ) declare @i int; declare @count int; ); ); declare @Index int; )) declare @rowID int; ...

  6. C#抽象类与抽象方法--就是类里面定义了函数而函数里面什么都没有做的类

    看一下代码应该就可以了 using System; using System.Collections.Generic; using System.Linq; using System.Text; na ...

  7. Shell调试篇 转

    检查语法 -n选项只做语法检查,而不执行脚本. sh -n script_name.sh 启动调试 sh -x script_name.sh 进入调试模式后,Shell依次执行读入的语句,产生的输出中 ...

  8. STS-新建spring mvc项目

    引入响应的jar包解决报错: 由于国内的网络限制,下载会较慢.使用之前可自行更换maven的镜像路径,越近越好.

  9. 20155233 Exp1 PC平台逆向破解(5)M

    Exp1 PC平台逆向破解(5)M 实践一 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数. 步骤 1.cp pwn1 pwn20155233拷贝pwn1文件,命名为pwn201 ...

  10. 01-BAT算法特训班