zoukankan      html  css  js  c++  java
  • linux系统中堆栈的使用方法

    第一遍看书时不明白,今天偶然又看到了这一点,顿时豁然开朗

    linux0.12系统中共用了四种堆栈

    1. 系统引导初始化时临时使用的堆栈,此时我的理解是系统还在实模式

    2. 进入保护模式之后提供内核程序初始化使用的堆栈,位于内核代码地址空间固定位置处,该堆栈也是后来任务0的用户态堆栈,个人理解任务0比较特殊,它的内核态堆栈还是用户

    态堆栈都在内核中。

    3. 每个任务通过系统调用,执行内核程序时使用的堆栈,我们称之为任务的内核态堆栈,每个人物都有自己的内核态堆栈,内核态堆栈是和任务数据结构一起定义

    4.任务在用户态执行的堆栈,位于任务逻辑地址空间的末端处。

    以前有一段时间还怀疑过linux0.12中内核态堆栈和内核堆栈是不是一个东西,现在我可以很自信的说,这两个是一个东西。

    下面说下任务的堆栈,说的都是在linux0.12中的情况

    每个任务(除了任务0和任务1)有自己的64M地址空间,当一个任务刚被创建时,它的用户态堆栈指针被设置在起地址空间的靠近末端(64M顶端)部分。实际上末端部分还要包括执

    行程序的参数和环境变量,然后才是用户的堆栈空间。说到这里的参数和环境变量联想《自己动手写操作系统》和《程序员的自我修养》c语言mian函数的执行可看出,main函数

    再被调用钱,堆栈上已经压入了main函数的参数。P181

    每个任务的内核态堆栈的初始化为

    p->tss.esp0=PAGE_SIZE+(long)p;

    p->tss.ss0=0x10;

    可见每个任务(任务0和任务1除外)的内核态堆栈是都是用的同一块地址空间,所以应该不支持内核级的中断。

  • 相关阅读:
    软件工程——团队作业个人总结
    软件工程——团队作业4
    软件工程——团队答辩
    JavaScript编码规范
    html编码规范
    软件工程——团队作业三
    软件工程——团队作业二
    ·软件工程——团队作业1
    软件工程第二次作业——心得体会(结对编程)
    软件工程第二次作业(结对编程)
  • 原文地址:https://www.cnblogs.com/cdwodm/p/2923394.html
Copyright © 2011-2022 走看看