用户态到内核态切换相对比较简单。用户态切换到内核态时,需要切换堆栈,堆栈地址在当前task的tss段中,因此需要先建立好一个task,并为内核态的ss和esp赋好值。
仍然使用中断切换到内核态,中断处理函数中,首先将保存在新堆栈中的老堆栈的esp取出来,然后在老堆栈的esp指针指向位置之上建立一个trapframe(不包括ss和esp值),然后将新堆栈中的这一堆内容拷贝过来,然后给tf赋值为新堆栈的trapframe的地址,之后直接返回到trap_asm就ok了。
在使用过程中,发现切换不了。使用gdb跟踪发现,不断发生通用保护异常13,才发现idt中为用户态切换到内核态而建的中断的中断描述符的dpl仍然为0,没有改成3,导致执行该中断时不断发生通用保护异常。将该中断描述符的dpl设置为DPL_USER(3)后,切换正常:
struct trapframe *newtf = (struct trapframe*)(tf->esp - sizeof(struct trapframe) + 8);
memmove(newtf, tf, sizeof(struct trapframe)-8);
// newtf has no ss
// newtf->ss = SS_KDATA;
newtf->cs = SS_KTEXT;
newtf->ds = SS_KDATA;
newtf->es = SS_KDATA;
newtf->fs = SS_KDATA;
newtf->gs = SS_KDATA;
tf = newtf;
建立中断描述符表的代码改一下:
int i;
for (i=0; i<256; i++)
setintrgate(&idt[i], SS_KTEXT, vectors[i], DPL_KERNEL);
setintrgate(&idt[TRAPNO_U2K], SS_KTEXT, vectors[TRAPNO_U2K], DPL_USER);
分享到:
相关推荐
hive 开发UDF 使用maven工程 引发jar包缺失 hive 开发UDF 使用maven工程 引发jar包缺失
Root project 'Almost-Famous' +--- Project ':famous-cloud' +--- Project ':famous-config' \--- Project ':famous-unique' +--- Project ':famous-common' +--- Project ':famous-login' +--- Project ':famous-...
Group : Development/Libraries Source RPM : ncurses-5.7-2.20090207.fc11.src.rpm Size : 1.71 MB Packager : Fedora Project Summary : Development files for the ncurses library Description : The ...
gEDA homepage: http://www.geda-project.org -----gschem.exe 1.9.2 (g9e1f72c) -----pcb.exe Compile Time Options ----- GUI: gtk : Gtk - The Gimp Toolkit Exporters: bom : Exports a Bill of Materials ...
在"Pintos-project2"中,我们将深入探讨如何在Pintos内核中实现对用户程序的支持,包括加载可执行文件、系统调用处理机制以及进程间通信(IPC)。这个过程涉及到多个关键的计算机系统概念,如内存管理、中断处理和...
2006-03-11 15:26 122,880 关键路径分析.mpp 2005-10-06 00:21 339,456 固定资产信息系统项目.mpp 2005-11-17 16:56 622,592 固定资产信息系统项目.多比较基准.mpp 2005-11-17 16:56 637,440 固定资产信息系统项目....
JavaScript滑块是一种常见的网页...总之,"javascript-project-slider"项目是一个涉及HTML、CSS和JavaScript的综合实践,涵盖了网页动态效果的实现、用户交互处理等多个方面,对于提升前端开发技能具有很好的学习价值。
llvm-project-18.1.8.src 官方离线下载包 # 下载 llvm-project wget -nc https://github.com/llvm/llvm-project/releases/download/llvmorg-18.1.8/llvm-project-18.1.8.src.tar.xz # 解压 llvm-project-18.1.8.src...
4. **开源软件**:"ncpi-project-forge-master" 提示这是一个开源项目,意味着源代码对公众开放,允许用户自定义、扩展和贡献代码,以满足特定需求。 5. **版本控制**:“master”分支是版本控制系统中的一个概念,...
来自emule-project的原版emule,里面没有关键字过滤,可以自由的下载一切资源,不可多得啊~
在这个项目中,"fireworx-streamline-project-master"可能包含源代码、配置文件和其他相关资源,以改善MATLAB的默认设置,提供更加智能化的代码提示功能。 MATLAB的快捷键通常分为两类:基本编辑器快捷键和特定功能...
431-Project1:RIT CSCI 431
composer create-project drupal-composer/drupal-project:9.x-dev some-dir --no-interaction 使用composer require ...您可以将新的依赖项下载到您的安装中。 cd some-dir composer require drupal/devel ...
WebUml-ProjectManager WebUml项目管理器后端。 职责: 用于元模型和表示模型元素的CRUD 要求: GIT 1.9( ) Java 8( ) Maven 3.0.5( ) heroku-toolbelt 3.6.0( ) MongoDB的 推荐工具: jq( ) 在...
team-project-team2:由GitHub Classroom创建的team-project-team2
此外,在注释部分还提到了其他一些权限,例如用户管理和项目管理等,但这些内容并未在枚举类中具体实现。 通过以上解析,我们可以看出这是一个用于定义用户角色及其对应权限的枚举类,涵盖了从项目层面到数据层面再...
Lesson 2 - Basic principles of learning a programming language UNIT 1 - VARIABLES, TYPES, EXPRESSIONS, AND STATEMENTS Lesson 3 - Introducing Python: a programming language Lesson 4 - Variables and ...
4. **文档**:项目指南、算法描述、用户手册等,帮助理解项目目标和实现方法。 5. **示例运行**:可能有演示游戏运行的示例文件,展示不同搜索算法在实际游戏中的表现。 6. **评估脚本**:用于自动评估代码性能的...
BTS-D2D-Project-MatLab:MWSN中基于能耗的路由协议之间的比较 作者:RubénDiab 目标项目: 移动无线传感器网络(MWSN)中基于能耗的路由协议之间的比较 已实现的路由协议: 直接沟通 浸出 飞马座 梦 实施的渠道和...
midterm-project-aagamsh1:GitHub Classroom创建的midterm-project-aagamsh1