《Linux内核分析》

第三章 MenuOS的构造

3.1 Linux内核源代码简介

  • 操作系统的“两把宝剑”

    • 中断上下文:保存现场和恢复现场
    • 进程上下文
  • 目录结构
    • arch:与体系结构相关的子目录列表,存放CPU体系结构的相关代码
    • block:存放Linux存储体系中关于块设备管理的代码
    • crypto:存放常见的加密算法的C语言代码
    • Documentation:存放一些文档
    • drivers:驱动目录,里面分门别类的存放了Linux内核支持的所有硬件设备的驱动源代码
    • firmware:固件
    • fs:文件系统(file system),里面列出了Linux支持的各种文件系统的实现
    • include:头文件目录,存放公共的(各种CPU体系结构共用的)头文件
    • init:存放Linux内核启动时的初始化代码

      注:init目录中的main.c源文件是整个Linux内核启动的起点,但它的起点不是main函数,而是start_kernel函数
    • ipc:Linux支持的IPC的代码实现(IPC:进程间通信,inter-process communication)
    • kernel:Linux内核,存放内核本身需要的一些核心代码文件
    • lib:公用的库文件,里面是一些公用的库文件(与C语言的库函数不一样)
    • mm:内存管理memoty management,存放Linux的内存管理代码
    • net:网络相关的代码
  • 在开发一个软件项目时,一般会在项目根目录下写一个readme文件
  • 编译配置Linux内核的关键步骤
    • 1.编译安装内核大概步骤

      • 安装开发包组
      • 下载源码文件
      • .config:准备配置文件
      • make menuconfig:配置内核有选项
      • make[-j#]
      • make modules_install:安装模块
      • make install:安装内核相关文件
      • 安装bzImage为 /boot/vmlinuz-VERSION-RELEASE
      • 生成initramfs文件
      • 编辑grub的配置文件
    • 2.编译配置选项
      • 配置内核选项
      • 支持“更新”模式进项配置:make help
        • make config:基于命令行以遍历的方式去配置内核中可配置的每个选项
        • make menuconfig:基于curses的文本窗口界面
        • make gconfig:基于GTK(GNOME)环境窗口界面
        • make xconfig:基于QT(KDE)环境的窗口界面
      • 支持“全新配置”模式进行配置
        • make difconfig:基于内核为目标平台提供的“默认”配置进行配置
        • make allyesconfig:所有选项均回答为“yes”
        • make allnoconfig:所有选项均回答为“no”
    • 3.编译
      • 全编译:make [-j#]

3.2 构造一个简单的Linux内核

  • 构建Linux系统MenuOS在实验楼平台上运行
  • 代码:
$ cd ~/LinuxKernel/
$ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
  • 运行截图:

3.3跟踪调试Linux内核的启动过程

  • 用以下命令启动内核,冻结起来
$ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S

# 关于-s和-S选项的说明:
# 1. -S
# -S freeze CPU at startup (use ’c’ to start execution)
# 2. -s
# -s shorthand for -gdb tcp::1234
# 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项

  • 水平分割,启动gdb,把内核加载进来,建立连接。
# 打开 GDB 调试器
$ gdb # 在 GDB 中输入以下命令: # 在gdb界面中targe remote之前加载符号表
(gdb)file linux-3.18.6/vmlinux # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
(gdb)target remote:1234 # 断点的设置可以在target remote之前,也可以在之后
(gdb)break start_kernel

  • 再设置一个断点rest_init,继续执行,停在断点处。

分析关键的函数

  • start_kernel函数的执行过程
asmlinkage __visible void __init start_kernel(void)
{
char *command_line;
char *after_dashes; /*
* Need to run as early as possible, to initialize the
* lockdep hash:
*/
lockdep_init();
set_task_stack_end_magic(&init_task);// init_task即手工创建的PCB,0号进程即最终的idle进程
smp_setup_processor_id();
debug_objects_early_init();
// ...
trap_init(); // 中断向量的初始化
mm_init(); // 内存模块的初始化
sched_init(); // 调度模块的初始化
// ...
rest_init(); // rest_init是0号进程(是使用宏初始化的),它创建1号进程init和其他的一些服务进程
}

2019-2020-1 20199308《Linux内核原理与分析》第四周作业的更多相关文章

  1. 2019-2020-1 20199303<Linux内核原理与分析>第二周作业

    2019-2020-1 20199303第二周作业 1.汇编与寄存器的学习 寄存器是中央处理器内的组成部份.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中 ...

  2. 20169219 linux内核原理与分析第二周作业

    "linux内核分析"的第一讲主要讲了计算机的体系结构,和各寄存器之间对数据的处理过程. 通用寄存器 AX:累加器 BX:基地址寄存器 CX:计数寄存器 DX:数据寄存器 BP:堆 ...

  3. 2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

    1.基础学习内容 1.1 冯诺依曼体系结构 计算机由控制器.运算器.存储器.输入设备.输出设备五部分组成. 1.1.1 冯诺依曼计算机特点 (1)采用存储程序方式,指令和数据不加区别混合存储在同一个存 ...

  4. Linux内核原理与分析-第一周作业

    本科期间,学校开设过linux相关的课程,当时的学习方式主要以课堂听授为主.虽然老师也提供了相关的学习教材跟参考材料,但是整体学下来感觉收获并不是太大,现在回想起来,主要还是由于自己课下没有及时动手实 ...

  5. 2019-2020-1 20199314 <Linux内核原理与分析>第一周作业

    前言 本周对实验楼的Linux基础入门进行了学习,目前学习到实验九完成到挑战二. 学习和实验内容 快速学习了Linux系统的发展历程及其简介,学习了下的变量.用户权限管理.文件打包及压缩.常用命令的和 ...

  6. Linux内核原理与分析-第二周作业

    写之前回看了一遍秒速五厘米:如果

  7. 20169219linux 内核原理与分析第四周作业

    系统调用 系统调用是用户空间访问内核的唯一手段:除异常和陷入外,它们是内核唯一的合法入口. 一般情况下,应用程序通过在用户空间实现的应用编程接口(API)而不是直接通过系统调用来编程. 要访问系统调用 ...

  8. 2018-2019-1 20189221《Linux内核原理与分析》第一周作业

    Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...

  9. 2019-2020-1 20199329《Linux内核原理与分析》第十三周作业

    <Linux内核原理与分析>第十三周作业 一.本周内容概述 通过重现缓冲区溢出攻击来理解漏洞 二.本周学习内容 1.实验简介 注意:实验中命令在 xfce 终端中输入,前面有 $ 的内容为 ...

  10. 2019-2020-1 20199329《Linux内核原理与分析》第十二周作业

    <Linux内核原理与分析>第十二周作业 一.本周内容概述: 通过编程理解 Set-UID 的运行机制与安全问题 完成实验楼上的<SET-UID程序漏洞实验> 二.本周学习内容 ...

随机推荐

  1. 模块 os 系统

    os系统 os模块是与操作系统交互的一个接口 os.makedirs('dirname1/dirname2') 可生成多层递归目录 os.removedirs('dirname1') 若目录为空,则删 ...

  2. 《JAVA与模式》之责任链模式 【转载】

    转载自java_my_life的博客 原文地址:http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html 在阎宏博士的&l ...

  3. MATLAB——元胞数组

    一. 1.元胞数组的创建 >> a={;ones(,),:} a = ] [2x3 ;ones(,),:} >> b=[{};{ones(,)},{:}] b = ] [2x3 ...

  4. linux中的文本处理命令

    一.wc :统计文本的行数.字符数. -l:只显示行数 -d:只显示单词数 -c:只显示字符数 二.tr:转换字符或者删除字符 -d:删除字符 三.cut -d:指定分隔符 -f:指定要显示的字段 例 ...

  5. 基于Java的数字货币交易系统的架构设计与开发

    前言 无论是股票交易系统,还是数字货币交易系统,都离不开撮合交易引擎,这是交易平台的心脏.同时,一个优秀的架构设计也会让交易平台的运维和持续开发更加容易.本文基于对开源项目的深入研究,总结了数字货币交 ...

  6. 1127: 【入门】A类多?B类多?

    1127: [入门]A类多?B类多? 时间限制: 1 Sec 内存限制: 16 MB 提交: 3537 解决: 2406 [提交] [状态] [讨论版] [命题人:外部导入] 题目描述 一个自然数转换 ...

  7. 2019级第一次月赛暨ACM工作室第一次招新赛、补题赛

    A:最简单签到,没有之一 Description 此题简单如题意,就是求最大值 Input 多组输入 每组输入输入一串字符串(包括字母和数字),长度小于500 Output 每行输出字符ASCII值与 ...

  8. 树形DP——动态规划与数据结构的结合,在树上做DP

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法与数据结构的第15篇,也是动态规划系列的第4篇. 之前的几篇文章当中一直在聊背包问题,不知道大家有没有觉得有些腻味了.虽然经典的文 ...

  9. STM32F103ZET6系统定时器SysTick

    1.系统定时器SysTick的简介 系统定时器SysTick属于内核外设,内嵌在NVIC中.SysTick是一个24位的向下递减的计数器,计数器根据SysTick的时钟源计数,当SysTick的计数器 ...

  10. git使用基本步骤

    一.Git配置环境: 1.通过git init命令把某个目录变成Git可以管理的仓库: 2.生成公钥秘钥:ssh key ssh-keygen -t rsa -C "for example@ ...