[Rx86OS-XIX] 应用程序和系统调用
阅读书籍:《30天自制操作系统》—川合秀实[2015.04.22-24]
在没有利用x86架构CPU保护情况下,应用程序可以操作任何一个地址的内存(段号:偏移地址)。
1 执行一个跟操作系统同载体保存的汇编应用程序
Figure1. 汇编应用程序和操作系统程序
“书”中的汇编应用程序与操作系统程序在同一个载体之上。
Figure2. 汇编程序的执行
汇编应用程序是一个文件。操作系统程序本身并不知道应用程序文件的任何信息(操作系统程序由很多个C文件和汇编文件组成,这些文件中的函数由链接器让它们发生关联)。磁盘的“文件信息区域”和“FAT”记录了被载入磁盘保存的应用文件信息。磁盘内容被载入内存后,“文件信息区域”和“FAT”就被载入到了相应的内存块中。操作系统程序能够根据在内存中的“文件信息区域”和“FAT”将应用程序内容载入到指定的内存中,再完成应用程序的GDT注册之类的操作。最后,操作系统程序根据应用程序在GDT中的信息使用跳转指令去执行它。
2 在汇编程序中调用操作系统的函数
在应用程序中调用操作系统的函数就是“系统调用”功能。“系统调用”是操作系统程序的一部分。系统调用将操作系统的函数给应用程序调用,编写操作系统的时候要区分应用程序和操作系统程序运行的内存空间。
2.1 通路
操作系统将汇编程序载入另一块内存到执行这个过程中,汇编应用程序的信息(GDT编号等)都被操作系统程序所知。汇编应用程序对操作系统程序却是一无所知。如果想在汇编程序中实现系统调用,汇编程序需要知道它在操作系统中所调用的函数的地址,还要想办法将参数传递给所调用的函数。
“x86实模式到保护模式转变的程序”会将操作系统程序注册到GDT中,编写操作系统的人知道操作系统程序的段地址。这也就得到了操作系统程序中各个函数的段地址。把操作系统程序载入内存中时采取的是连续载入的方式,所以,操作系统程序的各个函数在可执行文件中的偏移地址跟其在段首地址中的偏移地址是一样的。函数在操作系统可执行文件中的偏移地址可以通过查看二进制文件的工具查看(“书”中的编译器将此信息输出到文件中)。这就解决了操作系统函数的地址问题。
存在于操作系统程序中的函数有汇编函数,也有C语言函数。要将传递给操作系统程序的函数的参数压入到所调用函数的栈中(当前应用程序为汇编程序)。为了实现这个功能,“书”往操作系统程序中添加了一个汇编函数。因为这个汇编函数在操作系统程序中,能够很方便的知道操作系统的函数的信息,所以由这个汇编程序来完成对所要调用的操作系统的函数传递参数,然后再调用这个操作系统函数。只要我们在编译器的输出文件中查到这个汇编函数在整个文件中的偏移地址,在汇编应用程序中使用callfar指令来调用这个汇编函数即可。
Figure3. 系统调用基本原理
2.2 提升
“书”中说CPU规格说明书中有明确的记载:CPU用于通知异常状态的中断最多只有32种,IRQ只有0~ 15。IDT中最多可以设置256个函数,说明还会剩下很多未使用的项。
按照2.1中实现系统调用的方式,操作系统程序的代码只要稍加改变(如升级)call_sys_call_x_offset这个值就会(不变可能性太小)发生改变。这就使得每改一变操作系统的代码就要求用户相应地改变一次应用程序。为了避免这个问题,选择将操作系统中调用系统函数的汇编程序注册到IDT中,然后在汇编应用程序中换用INT指令调用操作系统的汇编程序。这样,不管操作系统程序怎么更改,用户程序都不必跟着改。
Figure4. 系统调用
采取将帮助应用程序调用系统函数的汇编函数注册到IDT再用INT指令调用的方式,不管操作系统代码怎么发生改变,随之发生改变的是注册到IDT的信息。应用程序就不必跟着改变了。
3 C语言应用程序
CPU用代码段和数据段(2者在GDT中注册)来管理程序的内存。
[1] 每个链接器都有组织C应用程序的可执行文件的方式。操作系统程序在调用C应用程序时需要解读链接器加在可执行文件中的信息,如“C代码入口地址”、“数据段(含栈)地址及大小(链接器根据应用程序得出应用程序数据段的大小并记录在可执行文件中的某位置,操作系统程序根据这个位置的数据为应用程序分配数据段内存空间。)”、“可运行在本操作系统上可执行程序的标识”等。(p-466)
[2] 操作系统提供的给应用程序的函数被操作系统注册到了IDT中(避免操作系统程序版本変更后应用程序跟着改变)。IDT中注册函数只能够用INT指令调用,C语言中无与汇编指令INT对应的语句。C应用程序调用操作系统的函数时,首先需要编写一个使用INT指令调用操作系统函数的函数,C程序通过调用这个汇编函数达到调用操作系统函数的目的。
总结
区分应用程序和操作系统程序。
在这里没有区分应用程序栈和操作系统程序栈。
编写汇编函数的时候注意使用PUSH/POP指令备份所有的寄存器的值。尤其是在汇编函数中调用C语言程序时,C语言程序有可能改变某个寄存器的值。
比较复杂背景下的改变一般都不是独立存在的。如IDT需要和INT指令、IDT、GDT等搭配,GDT需要和GDTR、段寄存器等搭配。
CALL (FAR)的真实参数是内存地址(段地址:偏移地址),不是要目的内存地址里面是一个函数才可以使用CALL指令,目的内存地址里有什么就让CPU去执行什么(非指令产生异常)。
[x86OS] Note Over.
[2015.04.29]
[Rx86OS-XIX] 应用程序和系统调用相关推荐
- 用户态程序调用系统态程序-快速系统调用
在调试程序中,经常发现程序最后会调用到系统态的程序.这个过程是怎样的?用户空间的程序怎样进行系统调用,在此过程中是怎样进入和退出内核的. 根据运行状态和执行代码所在的内存空间的不同,CPU既可以运行于 ...
- 【看表情包学Linux】冯诺依曼架构 | 理解操作系统 | 基于 Pintos 实现新的用户级程序的系统调用
- Java程序员需要掌握的计算机底层知识(二):操作系统、内核、用户态与内核态、系统调用的执行过程
操作系统 启动过程 通电 -> bios uefi 工作 -> 自检 -> 到硬盘固定位置加载bootloader -> 读取可配置信息 -> CMOS CMOS 用来存 ...
- haribote系统调用 工程管理及应用程序阅读注释
[ 1] haribote ipl09.nas 引导程序阅读注释. [ 2] haribote asmhead.nas 从实模式进入保护模式程序阅读注释. [ 3] haribote dsctbl.c ...
- 7个Debug linux程序的Strace 列子
Strace是一个能帮助你解决问题的debugging工具 Strace监控指定程序系统调用和信号,在你没有源代码又想dubug程序的执行时是会用到的.Strace会以程序的开始到结束来顺序执行的 你 ...
- MIPS中的异常处理和系统调用【转】
转自:http://blog.csdn.net/jasonchen_gbd/article/details/44044091 权声明:本文为博主原创文章,转载请附上原博链接. 异常入口 系统调用是用户 ...
- Linux系统调用的实现机制分析
[摘要]本文介绍了系统调用的一些实现细节.首先分析了系统调用的意义,它们与库函数和应用程序接口有怎样的关系.然后,我们考察了内核如何实现系统调用,以及执行系统调用的连锁反应:陷入内核,传递系统调用号和 ...
- Linux2.6 --系统调用处理程序
用户空间的程序无法直接执行内核代码.它们不能直接调用内核空间中的函数,因为内核驻留在受保护的地址空间上.如果进程可以直接在内核的地址空间上读写的话,系统的安全性和稳定性将不复存在. ...
- keil4怎么移植其他人的程序_裸机程序如何驱动硬件?
任何计算机系统都是软件和硬件的结合体,如果只有硬件而没有软件,则硬件是没有灵魂的躯壳:如果只有软件没有硬件,则软件就是一堆无用的字符.在底层硬件的基础上,操作系统覆盖一层驱动,屏蔽底层硬件的操作,通过 ...
最新文章
- 这个 MySQL bug 99% 的人会踩坑!
- 京东商品详情页碎碎念
- 加班其实不是真正的理由(Coders Life)
- Angular和SAP C4C的事件处理队列 1
- mysql decimal_MySQL系列之数据类型及约束
- POJ1067 HDU1527 取石子游戏
- 免费解析成pdf下载 -原创力文档
- java jsp 404错误页面模板_JSP页面404错,点击分页的按钮就报错
- 简单旅游景点HTML网页设计作品 DIV布局故宫介绍网页模板代码 DW家乡网站制作成品 web网页制作与实现
- 常用颜色的RGB值及中英文名称
- zotero文献管理器及其使用姿势(不定时更新)
- 【转帖】计算机编程语言
- 成都市住房公积金提取指南办理手续流程
- Android10有sdcard读写权限,仍无法读写sdcard中文件问题解决
- Markdown详细教程
- xshell中重启指令_远程服务器Xshell的使用 -- 重启服务器操作 和 linux的常用命令...
- sklearn使用入门
- uniapp提示用户开启定位,跳转到开启定位页面
- 表示自己从头开始的句子_一切从头开始唯美句子,致自己重新开始的句子
- Office2007 SP1/2补丁对应版本号
热门文章
- 三星手机如何分屏_三星安卓手机如何刷机 三星安卓手机刷机通用方法介绍【图文教程】...
- 天呐!Linus两周搞出个Git,快来看看咋用滴!
- 维多利亚旅行者 V6004 时尚休闲商务双肩包 黑色[价格 行情 报价] - 易迅网
- ISO/IEC13818-1 TS 格式
- VPP使用介绍(route、tun、memif、abf)
- ansible常用模块应用
- leetcode---阶乘尾数
- 笑话:​我是个程序员,一天我坐在路边一边喝水一边苦苦检查程序。这时一个乞丐在我边上坐下了,开始要饭,我觉得可怜,就给了他1块钱...
- 别说眼科医生不做近视激光手术,眼科医生做给你看
- 分享具体制作流程,利用下班时间听歌,昨天挣了400多