Linux内核分析第九次作业】的更多相关文章

理解进程调度时机跟踪分析进程调度与进程切换的过程 一.基础知识 Linux系统的一般执行过程 一般情况:正在运行的用户态进程X切换到运行用户态进程Y的过程 1. 正在运行的用户态进程X 2. 发生中断 3. SAVE_ALL //保存现场,这里是已经进入内核中断处里过程 4. 中断处理过程中或中断返回前调用了schedule(),其中的switch_to做了关键的进程上下文切换 5. 标号1之后开始运行用户态进程Y(这里Y曾经通过以上步骤被切换出去过因此可以从标号1继续执行) 6. restor…
Linux内核分析第九周 期中总结 一.知识概要 1. 计算机是如何工作的 存储程序计算机工作模型:冯诺依曼体系结构 X86汇编基础 会变一个简单的C程序分析其汇编指令执行过程 2. 操作系统是如何工作的 函数调用堆栈 模拟存储程序计算机工作模型和时钟中断 在mykernel基础构建一个简单的操作系统 3.构造一个简单的Linux系统 Linux内核源代码 构造一个简单的Linux系统 跟踪调试Linux内核的启动过程 4. 系统调用 用户态.内核态和中断 系统调用概述 使用库函数API和C代码…
环境搭建 环境的搭建参考课件,主要就是编译内核源码和生成镜像 start_kernel 从start_kernel开始,才真正进入了Linux内核的启动过程.我们可以把start_kernel看做平时用C编程时的main函数. 在平时应用程序编程中,main函数并不是一开始就启动的,而是先使用汇编和C准备一些变量,例如我们使用的argc和argv参数,以及一些全局变量的初始化.所以我们使用gdb调试程序时,使用bt打印栈痕迹,发现最下面的函数并不是main,而是__libc_start_main…
1.环境的搭建: 这个可以参考孟宁老师的github:mykernel,这里不再进行赘述.主要是就是下载Linux3.9的代码,然后安装孟宁老师编写的patch,最后进行编译. 2.代码的解读 课上的代码全部保存在github上,我fork了一份,然后为它加上了详细的注释,参见mykernel 3.代码结构 这里主要有三个文件: mypcb.h 这个头文件定义了进程控制结构PCB mymain.c 这个文件主要是定义了启动N个进程的过程 myinterupt.c 这个文件主要是时钟中断函数和进程…
署名信息 郭春阳 原创作品转载请注明出处 :<Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 C源码 这里为了防止重复,修改了部分源码 int g(int x) { return x + 99; } int f(int x) { return g(x); } int main(void) { return f(22) + 36; } 运行 gcc -S -o foo.s -m32 foo.c后,生成的汇编代码为…
这周学习了<庖丁解牛Linux内核分析>并且学习了实验楼的相关知识. 在实验楼的虚拟环境下编写代码: 通过gcc编译后,使用查看文件命令:cat  -n 20189223.c 在vim中,通过“g/\.s*/d”命令可以删除很多所有以“.”开头的字符串,获得了“干净”的代码. 堆栈空间示意图 程序从main函数开始执行,通过堆栈的方式进行运算 堆栈运行过程如图所示. 还学习了vim.gcc测试.gdb测试.静态库的测试.共享库 不懂的问题: 堆栈的过程不是特别清楚…
一.ELF文件格式 ELF(Executable and Linking Format)是x86 Linux系统下常用的目标文件格式,有三种主要类型: 适于连接的可重定位文件,可与其他目标文件一起创建可执行文件和共享目标文件. 适于执行的可执行文件,用于提供程序的进程映像,加载的内存执行. 共享目标文件,连接器可将它与其他可重定位文件和共享目标文件连接成其他目标文件. 文件格式 ELF header在文件开始处描述了整个文件的组织,Section提供了目标文件的各项信息,Program head…
一.进程控制块PCB-stack_struct 进程在操作系统中都有一个结构,用于表示这个进程.这就是进程控制块(PCB),在Linux中具体实现是task_struct数据结构,它主要记录了以下信息: 状态信息,例如可执行状态.就绪状态.阻塞状态等. 性质,由于unix有很多变种,进行有自己独特的性质. 资源,资源的链接比如内存,还有资源的限制和权限等. 组织,例如按照家族关系建立起来的树(父进程.子进程等). task_struct结构体内容非常庞大,暂时没有去分析源代码,以后有时间再去研究…
一.使用gdb跟踪分析一个系统调用内核函数 1.在test.c文件中添加time函数与采用c语言内嵌汇编的time函数.具体实现请看下图. 2.然后在main函数中添加MenuConfig函数,进行注册.这样当Menuos运行起来时,界面就会多出time与time-asm选项. 3.通过make rootfs命令运行 采用gdb调试的过程 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S gdb fi…
一.fork的嵌入式汇编执行 #include <stdio.h> #include <unistd.h> int main(){ pid_t pid; asm volatile( "mov $0,%%ebx\n\t" "mov $0x2,%eax\n\t" "int 0x80\n\t" "mov %%eax,%0\n\t" :"=m"(tt) ); ){ printf("…
一.基于时间片轮转调度代码的解读 代码结构主要由三个文件组成: 1.mypcb.h 2.myinterrupt.c 3.mymain.c 1.进程控制块(mypcb.h) /* CPU-specific state of this task */ struct Thread{ unsigned long ip; //eip,程序入口地址 unsigned long sp; //堆栈esp栈顶地址 }; typedef struct PCB{ int pid; //进程pid号 volatile…
1.C语言源码 #include <stdio.h> int g(int x){ ; } int f(int x){ return g(x); } int main(){ )+; } 2.生成汇编代码 gcc命令 gcc -S -o main.s main.c -m32 3.汇编代码分析 首先程序从main函数开始运行 pushl %ebp movl %esp,%ebp 这两步是建立自己的堆栈, subl $,%esp movl $,(%esp) 这两步是将数值8放入%esp所指的栈内存中.…
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时间进行计算 //导致交互式计算反应迟…
通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的(王海宁) 姓名:王海宁                             学号:20135103 课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一,C语言代码(导出代码截图) 二,实验过程 (1) 创建一个命名c代码文件代码为 :vi 名字.c 将C代码转换为汇编代码在64位linux虚拟机中的代码为:gcc -S -o 文件名.c -…
拔掉系统调用的三层皮(下) 于佳心 原创作品转载请注明出处 <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的接口. 程序员通过编程语言下达指令,指令则通过汇编被翻译成计算机语言,使计算机能够明白你的意思,进而执…