发布于 

30天自制操作系统(27)

DAY27_LDT与库

1. 先来修复bug

bug:用nsct命令运行的应用程序,无论是按Shift+F1还是点击窗口的”x”按钮狗没有反应。

task_run(task, -1, 0);

2. 应用程序运行时关闭命令行窗口

  • 目标:在应用程序运行的时候无法关闭所对应的命令行窗口。
  • 修改:1.让系统在按下”x”按钮的时候暂且将命令行窗口从画面上隐藏起来。(因为关闭命令行窗口会有延迟)
    1. 当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.lib

a.bim : a.obj apilib.lib Makefile 
$(OBJ2BIM) @$(RULEFILE) out:a.bim map:a.map a.obj apilib.lib

void api_putchar(int c); 
void api_putstr0(char *s);
void api_putstr1(char *s, int l);
void api_end(void);
int api_openwin(char *buf, int xsiz, int ysiz, int col_inv, char *title);
void api_putstrwin(int win, int x, int y, int col, int len, char *str);
void api_boxfilwin(int win, int x0, int y0, int x1, int y1, int col);
void api_initmalloc(void);
char *api_malloc(int size);
void api_free(char *addr, int size);
void api_point(int win, int x, int y, int col);
void api_refreshwin(int win, int x0, int y0, int x1, int y1);
void api_linewin(int win, int x0, int y0, int x1, int y1, int col);
void api_closewin(int win);
int api_getkey(int mode);
int api_alloctimer(void);
void api_inittimer(int timer, int data);
void api_settimer(int timer, int time);
void api_freetimer(int timer);
void api_beep(int tone);
#include "apilib.h"

7. 整理make环境

整理操作系统、库、应用程序的文件和代码。