Linux内核分析作业 NO.2】的更多相关文章

1. 实验目的 选择一个系统调用(13号系统调用time除外),系统调用列表,使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 分析汇编代码调用系统调用的工作过程,特别是参数的传递的方式等. 阐明自己对“系统调用的工作机制”的理解. 实验过程 2.1 fork函数 本次实验选择fork系统调用,其系统调用号为: 2 i386 fork sys_fork stub32_fork 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的…
        1.可执行文件的格式 在 Linux 平台下主要有以下三种可执行文件格式: 1.a.out(assembler and link editor output 汇编器和链接编辑器的输出) 2.COFF(Common Object File Format 通用对象文件格式) 3.ELF(Executable and Linking Format 可执行和链接格式). 在本课程中,主要介绍的是ELF文件.ELF 文件又分为三种类型:共享目标文件(库文件,后缀为.so).可执行文件.可重…
task_struct结构: struct task_struct {   volatile long state;进程状态  void *stack; 堆栈  pid_t pid; 进程标识符  unsigned int rt_priority;实时优先级  unsigned int policy;调度策略  struct files_struct *files;系统打开文件  ... } 内核处理函数sys_clone:     系统调用通过do_fork实现进程的创建: return do…
1.增加 Menu 内核命令行 调试系统调用. 步骤:删除menu git clone        (tab) make rootfs 这就是我们将 fork 函数写入 Menu 系统内核后的效果,通过命令行,实现了操作系统调用过程. 2.GDB 追踪内核调用 sys_fork 通过查询操作系统内核调用函数 API,我们知道 fork 函数的系统调用是 sys_fork,下面我们就通过 GDB 来追踪 sys_fork 的调用过程. 由图可知,sys_fork 在底层调用的是 do_fork…
一.实验 使用gcc –S –o main.s main.c -m32 命令编译成汇编代码,如下代码中的数字请自行修改以防与他人雷同 int g(int x) { return x + 3; } int f(int x) { return g(x); } int main(void) { return f(8) + 1; } 源代码: 汇编代码: 去点.开头的代码后 堆栈变化: 我对“计算机是如何工作的”理解 通过以上一个小例子,清楚地展示了计算机是如何在堆栈中进行数据流的变化的.我的理解是,当…
计算机如何工作 三个法宝:存储程序计算机.函数调用堆栈.中断机制. 堆栈 函数调用框架 传递参数 保存返回地址 提供局部变量空间 堆栈相关的寄存器 Esp 堆栈指针  (stack pointer) Ebp 基址指针 (base pointer) 堆栈操作 Push:pop Ebp用作记录当前函数调用基址- 其他关键寄存器   中断 Call指令:1.将eip中下一条指令的地址A保存在栈顶:2.设置eip指向被调用程序代码开始处 1.Call xxx 2.进入xxx pushl %ebp mov…
内核源码目录 1. arch:录下x86重点关注 2. init:目录下main.c中的start_kernel是启动内核的起点 3. ipc:进程间通信的目录 实验 使用实验楼的虚拟机打开shell cd LinuxKernel/ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img 使用gdb跟踪调试内核 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initr…
系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权,系统容易崩溃...可以让系统更稳定, Linux 只有0和3级 如何区分:cs和eip 0x0000000以上地址空间仅有内核态可以访问,0x00000000——0xbffffff两种状态都可访问 中断处理是从用户态进入内核态的主要方式 切换时,保存用户态寄存器上下文,int指令在堆栈保存一些寄存…
进程的切换和系统的一般执行过程 于佳心  原创作品转载请注明出处  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 试验:理解进程调度时机跟踪分析进程调度与进程切换的过程 按照老规矩进入qemu 启动gdb之后完成一系列设置,最后设置一个断点schedule,然后开始漫长的跟踪之路 运行到schedule停下了 进程切换的关键代码switch_to分析 进程的调度时机与进程的切换 不同类型的进程有不同的调度需求…
可执行程序的装载 于佳心  原创作品转载请注明出处  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验:Linux内核如何装载和启动一个可执行程序 首先,按照老流程,我们进入LinuxKernel,删除menu,再拷贝menu 然后我们进入menu,用test_exec和test.c中的一个覆盖另一个 我们打开test.c查看代码 和exec有关的部分,其中引入了hello 打开hello,发现hello就…
进程的描述和进程的创建 于佳心  原创作品转载请注明出处  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验 分析一个Linux内核创建新进程的过程 首先,按照之前学过的方法,删除menu,并克隆一个新menu 输入make rootfs之后 在qemu界面输入fork 设置很多很多断点 在设置了一系列断点之后,开始一步一步的运行. 通过实验我们发现: 新进程开始的地方是ret_from_fork 在ret…
系统调用的三个层次 一.用户态.内核态和中断 用户通过库函数与系统调用联系起来. 1.内核态 在高的执行级别下,代码可以执行特权指令,访问任意的物理地址,这时的CPU就对应内核态 2.用户态: 在低级别的指令状态下,代码 只能在级别允许的特定范围内活动.在日常操作下,执行系统调用的方式是通过库函数,库函数封装系统调用,为用户提供接口以便直接使用. intel x86 CPU有四个权限分级,0-3.Linux只取两种,0是内核态,3是用户态 区分权限级别使得系统更加稳定. 3.中断(切换) 中断处…
进程的切换和系统的一般执行过程 贾瑗 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 一.进程切换的关键代码switch-to分析 1.进程调度与进程调度的时机分析 不同类型的进程有不同的调度需求 第一种 I/O-bound · 频繁的进行I/O · 通常会花费很多的时间等待I/O操作的完成 CPU-bound · 计算密集型 · 需要大量的CPU时间进行计算 //导致交互式计算反应迟…
拔掉系统调用的三层皮(下) 于佳心 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 在视频中老师给MenuOS增加time和time_asm命令,并使用gdb跟踪调用内核函数sys _time,在这里我选择02 fork函数,执行相似的流程 在MenuOS中添加命令的过程分四步: 1.更新menu代码到最新版 2.在main函数中增加MenuConfig 3.增加对应函数 4.make…
扒开系统调用的三层皮(上) 于佳心 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 我选择了02系统调用,fork 库函数API #include <unistd.h> #include <stdio.h> int main() { pid_t f; f = fork(); printf("…
操作系统是如何工作的 于佳心 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000  本章所学内容主要围绕着三个方面. 1.函数调用堆栈 2.中断机制 3.mykernel上实际操作构建内核 操作系统的三个法宝指的是:存储程序计算机,函数调用堆栈,中断机制 其中函数调用堆栈是高级语言的起点,它的作用是记录调用路径和参数(调用框架,传递参数,保存返回地址,提供局部变量空间) 这里涉及到了esp,…
通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 于佳心 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 计算机是如何工作的? 计算机的工作的基础冯诺依曼体系结构,即存储程序计算机. 这里涉及到两个重要的接口,一个是API,程序员与计算机的接口,另一个是ABI,程序与CPU的接口. 程序员通过编程语言下达指令,指令则通过汇编被翻译成计算机语言,使计算机能够明白你的意思,进而执…
操作系统是如何工作的 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.函数调用堆栈 1.计算机工作三个法宝 存储程序计算机.中断机制.堆栈 存储程序计算机工作模型,计算机系统最最基础性的逻辑结构: 函数调用堆栈,高级语言得以运行的基础,只有机器语言和汇编语言的时候堆栈机制对于计算机来说并不那么重要,但有了高级语言及函数,堆栈成为了计算机的基础功能: 2.堆栈是C语言程序运行时必须的一个记录调用路径和参数的空…
贾瑗 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000  一.操作系统是如何工作的 进程:是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.进程需要执行的时候操作系统对他分配相应的资源的.这里的资源指的就是计算机的硬件和系统资源. CPU只有一个但计算机会有很多进程,所以系统需要轮流给进程分配CPU这个硬件资源,这就是的时间片…
一.实验:简单的时间片轮转多道程序内核代码运行与分析 my_start_kernel之前都是硬件初始化,它是操作系统的执行入口,每循环100000次就进行一次打印. 执行更加简单,每次时钟中断时都会调用函数输出my_time_handler.其中怎样获取时钟中断和时钟中断处理入口由Linux内核代码处理好了. 二.操作系统是如何工作的 1.中断机制(由CPU和内共同实现了保留和恢复现场) 2.进程上下文的切换:a.还从未执行过的进程 b.正在执行的进程 三.进程的启动和切换机制 在interru…
构造一个简单的Linux系统MenuOS 复习 计算机三大法宝 存储程序计算机 函数调用堆栈 中断 操作系统两把宝剑 中断上下文的切换 进程上下文的切换 一.Linux内核源代码简介 函数目录 Linux-3.18.6/arch/x86 Linux-3.18.6/init:内核启动的相关代码基本都存在该目录下 start_kernel函数相当于普通C程序的main函数 Linux-3.18.6/kernel:Linux内核的核心代码在该目录下 fs:file system文件系统 ipc:进程间…
系统调用的三个层次(下) 一.给MenuOS增加time和time-asm命令 1.克隆并自动编译 MenuOS rm menu -rf 强制删除原menu文件 git clone https://github.com/mengning/menu.git      从github中克隆 cd menu make rootfs 运行自动编译脚本,生成根文件系统,启动MenuOS 2.给MenuOS增加time和time-asm命令 更新menu代码到最新版 test.c中main函数里 增加Men…
1.阅读理解task_struct数据结构 2.分析fork函数对应的内核处理过程sys_clone,理解创建一个新进程如何创建和修改task_struct数据结构: fork进程的代码 #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char * argv[]) { int pid; /* fork another process */ pid = fork()…
一.实验楼实验 使用实验楼的虚拟机打开shell 1 cd LinuxKernel/ 2 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img 内核启动完成后进入menu程序,支持三个命令help.version和quit 使用gdb跟踪调试内核 1 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S # 关于-s和-S选项…
进程的切换和系统的一般执行过程 一.进程调度的时机 中断处理过程(包括时钟中断.I/O中断.系统调用和异常)中,直接调用schedule(),或者返回用户态时根据need_resched标记调用schedule(): 内核线程可以直接调用schedule()进行进程切换,也可以在中断处理过程中进行调度,也就是说内核线程作为一类的特殊的进程可以主动调度,也可以被动调度: 用户态进程无法实现主动调度,仅能通过陷入内核态后的某个时机点进行调度,即在中断处理过程中进行调度. 二.进程的切换 为了控制进程…
一. 预处理.编译.链接 gcc hello.c -o hello. gcc编译源代码生成最终可执行的二进制程序,GCC后台隐含执行了四个阶段步骤. 预处理 → 编译 → 汇编 → 链接 预处理:编译器将C源代码中包含的头文件编译进来和执行宏替换等工作. gcc -E hello.c -o hello.i 编译:gcc首先要检查代码的规范性.是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc把代码翻译成汇编语言. gcc –S hello.i –o hello.s-S:该选项只进…
创建新进程的过程 一.进程的描述 为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. 1.进程控制块PCB——task_struct 操作系统的三大管理功能 进程管理 内存管理 文件系统 PCB task_struct中包含 进程状态 进程打开的文件 进程优先级信息 struct task_struct数据结构很庞大 2.Linux进程的状态 操作系统的三大功能:进程管理.内存管理和文件系统 3.fork代码:fork.vfork和clone这三个函数最终都…
扒开系统调用的三层皮 一.用户态.内核态和中断 一般现代CPU都有几种不同的指令级别 在高级别执行级别下,代码可以执行特权指令,访问任意的物理地址,称之为内核态 在相应的低指令执行级别下,代码的掌控范围会受到限制,只能在对应级别允许的范围内活动,称之为用户态 为什么会有权限级别划分 为了让系统本身更稳定,保证代码不被误写崩溃 CS寄存器的最低两位表明了当前代码的特权级 CPU每条指令的读取都是通过CS:eip这两个寄存器 CS:代码段选择寄存器 eip:偏移量寄存器 在Linux中,地址空间是一…
一.实验 通过反汇编一个简单的c语言程序来分析计算机是如何工作的 1.进入实验楼,在实验楼环境下把c语言代码转换成汇编码 汇编代码如下图: 二.汇编代码的工作过程中堆栈的变化:(手绘步骤,顺序是从左到右,从上到下) 三.计算机是如何工作的: 计算机的基本原理是存储程序和程序控制,按照冯若依曼体系结构计算机分为CPU和内存,内存用来存储程序,CPU从内存取指令来执行,按程序编排的顺序,一步一步地取出指令.在计算机中使用了最原始的汇编程序,函数调用堆栈是由逻辑上多个堆栈累加起来的,函数的返回值默认使…
扒开系统调用的三层皮(下) 给MenuOS增加time和time-asm命令 步骤 rm menu -rf //强制删除 git clone http://github.com/menging/menu.git // 克隆相关信息到menu cd menu make rootfs //自动编译生成根文件系统,自动启动 如何给MenuOS增加命令 更新menu代码到最新版 在main函数中增加MenuConfig 增加对应的函数 make rootfs 使用gdb跟踪系统调用内核函数sys_tim…