发布于 

30天自制操作系统(21)

DAY21_保护操作系统

1.攻克难题——字符串显示API

  • 我们需要在API中做个改动,使其能够将应用程序传递的地址解释为代码段内地址。

2.用C语言编写应用程序

要实现C语言编写应用程序,需要在应用程序方面创建一个api_putchar函数。注意,这个函数不是创建在操作系统中。api_putchar函数需要用C语言来调用,功能是向EDX和AL赋值,并调用INT 0x40。

[FORMAT "WCOFF"] ; 生成对象文件的模式
[INSTRSET "i486p"] ; 表示使用486兼容指令集
[BITS 32] ; 生成32位模式机器语言
[FILE "a_nask.nas"] ; 源文件名信息

GLOBAL _api_putchar

[SECTION .text]
_api_putchar: ; void api_putchar(int c);
MOV EDX,1
MOV AL,[ESP+4] ; c
INT 0x40
RET

这里的api_putchar需要与a.c的编译结果进行连接,因此我们使用对象文件模式

3.保护操作系统(1)

操作系统需要运行各种应用程序,而这些应用程序有可能是操作系统开发者编写的,也有可能是用户、别的软件开发商或者是某个自由软件作者出于善意编写的。
所谓对操作系统的破坏,严重程度也不同,比如擅自删除重要文件、使其他任务的运行产生异常,或者造成操作系统死机而不得不重新启动等等。

4.保护操作系统(2)

我们需要为应用程序提供专用的内存空间,并且禁止别的应用程序访问。
要做到这一点,我们可以创建应用程序专用的数据段,并在应用程序运行期间,将DS和SS指向该段地址。
这次我们还使用了以句点(.)开头的标签名,这是一种被称为本地标签的特殊标签。它基本上和普通的标签功能一样,区别在于即使标签名和其他函数中的标签重复,系统也能将它们区分开来。

5.对异常的支持

接下来我们要实现强制结束程序的功能。
要想强制结束程序,只要在中断号0x0d中注册一个函数即可。
这是因为在x86架构规范中,当应用程序试图破坏操作系统,或者试图违背操作系统的设置时,就会自动产生0x0d中断,因此该中断也被称为“异常”。

6.保护操作系统(3)

可能出现的问题:操作系统会指定应用程序的DS,因此破坏行为会发生异常,那么如果忽略操作系统指定的DS,而是用汇编语言直接将操作系统用的段地址存入DS的话,就又可以干坏事了。

7.保护操作系统(4)

  • 想法:让应用程序无法使用操作系统的段地址。
  • 具体做法:x86架构有这样的功能。
    在段定义的地方,如果将访问权限加上0x60的话,就可以将段设置为应用程序用。
    当CS中的段地址为应用程序用段地址时,CPU会认为“当前正在运行应用程序”,这时如果存入操作系统用的段地址就会产生异常。

在启动应用程序的时候我们需要让“操作系统向应用程序的段执行far-CALL”
解决方案:可以使用RETF