30天自制操作系统(第27天)

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

需要实现的功能: 在应用程序运行的时候,可以关闭所对应的命令行窗口。思路:1.先调整bootpack.c中按下"x"按钮时,暂时将窗口隐藏起来,并当fifo接收从console.c发送的关闭窗口请求数据时释放指定的图层。2.由于cons.sht在命令行关闭后会置0,所以将console_task函数中的变量sheet 部分改用变量 cons.sht代替。3.如果FIFO中接收到4这个数据,则表示收到了关闭命令行窗
口的信号,此时取消定时器,并发出清理图层的消息,然后将 cons->sht 置为 0。
/*                    bootpack.c                    */
if(sht->bxsize-21 <= x && x < sht->bxsize-5 && 5<= y && y < 19){//点击"x"关闭窗口if((sht->flags & 0x10) != 0){/*该窗口不是应用程序窗口*/task = sht->task;cons_putstr0(task->cons, "\nBreak(mouse) :\n");io_cli();task->tss.eax = (int)&(task->tss.esp0);task->tss.eip = (int) asm_end_app;io_sti();}else{//是命令行窗口task = sht->task;sheet_updown(sht, -1);/*从这里开始*/keywin_off(key_win);key_win = shtctl->sheets[shtctl->top - 1];keywin_on(key_win);/*到这里结束*/io_cli();fifo32_put(&task->fifo, 4);io_sti();}task_run(task, -1, 0);/*为了确实执行结束处理,如果处于休眠状态则唤醒*/
}
(中略)
}else if(2024 <= i && i <= 2279){/*只关闭命令行窗口*/sht2 = shtctl->sheets0+(i-2024);memman_free_4k(memman, (int)sht2->buf, 256*165);sheet_free(sht2);
}/*                    console.c                    */
int *hrb_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax)
{(中略)struct FIFO32 *sys_fifo = (struct FIFO32 *) *((int *) 0x0fec); /*这里!*/(中略)} else if (edx == 15) {for (;;) {(中略)if (i == 4) { /*只关闭命令行窗口*/ /*从此开始*/timer_cancel(cons->timer);io_cli();fifo32_put(sys_fifo, cons->sht - shtctl->sheets0 + 2024); /*2024~2279*/cons->sht = 0;io_sti();} /*到此结束*/(中略)}} else if (edx == 16) {(中略)
}

27.2 保护应用程序

GDT 中的段设置是供所有任务通用的,而LDT中的段设置则只对某个应用程序有效。如果将应用程序段设置在LDT中,其他的任务由于无法使用该LDT,也就不用担心它们来搞破坏了。
/*                     bootpack.h                     */
(中略)
#define AR_CODE32_ER   0x409a
#define AR_LDT         0x0082 /*这里!*/
#define AR_TSS32       0x0089
#define AR_INTGATE32   0x008e
/* mtask.c */
(中略)
struct TASK {int sel, flags; /* sel代表GDT编号*/int level, priority;struct FIFO32 fifo;struct TSS32 tss;struct SEGMENT_DESCRIPTOR ldt[2]; /*这里!*/struct CONSOLE *cons;int ds_base, cons_stack;
};
/*                     mtask.c                     */
struct TASK *task_init(struct MEMMAN *memman){(中略)for (i = 0; i < MAX_TASKS; i++) {taskctl->tasks0[i].flags = 0;taskctl->tasks0[i].sel = (TASK_GDT0 + i) * 8;taskctl->tasks0[i].tss.ldtr = (TASK_GDT0 + MAX_TASKS + i) * 8; /*这里!*/set_segmdesc(gdt + TASK_GDT0 + i, 103, (int) &taskctl->tasks0[i].tss, AR_TSS32);set_segmdesc(gdt + TASK_GDT0 + MAX_TASKS + i, 15, (int) taskctl->tasks0[i].ldt, AR_LDT);/*这里!*/}(中略)
}struct TASK *task_alloc(void){(中略)for (i = 0; i < MAX_TASKS; i++) {if (taskctl->tasks0[i].flags == 0) {(中略)task->tss.fs = 0;task->tss.gs = 0;/*删掉原来的task->tss.ldtr = 0;*/task->tss.iomap = 0x40000000;task->tss.ss0 = 0;return task;}}return 0; /*已经全部正在使用*/
}int cmd_app(struct CONSOLE *cons, int *fat, char *cmdline){(中略)if (finfo !=s 0) {/*找到文件的情况*/(中略)if (finfo->size >= 36 && strncmp(p + 4, "Hari", 4) == 0 && *p == 0x00) {(中略)set_segmdesc(task->ldt + 0, finfo->size - 1, (int) p, AR_CODE32_ER + 0x60); /*这里!*/set_segmdesc(task->ldt + 1, segsiz - 1, (int) q, AR_DATA32_RW + 0x60); /*这里!*/for (i = 0; i < datsiz; i++) {q[esp + i] = p[dathrb + i];}start_app(0x1b, 0 * 8 + 4, esp, 1 * 8 + 4, &(task->tss.esp0)); /*这里!*/(中略)} else {cons_putstr0(cons, ".hrb file format error.\n");}(中略)}(中略)
}

27.3 优化应用程序的大小

思路:举例, 主要是因为创建 hello3.hrb 时所引用的 a_nask.nas变大了,包含了像 _api_openwin 和_api_linewin这些在这个应用程序中根本用不到的函数,所以将a_nask.nas中的函数都拆开,形成api001.nas~api020.nas。随后将Makefile文件中的a_nask.nas全部按照下述进行更换。
OBJS_API = api001.obj api002.obj (中略) api019.obj api020.obja.bim : a.obj $(OBJS_API) Makefile$(OBJ2BIM) @$(RULEFILE) out:a.bim map:a.map a.obj $(OBJS_API)

27.4 库

思路: 将很多个 .obj文件打包成一个文件。在 Makefile 中加上下面的代码:
GOLIB = $(TOOLPATH)golib00.exe
apilib.lib : Makefile $(OBJS_API)
$(GOLIB) $(OBJS_API) out:apilib.lib
顺便写一个apilib.h文件,就可以在应用程序开头的 API函数声明:#include "apilib.h"
/*                    apilib.h                    */
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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/723116.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【鸿蒙 HarmonyOS 4.0】多设备响应式布局

一、背景 在渲染页面时&#xff0c;需要根据不同屏幕大小渲染出不同的效果&#xff0c;动态的判断设备屏幕大小&#xff0c;便需要采用多设备响应式布局。这种设计方法能够动态适配各种屏幕大小&#xff0c;确保网站在不同设备上都能呈现出最佳的效果。 二、媒体查询&#xf…

第九篇:– 过程发现(Process Discovery)是如何赋能数字化市场营销全过程?- 我为什么要翻译介绍美国人工智能科技巨头IAB公司

IAB平台&#xff0c;使命和功能 IAB成立于1996年&#xff0c;总部位于纽约市。 作为美国的人工智能科技巨头社会媒体和营销专业平台公司&#xff0c;互动广告局&#xff08;IAB- the Interactive Advertising Bureau&#xff09;自1996年成立以来&#xff0c;先后为700多家媒体…

C++ primer plus 学习 4.8 new动态结构 与结构体指针

参照C primer plus 4.8.4 踩坑涉及到 1. 如何初始化结构体 2. 结构体指针使用&#xff1a;&#xff08;*pn&#xff09;->atr&#xff0c;*pn则为结构体本身 3. 指针重新赋值可能导致的内存泄漏 4.delete的使用&#xff08;只能用在new后面&#xff09; 5. 数组和字符…

【ELK日志分析系统】ELK+Filebeat分布式日志管理平台部署

ELKFilebeat部署一、ELK简介1、ELK组件1.1 其他组件 2、为什么要使用 ELK3、完整日志系统基本特征 二、ELK的工作原理三、ELK Elasticsearch 集群部署1、环境准备2、部署 Elasticsearch 软件(node节点)2.1 安装elasticsearch—rpm包2.2 修改elasticsearch主配置文件2.3 es性能调…

Nerf原理理解

神经辐射场是一个简单的全连接网络&#xff08;权重约为 5MB&#xff09;&#xff0c;经过训练可使用渲染损失再现单个场景的输入视图。该网络直接从空间位置和观看方向&#xff08;5D 输入&#xff09;映射到颜色和不透明度&#xff08;4D 输出&#xff09;&#xff0c;充当“…

小白跟做江科大51单片机之DS18B02按键控制效果

1.新建项目导入AT24C02、Key、Delay、LCD1602、DS18B02相关文件 2.编写main.c函数 #include <REGX52.H> #include "LCD1602.h" #include "Delay.h" #include "Key.h" #include "AT24C02.h" #include "DS18B02.h" f…

Linux 相关命令

文章目录 目录相关操作vim 编辑器命令行模式插入模式底行模式 目录相关操作 查看当前目录下的文件 ls创建目录 mkdir 目录名进入文件&#xff0c;首先确认位于文件的目录 vi 文件名 vim 编辑器 命令行模式 控制光标的移动&#xff0c;字符或行的删除&#xff0c;移动复制某区域…

AntV L7初体验

本案例使用L7库和Mapbox GL JS创建的简单地图可视化示例&#xff0c;加载点数据。 文章目录 1. 引入 CDN 链接2. 导出模块3. 创建地图3.1. 注册 token3.2. 创建地图实例 4. 创建场景5.创建点图层6. 演示效果7. 代码实现 1. 引入 CDN 链接 <!-- 1.引入CDN链接 --> <!--…

数据库期末速成100分训练,附练手数据库原件及教程

本文提供下面数据库代码的数据库原件&#xff0c;下载后可使用 教程如下&#xff1a; 1.打开sql sever 2.找到数据库 3.右键数据库点击“附加”&#xff0c;然后点击“添加” 4.导入数据库原件&#xff0c;点击确定 ps&#xff1a;如果没有sqlsever 或者页面编辑器&#x…

manjaro 安装 wps 教程

内核: Linux 6.6.16.2 wps-office版本&#xff1a; 11.10.11719-1 本文仅作为参考使用, 如果以上版本差别较大不建议参考 安装wps主体 yay -S wps-office 安装wps字体 &#xff08;如果下载未成功看下面的方法&#xff09; yay -S ttf-waps-fonts 安装wps中文语言 yay …

uniapp 手写 简易 时间轴 组件

一、案例如图 该案例设计条件&#xff1a; 左侧时间 和竖线、点、内容都是居中对其的&#xff0c;上下时间点中间要有一段距离 二、编写逻辑 1. 布局结构&#xff1a;一共三个元素&#xff0c;左侧是时间和黑点&#xff0c;中间是线条&#xff0c;右侧是内容 2. 样式难点&#…

《UE5_C++多人TPS完整教程》学习笔记27 ——《P28 项目资产(Assets for The Project)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P28 项目资产&#xff08;Assets for The Project&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是译…

c# 调用ip2region组件 根据ip地址进行定位归属地运营商

需求描述&#xff1a;当项目中需要将IP转换成对应的归属地以及运营商&#xff0c;那么通过ip2region组件即可完美实现。 p2region本身支持net4.5以上&#xff0c;还有个ip2region.net组件&#xff0c;它要求net6及以上。所以&#xff0c;根据自己项目的需求即可选择其中一种方…

返回两个数组中每个对应位置的两个元素的最小值np.fmin()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 返回两个数组中 每个对应位置的 两个元素的最小值 np.fmin() 选择题 以下代码输出的结果是&#xff1f; import numpy as np a1 [1,np.nan,3] a2 [3,2,1] print("【显示】a1",a1)…

爬虫学习笔记-requests爬取NBA得分榜

1.导入requests库,用于请求获取URL位置的资源 import requests 2.导入lxml库,解析及生成xml和html文件 from lxml import etree 3.定义发送请求的地址 url https://nba.hupu.com/stats/players 4.定义请求头 headers {User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64…

Oracle 的同义词(Synonym) 作用

Oracle 同义词(Synonym) 是数据库对象的一个别名&#xff0c;Oracle 可以为表、视图、序列、过程、函数、程序包等指定一个别名。同义词有两种类型&#xff1a; 私有同义词&#xff1a;拥有 CREATE SYNONYM 权限的用户(包括非管理员用户)即可创建私有同义词&#xff0c;创建的…

蓝桥杯备赛 day2 | 4. 付账问题 5. 数字三角形

付账问题&#xff0c;关键是要了解整型的范围&#xff0c;确定获取输入数据的变量类型 需要注意的是int的十进制范围-32768 ~ 32767&#xff0c;那么我们可以知道&#xff0c;人数n是可以用int来装的&#xff0c;需付款数S应该是long long&#xff0c;获取的每个人初始钱数也应…

【排序】希尔排序

一、思想 希尔排序&#xff0c;由D.L. Shell于1959年提出&#xff0c;是基于插入排序的一种改进算法。它的主要思想是将待排序的序列分割成若干个子序列&#xff0c;这些子序列的元素是相隔一定“增量”的。然后对每个子序列进行直接插入排序。随着增量的逐步减小&#xff0c;…

软考高级:软件过程模型概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

博客等级怎么查看?博客等级怎么快速上升?博客等级升级要求是什么?如何增加博客等级上升的积分?等级权益有什么?

博客等级怎么查看&#xff1f;博客等级怎么快速上升&#xff1f;博客等级升级要求是什么&#xff1f;如何增加博客等级上升的积分&#xff1f;等级权益有什么&#xff1f; 一、博客等级怎么查看&#xff1f;二、博客等级怎么快速上升&#xff1f;2.1 博客等级升级要求是什么&am…