30天自制操作系统(27)
DAY27_LDT与库
1. 先来修复bug
bug:用nsct命令运行的应用程序,无论是按Shift+F1还是点击窗口的”x”按钮狗没有反应。task_run(task, -1, 0);
2. 应用程序运行时关闭命令行窗口
- 目标:在应用程序运行的时候无法关闭所对应的命令行窗口。
- 修改:1.让系统在按下”x”按钮的时候暂且将命令行窗口从画面上隐藏起来。(因为关闭命令行窗口会有延迟)
- 当FIFO接收到从console.c发送的“关闭窗口”请求数据时所进行的处理,主要是释放指定的图层。
3. 保护应用程序(1)
破坏程序:[FORMAT "WCOFF"]
[INSTRSET "i486p"]
[BITS 32]
[FILE "crack7.nas"]
GLOBAL _HariMain
[SECTION .text]
_HariMain:
MOV AX,1005*8
MOV DS,AX
CMP DWORD [DS:0x0004],'Hari'
JNE fin ; 不是应用程序,因此不执行任何操作
MOV ECX,[DS:0x0000] ; 读取该应用程序数据段的大小
MOV AX,2005*8
MOV DS,AX
crackloop: ; 整个用123填充
ADD ECX,-1
MOV BYTE [DS:ECX],123
CMP ECX,0
JNE crackloop
fin: ; 结束
MOV EDX,4
INT 0x40
4. 保护应用程序(2)
CPU为我们提供了解决方案,那就是LDT。
GDT: global descriptor table
LDT: local descriptor table
其中GDT中的段设置是供所有任务通用的,而LDT中的段设置只对某个应用程序有效。
5. 优化应用程序的大小
那么我们该怎么办呢?我们可以将这些函数做成不同的.obj文件,将_api_putchar等需要用到的函数和_api_openwin等不需要用到的函数分离开。
6. 库
如果像上一节那样,把函数拆分开来,并用连接器来进行连接的话,我们需要创建很多很多个.obj文件。当然,如果不拆分函数,而是做成一个大的.obj文件也可以(如同a_nask.obj),但这样的话应用程序没有引用的函数也会被包含进去,生成的应用程序文件就会像之前那样无端增大很多。
库:将很多个.obj文件打包成一个文件。
要创建一个库,我们首先需要.obj文件作为原材料,除此之外,我们还需要一个叫做库管理器的程序。GOLIB = $(TOOLPATH)golib00.exe
apilib.lib : Makefile $(OBJS_API)
$(GOLIB) $(OBJS_API) out:apilib.liba.bim : a.obj apilib.lib Makefile
$(OBJ2BIM) @$(RULEFILE) out:a.bim map:a.map a.obj apilib.lib
void api_putchar(int c); |
#include "apilib.h" |
7. 整理make环境
整理操作系统、库、应用程序的文件和代码。