20135313吴子怡.北京电子科技学院

chapter1 知识点梳理

一、Linux内核源代码简介

(视频中对目录下的文件进行了简介,记录如下)

  1. arch目录

    占有相当庞大的空间
    arch/x86目录下的代码是需要重点关注的。
    arch下其他目录可以删掉。

  2. init目录

    内核启动相关的基本代码基本都在init目录下。
    main.c 文件中有一个start_kernel函数,初始化Linux内核的起点,这个函数相当于普通c程序的main函数。

  3. kernel目录

    Linux内核的核心代码在kernel目录中

  4. 其他

    Documentation 文档
    drivers 驱动
    fs-filesystem 文件系统
    include
    ipc 进程间通信

  5. README:

    INSTALLING 怎样安装内核源代码——怎么解压怎么打补丁
    make mrproper 把生成的中间代码清理干净
    menuconfig

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

  • 使用实验楼的虚拟机打开shell,命令如下:

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

内核启动完成后进入menu程序,支持三个命令help、version和quit。

  • 通过gdb跟踪内核的启动

  • 使用自己的Linux系统环境搭建MenuOS的过程

    下载内核源代码编译内核

    cd ~/LinuxKernel/
    wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz
    xz -d linux-3.18.6.tar.xz
    tar -xvf linux-3.18.6.tar
    cd linux-3.18.6
    make i386_defconfig
    make 

    制作根文件系统

    cd ~/LinuxKernel/
    mkdir rootfs
    git clone https://github.com/mengning/menu.git # 如果被墙,可以使用附件menu.zip
    cd menu
    gcc -o init linktable.c menu.c test.c -m32 -static –lpthread # 系统会默认启动init,即第一个用户态进程,1号进程
    cd ../rootfs
    cp ../menu/init ./
    find . | cpio -o -Hnewc |gzip -9 > ../rootfs.img # 镜像

    启动MenuOS系统

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

  • 重新配置编译Linux使之携带调试信息
  1. 在原来配置的基础上,make menuconfig选中如下选项重新配置Linux,使之携带调试信息(由于在实验楼中操作,因此省略个别步骤)

  2. make重新编译

  • 使用gdb跟踪调试内核

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

    关于-s和-S选项的说明:
    -S freeze CPU at startup (use ’c’ to start execution) cpu初始化之前把它冻结起来
    -s shorthand for -gdb tcp::1234 在1234端口上建立了一个gdb server
    若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项

打开另外一个shell

gdb
(gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表
(gdb)target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
(gdb)break start_kernel # 断点的设置可以在target remote之前,也可以在之后

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

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

除了前半部分提及的,以下部分为补充:

(gdb)c # 系统开始启动,启动到start_kernel
(gdb)list # 可以看到start_kernel上下的代码
(gdb)break rest_init
(gdb)c # 当前系统执行到rest_init
(gdb)list # 可以看到rest_init是在start_kernel的尾部调用的。

chapter2 实践实验过程

①构建Menu系统的过程

②使用gdb进行调试

③将断点设置到start_kernal

④将断点设置到rest_init

chapter3  简单分析一下start_kernel(作业)

①在init目录下main.c里找到start_kernel函数

②全局变量init_task,即手工创建的PCB,0号进程即最终的idle进程。

不管分析内核的哪一部分都会涉及到start_kernel.

③一些简要提及的函数

trap_init() 初始化一些中断向量
mm_init() 内存管理模块
sched_init() 调度模块
rest_init()中有kernel_thread(kernel_init,NULL,CLONE_FS),kernel_init中有run_init_process,创建了一号进程,默认路径下的程序。

注意:init_process是一号进程。

④创建kthread(一个内核线程来管理系统的资源)。
启动后,进入了一个cpu_idle,cpu_idle_loop,即一个while(0)的无限循环,或者说是idle进程,它作为0号进程适中存在于系统中。
当系统没有进程需要执行时就需要调度idle进程。

chapter4 总结

阐明对“Linux系统启动过程”的理解。

sched_init()初始化函数内对0号进程,即idle进程进行初始化。然后rest_init()其他初始化函数,函数内将创建1号进程,即init进程。随后rest_init实际上就是start_kernel内核一启动的时候会一直存在,这个就叫0号进程;0号进程创建了1号进程kernel_init和其他服务线程。这就是内核的启动过程。

chapter5 附录

作者:吴子怡

学号:20135313

原创作品转载请注明出处

《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

转载于:https://www.cnblogs.com/paperfish/p/5262306.html

Linux内核分析——第三周学习笔记相关推荐

  1. Linux内核分析——第八周学习笔记

    实验作业:进程调度时机跟踪分析进程调度与进程切换的过程 20135313吴子怡.北京电子科技学院 [第一部分]理解Linux系统中进程调度的时机 1.Linux的调度程序是一个叫schedule()的 ...

  2. Linux内核分析 第七周 可执行程序的装载

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

  3. linux内核启动分析 三,Linux内核分析 实验三:跟踪分析Linux内核的启动过程

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

  4. Linux内核分析(三)----初识linux内存管理子系统

    原文:Linux内核分析(三)----初识linux内存管理子系统 Linux内核分析(三) 昨天我们对内核模块进行了简单的分析,今天为了让我们今后的分析没有太多障碍,我们今天先简单的分析一下linu ...

  5. 《Linux内核分析》第一周笔记 计算机是如何工作的

    一.计算机是如何工作的? 1.存储程序计算机工作模型 1)冯诺依曼体系结构 学习研究计算机的基本概念.就是指存储程序计算机.所有的有计算功能的电子设备小到计算器,大到超级计算机核心部分都可以用这种体系 ...

  6. Linux内核设计第五周学习总结 分析system_call中断处理过程

    陈巧然原创作品 转载请注明出处   <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 使用gdb跟踪分析一 ...

  7. Linux内核分析作业第二周

    操作系统是如何工作的 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.函数调用堆栈 1.计算机工作三 ...

  8. android驱动开发 老罗,在Ubuntu上为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序(老罗学习笔记3)...

    在Android硬件抽象层(HAL)概要介绍和学习计划一文中,我们简要介绍了在Android系统为为硬件编写驱动程序的方法.简单来说,硬件驱动程序一方面分布在Linux内核中,另一方面分布在用户空间的 ...

  9. 国嵌linux内核编程,国嵌视频学习笔记---linux内核开发1

    一.linux内核简介 1.linux系统由两部分组成:内核空间和用户空间. 2.用户空间包括:用户应用程序和C库 3.内核空间包括:系统调用接口.内核和体系结构相关代码. 4.ARM处理器7种工作模 ...

最新文章

  1. 解决 Dynamics AX 2009 部署报表时错误
  2. linux定时导出数据库,linux 下定时导出备份oracle数据库
  3. bat等大公司常考java多线程面试题
  4. BigDecimal add方法问题:调用add后,求和结果没变
  5. Python中Function(函数)和methon(方法)
  6. 花店橱窗布置(洛谷P1854)(动态规划)
  7. jpa获取session_JPA 2 | 获取联接以及我们是否应该使用它们
  8. JAVA 框架-Spring
  9. Demo(3月28日)
  10. Java反编译工具 luyten 0.5.3
  11. cam全称_在ADU高级参数(parameter)中,术语CAM全称是什么?
  12. MFC分析工具—Resource Hacker
  13. Java连接HBase数据库,操作HBase数据库
  14. 南宁:“数字城管”让智慧城市建设提质提速
  15. 凡泰极客:远程办公,你礼貌吗?
  16. 6sigma 基本概念
  17. 锐捷服务器虚拟化技术_打造数字新基建 | 锐捷5G云小站助力行业数字化转型
  18. excel任意单元格中自动插入页码和总页数
  19. MFC win32 API串口同步模式代码示范
  20. Win10切换共享文件夹账号

热门文章

  1. Android聊天软件的开发(六)--表情
  2. 【C语言详解】——常见字符和字符串函数及其模拟实现
  3. 列表排序方法sort()的key参数取值,以及lambda匿名函数
  4. 使用Python轻松识别音频中文字(Whisper)
  5. 给大家表演一个打太极(doge)
  6. 在Eclipse中编译运行Android4.3应用源码——Launcher2和Gallery2
  7. python成绩管理系统源码下载_成绩管理系统.py
  8. 视频播放近5000w,一天狂揽19w粉,萌宠赛道再添黑马主播
  9. Full Binary Tree 2014 SD第五届ACM大学生程序设计竞赛 F
  10. 推箱子游戏 最短路径 python实现