在我们的操作系统中,已经存在的3个进程是运行在ring1上的,它们已经不能任意地使用某些指令,不能访问某些权限更高的内存区域,但如果一项任务需要这些使用指令或者内存区域时,只能通过系统调用来实现,它是应用程序和操作系统之间的桥梁。

所以,一件事情就可能是应用程序做一部分,操作系统做一部分。这样,问题就又涉及特权级变换。

很明显,这已经难不倒我们了,因为进程的切换就是不停地在重复这么一个特权级变换的过程。在那里,触发变换的是外部中断,我们把这个诱因换一下就可以了,变成"int nnn",一切就都解决了。

我们来实现一个叫做int get_ticks()的函数,用这个函数来得到当前总共发生了多少次时钟中断。设置一个全局变量ticks,每发生一次时钟中断,它就加1,进程可以随时通过get_ticks()这个系统调用来得到这个值。

见syscall.asm:

_NR_get_ticks       equ 0 ; 要跟 global.c 中 sys_call_table 的定义相对应!
INT_VECTOR_SYS_CALL equ 0x90global  get_ticks ; 导出符号bits 32
[section .text]get_ticks:mov    eax, _NR_get_ticksint   INT_VECTOR_SYS_CALLret

这里将系统调用对应的中断号设为0x90,它只要不和原来的中断号重复即可。

马上来定义INT_VECTOR_SYS_CALL对应的中断门,protect.c:

PUBLIC void init_prot()
{
...init_idt_desc(INT_VECTOR_SYS_CALL,   DA_386IGate,sys_call,           PRIVILEGE_USER);
...
}

这样我们就将第INT_VECTOR_SYS_CALL号中断与sys_call对应起来了。这里的call [sys_call_table+eax*4](调用的是sys_call_table[eax]),与irq_table类似,sys_call_table是一个函数指针数组,每一个成员都指向一个函数,用以处理相应的系统调用。

extern  sys_call_tableglobal sys_callsys_call:call    savesticall    [sys_call_table + eax * 4]mov     [esi + EAXREG - P_STACKBASE], eaxcliret

前面eax已被赋值为_NR_get_ticks(即0),而sys_call_table[0]已经初始化为sys_get_ticks,所以call [sys_call_table+eax*4]这一句调用的便是sys_get_ticks。

mov [esi+EAXREG-P_STACKBASE],eax是把函数sys_call_table[eax]的返回值放在进程表中eax的位置,以便进程P被恢复执行时eax中装的是正确的返回值。

现在可以在进程中添加调用get_ticks的代码了:

void TestA()
{int i = 0;while (1) {get_ticks();disp_str("A");disp_int(i++);disp_str(".");delay(1);}
}

别忘了在kernel.asm和syscall.asm中导入和导出相应符号。

修改

void TestA()
{int i = 0;while (1) {disp_str("A");disp_int(get_ticks());disp_str(".");delay(1);}
}

运行如下,第一个是A0x0,第二个是A0x27,两次之间的“#”恰好是39个,我们的get_ticks一切正常:

源码

转载于:https://www.cnblogs.com/joey-hua/p/5487034.html

操作系统开发系列—13.g.操作系统的系统调用 ●相关推荐

  1. 操作系统开发系列—13.i.进程调度 ●

    上面的三个进程都是延迟相同的时间,让我们修改一下,尝试让它们延迟不同的时间. void TestA() {int i = 0;while (1) {disp_str("A.");m ...

  2. 微信公众号开发系列-13、基于RDIFramework.NET框架整合微信开发应用效果展示

    微信公众号开发系列-13.基于RDIFramework.NET框架整合微信开发应用效果展示 1.前言 通过前面一系列文章的学习,我们对微信公众号开发已经有了一个比较深入和全面的了解. 微信公众号开发为 ...

  3. 操作系统开发系列—2.进入32位保护模式

    源码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 3 ...

  4. EOS智能合约开发系列(13): 多签合约代码分析(二)

    知识星球地址:https://t.zsxq.com/2zBaE6u 欢迎访问知识星球,并留言探讨.

  5. 漏刻有时API接口实战开发系列(13):小鹅通云服务PHP-API二维数组传参解决方案

    在使用小鹅通云服务API开发过程中,当传递二维数组时,后台总是提示The user id list must be an array.即传递的参数必须是数组. 文档请求标准格式 {"acce ...

  6. 微信公众号开发系列-玩转微信开发-目录汇总

    引言 最遗憾的不是把理想丢在路上,而是理想从未上路. 每一个将想法变成现实的人,都值得称赞和学习.致正在奔跑的您! 在现在这个无处不在的互联网背景下,各种应用已不再仅仅局限于网页或桌面应用了,IOS. ...

  7. 服务器开发系列(三)——Linux与Windows操作系统基础功能对比

    系列文章目录 服务器开发系列(一)--计算机硬件 服务器开发系列(二)--Jetson Xavier NX 文章目录 系列文章目录 前言 一.操作系统概述 二.Linux和Windows的应用场景 三 ...

  8. Threejs系列--13游戏开发--沙漠赛车游戏【使用效果合成器添加高级效果】

    Threejs系列--13游戏开发--沙漠赛车游戏[使用效果合成器添加高级效果] 序言 目录结构 代码一览 Blur.js代码 Glows.js代码 Application.js代码 代码解读 运行结 ...

  9. 《Orange’s 一个操作系统的实现》1.搭建操作系统开发环境

    书中给出了两种环境:windows和linux,平台选择根据自己喜好.本人这里选择ubuntu10.04+virtualbox作为开发平台. 1.下载.安装VirtualBox     http:// ...

最新文章

  1. 非对称加密算法RSA加密传输数据python3源代码实现
  2. java生成world文件_HelloWorld.java文件如何创建?
  3. python调用shell脚本
  4. newtonsoft 数组反序列化_漏洞学习篇之反序列化
  5. spring boot (二) web swagger2
  6. Android使用Http访问网络
  7. 构建路径_深度学习的幸福课堂构建从评价细则中找“路径”——基于深度学习的幸福课堂构建实践研究...
  8. 从实践应用中催生课题,通过课题研究促进应用
  9. JavaScript的一些简单代码
  10. Windows/Windows Server 控制面板(Control Panel) 打开方式 通用
  11. mysql 解压版 64位_Windows解压版安装64位mysql-5.7.19
  12. 8款网页瀑布流布局插件(很不错的效果)
  13. stc12c5a60s 超声波HC-SR04测距
  14. 经典软文是如何写作和推广的
  15. excel表格如何把含有数字的单元格筛选出来?
  16. Virtual Reality 那些事
  17. 华为[ENSP]常用清除配置命令及保存命令
  18. 双色球笔记3--输出所有中奖号码
  19. 116 · 跳跃游戏 Jump Game
  20. mysql慢查询日志默认在哪里_MySQL 慢查询日志

热门文章

  1. iOS Hacker Xcode玩转arm64汇编基础
  2. strtok函数取WinMain的参数
  3. javaweb使用 数据库连接池 DBCP,实现对数据库驱动使用优化,多个 action共用一个数据库连接
  4. Matlab C++混合编程 在VisualStudio下的编程 使用了Opencv库
  5. 内存区域的划分和分配
  6. SQL数据库对象的删除
  7. 关于fragment backState的原理
  8. 数据仓库之 ETL漫谈
  9. Oracle -jdbc-java 的类型映射
  10. 国际掉期与衍生工具协会(ISDA)