操作系统开发系列—13.g.操作系统的系统调用 ●
在我们的操作系统中,已经存在的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.操作系统的系统调用 ●相关推荐
- 操作系统开发系列—13.i.进程调度 ●
上面的三个进程都是延迟相同的时间,让我们修改一下,尝试让它们延迟不同的时间. void TestA() {int i = 0;while (1) {disp_str("A.");m ...
- 微信公众号开发系列-13、基于RDIFramework.NET框架整合微信开发应用效果展示
微信公众号开发系列-13.基于RDIFramework.NET框架整合微信开发应用效果展示 1.前言 通过前面一系列文章的学习,我们对微信公众号开发已经有了一个比较深入和全面的了解. 微信公众号开发为 ...
- 操作系统开发系列—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 ...
- EOS智能合约开发系列(13): 多签合约代码分析(二)
知识星球地址:https://t.zsxq.com/2zBaE6u 欢迎访问知识星球,并留言探讨.
- 漏刻有时API接口实战开发系列(13):小鹅通云服务PHP-API二维数组传参解决方案
在使用小鹅通云服务API开发过程中,当传递二维数组时,后台总是提示The user id list must be an array.即传递的参数必须是数组. 文档请求标准格式 {"acce ...
- 微信公众号开发系列-玩转微信开发-目录汇总
引言 最遗憾的不是把理想丢在路上,而是理想从未上路. 每一个将想法变成现实的人,都值得称赞和学习.致正在奔跑的您! 在现在这个无处不在的互联网背景下,各种应用已不再仅仅局限于网页或桌面应用了,IOS. ...
- 服务器开发系列(三)——Linux与Windows操作系统基础功能对比
系列文章目录 服务器开发系列(一)--计算机硬件 服务器开发系列(二)--Jetson Xavier NX 文章目录 系列文章目录 前言 一.操作系统概述 二.Linux和Windows的应用场景 三 ...
- Threejs系列--13游戏开发--沙漠赛车游戏【使用效果合成器添加高级效果】
Threejs系列--13游戏开发--沙漠赛车游戏[使用效果合成器添加高级效果] 序言 目录结构 代码一览 Blur.js代码 Glows.js代码 Application.js代码 代码解读 运行结 ...
- 《Orange’s 一个操作系统的实现》1.搭建操作系统开发环境
书中给出了两种环境:windows和linux,平台选择根据自己喜好.本人这里选择ubuntu10.04+virtualbox作为开发平台. 1.下载.安装VirtualBox http:// ...
最新文章
- 非对称加密算法RSA加密传输数据python3源代码实现
- java生成world文件_HelloWorld.java文件如何创建?
- python调用shell脚本
- newtonsoft 数组反序列化_漏洞学习篇之反序列化
- spring boot (二) web swagger2
- Android使用Http访问网络
- 构建路径_深度学习的幸福课堂构建从评价细则中找“路径”——基于深度学习的幸福课堂构建实践研究...
- 从实践应用中催生课题,通过课题研究促进应用
- JavaScript的一些简单代码
- Windows/Windows Server 控制面板(Control Panel) 打开方式 通用
- mysql 解压版 64位_Windows解压版安装64位mysql-5.7.19
- 8款网页瀑布流布局插件(很不错的效果)
- stc12c5a60s 超声波HC-SR04测距
- 经典软文是如何写作和推广的
- excel表格如何把含有数字的单元格筛选出来?
- Virtual Reality 那些事
- 华为[ENSP]常用清除配置命令及保存命令
- 双色球笔记3--输出所有中奖号码
- 116 · 跳跃游戏 Jump Game
- mysql慢查询日志默认在哪里_MySQL 慢查询日志