Orange's 进程

2023-05-16

       解释一个操作系统的实现/chapter6/r中代码。

       程序流程如下:

       1、把Loader中的GDT和esp挪到Kernel中,初始化IDTPTR

       2、初始化8259,初始化IDT,初始化GDT中的TSS和LDT两个描述符,以及初始化TSS

       3、初始化进程表,指定时钟中断处理程序,让8259可以接受中断,restart开始从ring0内核切换到ring1进程执行

       4、当发生时钟中断,或者Int 90时,由ring 1进程态切换到ring 0内核态,首先保存所有寄存器,启动进程调度函数,恢复被调度的进程的寄存器,从而由ring0内核态又回到了ring1新进程

       程序最重要的一个图如下:

       

       进程切换几个关键问题,从ring1切换到ring0,触发的条件一个是时钟中断,一个是get_ticks,每次发生中断的时候,此时的堆栈是进程表的堆栈,由硬件自动把ss,esp,eflag,cs,ip压入tss制定的堆栈中,然后执行到中断处理程序时call save压入一个retaddr,接着save代码中压入其他的寄存器,这样就形成了表中的样子,然后切换到内核栈,执行中断处理程序,里面有进程调度程序,就是p_proc_ready指向不同的进程表,之后赋值给esp,此时堆栈又切换为进程表的堆栈,依次pop之后,iretd,切换到ring0,此时的堆栈是进程的堆栈。如果get_ticks切换到sys_call执行的时候发生时钟中断,因为k_reenter作为限制,所以不能执行restart,而是执行restart_reenter,注意此时压入的寄存器参数放在内核栈,没有发生特权级转换,iretd后还是接着sys_call执行,直到此段代码执行结束。

       系统调用就是采用中断的方式来切换特权级,ring1-->ring0,由ring0得到结果返回ring1。

       进程调度就是不断修改进程表堆栈的esp,然后Pop,并切换到进程开始执行。ring1-->ring0,ring0-->ring1。

       进程就是代码。

       进程表就是操作系统中所说的PCD。

       这里的进程只有运行和不运行两种状态。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Orange's 进程 的相关文章

  • InvokeHelper函数的用法

    ActiveX控件的方法和属性操作与生成的C 43 43 类成员函数相关联都是通过InvokeHelper函数的调用来完成的 xff0c InvokeHelper函数的第一个参数是由Component Gallery xff08 控件提供者
  • 前向声明! struct netif; —— 只声明,无具体内部细节

    今天在看到 Linux阅码场 的 宋宝华 xff1a Linux内核编程广泛使用的前向声明 Forward Declaration xff0c 非常感谢 xff01 前向声明 编程定律 先强调一点 xff1a 在一切可能的场景 xff0c
  • MCU初始化流程——从上电到main()之间

    说明 xff1a 以下介绍示例的MCU地址空间如下 xff1a ROM空间为 xff1a 0x0000 0000 0x0000 8000 RAM空间为 xff1a 0x2000 0000 0x2000 2000 堆栈 SP 生长方向为 递减
  • FreeRTOS 启动第一个任务 prvStartFirstTask vPortSVCHandler

    asm void prvStartFirstTask void asm void prvStartFirstTask void PRESERVE8 Use the NVIC offset register to locate the sta
  • 组播知识 - IGMP

    https zhuanlan zhihu com p 258619129 组播初识 一 为什么要启用组播 xff1f 1 节省不必要的数据发送 2 需要发送相同的数据去往多个不同的接收者 3 减少带宽的占用 4 优化网络设备的处理进程 5
  • copy_from_user函数详细分析

    copy from user函数的目的是从用户空间拷贝数据到内核空间 xff0c 失败返回没有被拷贝的字节数 xff0c 成功返回0 这么简单的一个函数却含盖了许多关于内核方面的知识 比如内核关于异常出错的处理 从用户空间拷贝数据到内核中时
  • linux驱动中的宏 _IOC_NR, _IOC_TYPE, _IOC_SIZE, _IOC_DIR

    转载自 xff1a http blog csdn net u010245383 article details 29391805 虽然排版都点点乱 xff0c 但是内容还是较全面的 在驱动程序里 xff0c ioctl 函数上传送的变量 c
  • 【转载】更进一步的了解Keil Flash的下载算法

    转载自 xff1a https jingyan baidu com article 414eccf64f03be6b431f0af8 html 前面提到了通用算法的选择 xff0c 那么问题来了 xff0c 这个算法文件如何来的呢 xff1
  • 自己动手写操作系统-经典书籍

    汇编语言 xff0c 王爽编写 王爽老师这本书 xff0c 绝对是经典中的经典 xff0c 比其他介绍汇编语言的书强很多 这本书以例子贯穿整本书 不像其他书罗列一堆指令 这本书只介绍了常用指令 xff0c 而且每个指令都有例子 xff0c
  • golang 闭包 函数作为参数和返回值

    一 函数闭包 package main import 34 fmt 34 func adder func int int 函数作为返回值 sum 61 0 自由变量 xff0c 每次调用都保留上次的结果 return func v int
  • go routine channel select

    一 go routine channel package main import 34 fmt 34 34 time 34 func worker id int c chan int for n 61 range c 读取channel f

随机推荐

  • 我的vimrc配置文件

    34 vundle begin set nocompatible 34 与vi不一致 filetype off filetype plugin on 34 检测插件 set rtp 43 61 vim bundle vundle 34 载入
  • extern C 透彻理解

    一 背景 一直以来对extern C的理解都停留在表面 xff0c 只知道为了C C 43 43 混合编程 今天来透彻理解下这个概念 二 整体的项目结构 jni Android mk LOCAL PATH 61 call my dir in
  • 从ndk编译,说到so文件结构以及ida导入、导出函数

    一 背景 一直以来对ndk的编译链接所依赖的文件没有完成弄明白 xff0c 还有ida的导入 导出函数与dynsym section之间的关系是什么 xff1f 二 ndk编译所依赖的文件 1 我们一般在Application mk中指定所
  • C++ 布尔值用法

    一 整体代码 01 cpp include lt iostream gt include lt stdio h gt using namespace std int main void bool b 61 100 bool c 61 fal
  • UML 类图关系(继承,实现,依赖,关联,聚合,组合)

    1 继承 xff08 is a xff09 指的是一个类 xff08 称为子类 子接口 xff09 继承另外的一个类 xff08 称为父类 父接口 xff09 的功能 xff0c 并可以增加它自己的新功能的能力 xff0c 继承是类与类或者
  • Linux内核源代码情景分析-内存管理之slab-分配与释放

    首先说缓存区的数据结构 xff1a struct kmem cache s 1 each alloc amp free full partial first then free struct list head slabs 指向所有的sla
  • Android中的权限管理(基于Permission ProtectionLevel)

    1 什么是protectionlevel呢 xff1f 我们经常在AndroidManifest中使用权限 xff0c 如果我们想让应用程序可以发短信 xff0c 那么应该这样写 xff1a lt uses permission andro
  • Android native反调试方式及使用IDA绕过反调试

    0x00 为了避免我们的so文件被动态分析 xff0c 我们通常在so中加入一些反调试代码 xff0c 常见的Android native反调试方法有以下几种 1 直接调用ptrace PTRACE TRACEME 0 0 0 xff0c
  • Android SO 加壳(加密)与脱壳思路

    0x01 常见的Android SO加壳 加密 思路 1 1 破坏Elf Header 将Elf32 Ehdr 中的e shoff e shnum e shstrndx e shentsize字段处理 xff0c 变为无效值 由于在链接过程
  • Android NDK中C++ STL库动态和静态链接

    0x00 本文参考 本文参考Android NDK中C 43 43 运行时库介绍 我们在开发NDK的时候 xff0c 经常需要使用C 43 43 STL库开发 xff0c 那么这些库是如何和我们的程序链接的呢 xff1f 0x01 C 43
  • 80386保护模式--GDT,LDT,TSS,调用门,特权级转移,附pmtest5代码详解

    教材选择一个操作系统的实现 xff0c 作者于渊 xff0c 看此书前最好了有汇编语言 xff0c 保护模式下的汇编 xff08 参考清华杨季文的80X86汇编语言程序设计教程 xff09 xff0c C语言 xff0c 计算机组成原理 x
  • vim学习资源

    http www vimer cn http coolshell cn http vimcdoc sourceforge net doc quickfix html 就这两个资源用好了 xff0c 就足够了
  • 80386保护模式--描述符,附pm.inc代码详解

    描述符包括 xff0c 存储段描述符 xff08 代码段 xff0c 数据段 xff0c 堆栈段 xff09 xff0c 系统描述符 xff08 任务状态段TSS xff0c 局部描述符表LDT xff09 xff0c 门描述符 xff08
  • 80386保护模式--分页机制,附pmtest8代码详解

    一 分段机制 逻辑地址 分段机制 线性地址 分页机制 物理地址 xff0c 分页机制示意图如图1 页目录表中的每一项叫页目录项 xff1b 页表中的每一项叫页表项 图 1 页映射表结构 页目录表PDE xff0c 及页表PTE如图2
  • 80386保护模式--中断机制,附pmtest9代码详解

    一 80386 xff0c 内存 xff0c 8259A的连接如图1 图 1 二 编程8259A中断控制器 xff08 将ICW写入特定的寄存器 xff09 8259A是可编程中断控制器 xff0c 对它的设置并不复杂 xff0c 是通过向
  • FAT12文件系统

    一 FAT12软盘格式 软盘格式如图1 xff1a 每个扇区是512字节 xff0c 512B 2880 61 1 44MB 图 1 软盘 xff08 1 44MB xff0c FAT12 xff09 1 引导扇区 占512字节 xff0c
  • X86/Win32函数调用规范研究

    一 函数调用总体框图如下 xff1a 二 C语言函数如下 xff1a int sum int x int y int s s 61 x 43 y return s int foo void int m 61 2 int n 61 3 int
  • ELF文件结构

    一 ELF文件结构如下图 xff1a 之所以要用ELF文件格式 xff0c 是因为这样可以用C语言和汇编语言混合写内核代码 二 ELF header及Program header详细介绍 nasm f elf o kernel o kern
  • int 13H int 10H int 15H

    一 int 13h中断 对于1 44MB的软盘来讲 xff0c 总共有两面 xff08 磁头号0和1 xff09 xff0c 每面有80个柱面 xff08 0 79 xff09 xff0c 每个柱面有18个扇区 软盘的容量的由来 xff1a
  • Orange's 进程

    解释一个操作系统的实现 chapter6 r中代码 程序流程如下 xff1a 1 把Loader中的GDT和esp挪到Kernel中 xff0c 初始化IDTPTR 2 初始化8259 xff0c 初始化IDT xff0c 初始化GDT中的