2018-2019-1 20189203《Linux内核原理与分析》第四周作业
第一部分 课本学习
- 内核版本号:Linux内核自2013年12月起,就以A.B.C.D的方式命名。A和B变得无关紧要,C是内核的真实版本。每一个版本的变化都会带来新的特性,如内部API的变化等,改动的代码数量常常上万行。D是安全补丁和bug修复。
- 几个关键的目录:
Arch:与体系结构相关的子目录列表。
Block:存放Linux存储体系中关于块设备管理的代码。
Crypto:存放常见的加密算法的C语言代码。
Documentation:存放一些文档。
Drivers:驱动目录,里面分门别类地存放了Linux内核支持的所有硬件设备的驱动源代码。
Firmware:固件。
Fs:文件系统,里面列出了Linux支持的各种文件系统的实现。
Include:头文件目录,存放公共的头文件。
Init:init是初始化的意思,存放Linux内核启动时的初始化代码。
Ipc:里面是Linux支持的IPC的代码实现。
Kernel:存放内核本身需要的一些核心代码文件。其中有很多关键代码,包括pid--进程号等。
Lib:公用的库文件,里面是一些公用的库函数。
Mm:存放LInux的内存管理代码。
Net:该目录下是网络相关的代码,譬如TCP/IP协议栈等。 - 编译配置Linux内核的关键步骤:
1、编译安装步骤
安装开发组包>下载源码文件>.config: 准备配置文件>make menuconfig: 配置内核选项>make[-j#]>make modules_install: 安装模块>make install:安装内核相关文件>安装bzImage 为 /boot/vmlinuz-VERSION-RELEASE>生成initramfs>编辑grub的配置文件。
2、编译配置选项
(1)配置内核选项
(2)支持“更新”模式进行配置:make help
Make config:基于命令行以遍历的方式去配置内核中可配置的每个选项。
Make menuconfig:基于命令行以遍历的方式去配置内核中可配置的每个选项。
Make gconfig:基于GTK(GNOME)环境窗口界面。
Make xconfig: 基于QT(KDE)环境的窗口界面。
(3)支持“全新配置”模式进行配置
Make defconfig:基于内核为目标平台提供的“默认”配置进行配置。
Make allyesconfig:所有选项均回答为“yes”。
Make allnoconfig:所有选项均回答为“no”。
3.编译
全编译:make[-j#]
第二部分 实验操作
- 在实验楼环境下输入:
cd LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
完成启动内核的操作,如下图:

- 几个指令的含义:
qemu :相当于打开一个虚拟机
kernel:启动一个内核,位置由其后的文件名指定。
bzImage是vmLinux经过gzip压缩后的文件,是压缩的内核映像。vmLinux是编译出来的最原始的内核ELF文件。
initrd是“initial ramdisk”的简写,普通linux用户一般感受不到这个内存根文件系统的存在,内核启动先访问initrd文件系统,然后在切换到磁盘文件系统。 - 使用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之前,也可以在之后
- 操作如下:
加载符号表:

链接gdbserver:

设置一个断点

查看start_kernel函数的上下文

第三部分 分析从start_kernel到init进程启动的过程
1、start_kernel()
代码如下:

- main.c中没有main函数,start_kernel()相当于C语言中的main函数。Start_kernel是一切的起点,在此函数被调用之前,内核代码主要是用汇编语言写的,用于完成硬件系统的初始化工作,为C代码的运行设置环境。
2、init_task()
代码如下:

- init_task(0号进程)是task_struct类型,是进程描述符,使用宏INIT_TASK对其进行初始化。接下来就是对各模块的初始化。
3.rest_init()
代码如下:

- rest_init()这个函数调用系统函数 kernel_thread() 创建 1 号进程,即 init 进程,是用户态所有进程的祖先。然后,新建 kthreadd 进程,是内核态所有进程的祖先。最后,通过 cpu_startup_entry 函数启动 0 号进程。
Init_task()(PID为0)在创建了init进程后,调用cpu_idle()演变成idle进程,执行一次调度后,init进程运行。1号内核线程负责执行内核的部分初始化工作及进行系统配置,最后调用do_execve加载init程序,演变成init进程(用户态1号进程),init进程是内核启动的第一个用户态进程。Kthreadd(PID为2)进程由0号进程创建,始终运行在内核空间,负责所有内核线程的调度和管理。
2018-2019-1 20189203《Linux内核原理与分析》第四周作业的更多相关文章
- 2019-2020-1 20199303<Linux内核原理与分析>第二周作业
2019-2020-1 20199303第二周作业 1.汇编与寄存器的学习 寄存器是中央处理器内的组成部份.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中 ...
- 20169219 linux内核原理与分析第二周作业
"linux内核分析"的第一讲主要讲了计算机的体系结构,和各寄存器之间对数据的处理过程. 通用寄存器 AX:累加器 BX:基地址寄存器 CX:计数寄存器 DX:数据寄存器 BP:堆 ...
- 2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
1.基础学习内容 1.1 冯诺依曼体系结构 计算机由控制器.运算器.存储器.输入设备.输出设备五部分组成. 1.1.1 冯诺依曼计算机特点 (1)采用存储程序方式,指令和数据不加区别混合存储在同一个存 ...
- Linux内核原理与分析-第一周作业
本科期间,学校开设过linux相关的课程,当时的学习方式主要以课堂听授为主.虽然老师也提供了相关的学习教材跟参考材料,但是整体学下来感觉收获并不是太大,现在回想起来,主要还是由于自己课下没有及时动手实 ...
- 2019-2020-1 20199314 <Linux内核原理与分析>第一周作业
前言 本周对实验楼的Linux基础入门进行了学习,目前学习到实验九完成到挑战二. 学习和实验内容 快速学习了Linux系统的发展历程及其简介,学习了下的变量.用户权限管理.文件打包及压缩.常用命令的和 ...
- Linux内核原理与分析-第二周作业
写之前回看了一遍秒速五厘米:如果
- 20169219linux 内核原理与分析第四周作业
系统调用 系统调用是用户空间访问内核的唯一手段:除异常和陷入外,它们是内核唯一的合法入口. 一般情况下,应用程序通过在用户空间实现的应用编程接口(API)而不是直接通过系统调用来编程. 要访问系统调用 ...
- 2018-2019-1 20189221《Linux内核原理与分析》第一周作业
Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...
- 2019-2020-1 20199329《Linux内核原理与分析》第十三周作业
<Linux内核原理与分析>第十三周作业 一.本周内容概述 通过重现缓冲区溢出攻击来理解漏洞 二.本周学习内容 1.实验简介 注意:实验中命令在 xfce 终端中输入,前面有 $ 的内容为 ...
- 2019-2020-1 20199329《Linux内核原理与分析》第十二周作业
<Linux内核原理与分析>第十二周作业 一.本周内容概述: 通过编程理解 Set-UID 的运行机制与安全问题 完成实验楼上的<SET-UID程序漏洞实验> 二.本周学习内容 ...
随机推荐
- Linux文件属性有哪些?(共十位)
-rw-r--r-- 那个是权限符号,总共是 - --- --- --- 这几个位. 第一个短横处是文件类型识别符: - 表示普通文件: c 表示字符设备(character): b 表示块设备(bl ...
- Deepin 15.5上安装 Node.js
Node.js 源码安装 以下部分我们将介绍在Ubuntu Linux下安装 Node.js . 其他的Linux系统,如Centos等类似如下安装步骤. 在 Github 上获取 Node.js 源 ...
- Android开发怎么让自己的APP UI漂亮、大方(规范篇一)
首先,笔者是站立在开发者的角度来看UI设计的,欢迎专业人士提供指导,不多说,来看怎么把UI设计和开发高效结合起来~ 一.约定APP开发中的一些规则 1.大部分图标满足HDPI(高清)即可,比如:大众点 ...
- AI人工智能顶级实战工程师 课程大纲
课程名称 内容 阶段一.人工智能基础 — 高等数学必知必会 1.数据分析 "a. 常数eb. 导数c. 梯度d. Taylore. gini系数f. 信息熵与组合数 ...
- Postman-REST-Client_v0.8.1之chrome插件下载
一.前言 安装chrome浏览器postman-rest-client插件,实现基于资源RestFul的http协议的GET.POST.DELETE.PUT等方式请求调用,具体安装使用步骤如下所示 二 ...
- kafka性能测试
参考阿里中间件团队博客的博文 Kafka vs RocketMQ——多Topic对性能稳定性的影响 使用的测试工具为Jmeter
- 24小时学通Linux内核之调度和内核同步
心情大好,昨晚我们实验室老大和我们聊了好久,作为已经在实验室待了快两年的大三工科男来说,老师让我们不要成为那种技术狗,代码工,说多了都是泪啊,,不过我们的激情依旧不变,老师帮我们组好了队伍,着手参加明 ...
- FatFs文件系统的移植
FatFs 的底层可以写一次命令,读写多个扇区.FatFs的设计的读写的思想就很好,小块的数据,我就经过Buffer来存储,大块的数据,我就直接进行存取,那样速度,效率高了很多,看图: FatFs文件 ...
- Cuda9.1+cunn7.1+Tensorflow1.7-GUP
Cuda9.1下载地址 cudnn下载 需要注册英伟达账号 cuda安装完成后默认的环境变量配置不对,CUDA_PATH是C:\Program Files\NVIDIA GPU Computing ...
- 常见机试题分析Java版
1. 操作系统任务分为系统任务和用户任务两种.其中,系统任务的优先级<50,用户任务的优先级>=50且<=255.优先级大于255的为非法任务,应予以剔除.现有一任务队列task[] ...