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程序漏洞实验> 二.本周学习内容 ...
随机推荐
- golang:iconv
最近在做邮件解析的工作,遇到需要转字符集编码的情况,go官方好像没有提供这样的库,于是从github上找了一下. https://github.com/qiniu/iconv 开发环境: linux ...
- windows nginx配置https访问
本文主要记录在windows下安装nginx 环境:win10-64位. 1. 到nginx官网上下载相应的安装包,http://nginx.org/en/download.html: 下载进行解压 ...
- 【Java】的四种引用的区别
强引用:如果一个对象具有强引用,它就不会被垃圾回收器回收.即使当前内存空间不足,JVM 也不会回收它,而是抛出 OutOfMemoryError 错误,使程序异常终止.如果想中断强引用和某个对象之间的 ...
- iOS开发之duplicate symbols for architecture x86_64错误
[主要内容:] 1. 错误提示 2. 分析错误原因 3. 解决问题办法 一.错误提示 在我们写代码过程中可能会经常遇到这样一个错误: <span style="font-size: ...
- 链路追踪工具之Zipkin学习小记
(接触了Zipkin,权将所了解或理解的记于此,以备忘) 分布式追踪系统 随着业务发展,系统拆分多个微服务.此时对于一个前端请求可能需要调用多个后端端服务才能完成,当整个请求变慢或不可用时,我们是无法 ...
- C#WebService服务在Windows7的部署
(一)C#WebService服务在Windows7的部署 一.在控制面板,程序与卸载中安装IIS组件. 二.IIS无法显示WebService的.asmx文件.解决办法:注:(这里可以不用考虑,直 ...
- SpringBoot2.X + SpringCache + redis解决乱码问题
环境:SpringBoot2.X + SpringCache + Redis Spring boot默认使用的是SimpleCacheConfiguration,使用ConcurrentMapCach ...
- Android打开doc、xlsx、ppt等office文档解决方案
妹子我写代码很辛苦/(ㄒoㄒ)/~~ ,转载请标明出处哦~http://blog.csdn.net/u011791526/article/details/73088768 1.Android端有什么控 ...
- 本人AI知识体系导航 - AI menu
Relevant Readable Links Name Interesting topic Comment Edwin Chen 非参贝叶斯 徐亦达老板 Dirichlet Process 学习 ...
- 【App】不通过App Store实现ios应用分发下载安装(转)
转自:https://www.cnblogs.com/star91/p/5018995.html 最近公司的项目准备着手宣传工作了,宣传手册上要印制App的下载地址二维码,但是客户端应用还未上线, ...