Linux及安全期中总结
Chapter1 往期博客传送门
Linux内核分析——第一周学习笔记
Linux内核分析——第二周学习笔记
Linux内核分析——第三周学习笔记
《Linux内核设计与实现》学习记录一
Linux内核分析——第四周学习笔记
Linux内核实验作业四
《Linux内核设计与实现》第五章读书笔记
Linux内核分析——第五周学习笔记
实验作业:使gdb跟踪分析一个系统调用内核函数
《Linux内核设计与实现》第十八章读书笔记
Linux内核实验作业五
Linux内核分析——第六周学习笔记
《Linux内核设计与实现》第三章读书笔记
《深入理解计算机系统》第七章读书笔记
Linux内核实验作业六
《Linux内核设计与实现》第四章读书笔记
Linux内核分析——第八周学习笔记
chapter2 知识点梳理
1. 计算机是如何工作的?
存储程序计算机工作模型:冯诺依曼体系结构 X86汇编基础:CPU的寄存器(通用寄存器、段寄存器、标志寄存器)、常见汇编指令、堆栈 汇编一个简单的C程序分析其汇编指令执行过程
2. 操作系统是如何工作的?
函数调用堆栈 借助Linux内核部分源代码模拟存储程序计算机工作模型及时钟中断 在mykernel基础上构造一个简单的操作系统内核 三个法宝:
- 存储程序计算机:所有计算机基础性的逻辑框架
- 堆栈:高级语言的起点,函数调用需要堆栈机制
- 中断机制:多道系统的基础,是计算机效率提升的关键
3. 构造一个简单的Linux系统MenuOS
-
Linux内核源代码简介
•arch:支持不同的CPU的源代码,其中的关键目录包括:Documentation、drivers、firewall、fs、include等 •documentation:文档目录 •fs:文件系统 •init:内核启动相关的代码main.c、Makefile等基本都在该目录中。(main.c中的start_ kernel函数是Linux内核启动的起点,即初始化内核的起点) •kernel:Linux内核核心代码在kernel目录中。 •lib:公用的库文件 •mm:内存管理的代码 •scripts:与脚本相关的代码 •security:与安全相关的代码 •sound目录:与声音相关的代码 •tools目录:与工具相关的代码 •net:与网络相关的代码 •readme:介绍了什么是Linux,Linux能够在哪些硬件上运行,如何安装内核源代码等
-
构造一个简单的Linux系统
cd LinuxKernel/ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
qemu命令是模拟内核启动虚拟机,启动Linux内核需要三个参数(kernel、initrd、root所在的分区和目录),执行的第一个文件是init。 -kernel指明内核文件名 -initrd指明根文件系统,启动其中的init文件。(menuOS源代码编译->init->rootfs.img)其中rootfs.img 为根文件系统,目前只支持help、version、quit功能。 启动过程为:启动内核->启动init->启动进程
-
跟踪调试Linux内核的启动过程
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
4. 扒开系统调用的三层皮(上)
(一)用户态、内核态和中断处理过程
内核态:一般现代CPU有几种指令执行级别。在高执行级别下,代码可以执行特权指令,访问任意的物理地址,这种CPU执行级别对应着内核态 用户态:在相应的低级别执行状态下,代码的掌控范围有限,只能在对应级别允许的范围内活动 中断处理是从用户态进入内核态的主要方式,中断/int指令会在堆栈上保存一些寄存器的值:如用户态栈顶地址、当前的状态字、当时cs:eip的值(当前中断程序的入口)
(二)系统调用概述
系统调用是操作系统为用户态进程与硬件设备进行交互提供的一组接口 系统调用概述和系统调用的三层皮:xyz(API)、system_ call(中断向量)、sys_xyz(中断向量对应的中断服务程序)
(三)使用库函数API和C代码中嵌入汇编代码触发同一个系统调用
使用库函数API获取系统当前时间 C代码中嵌入汇编代码的方法 使用C代码中嵌入汇编代码触发系统调用获取系统当前时间
5. 扒开应用系统的三层皮(下)
rm menu -rf //强制删除当前menu git clone http://github.com/mengning/menu.git //重新克隆新版本的menu cd menu ls make rootfs //rootfs是事先写好的一个脚本,自动编译自动生成根文件系统,同时自动启动MenuOS vi test.c //进入test.c文件 MenuConfig("getpid","Show Pid",Getpid); MenuConfig("getpid_asm","Show Pid(asm)",GetpidAsm); //在main函数中增加MenuConfig() int Getpid(int argc,char *argv[]); int GetpidAsm(int argc,char *argv[]); //增加对应的Getpid和GetpidAsm两个函数 make rootfs //编译