01 2023 档案
摘要:起因背景 平常需要写用Python写一些脚本处理数据 但是工作的环境比较特殊 开发环境是有互联网环境的 部署环境是隔离环境 没有互联网 所以记录一下处理的方案 安装流程 1.全部安装 将当前电脑环境的所有库全部导出 首先 将本地的所有库 导出到一个文本文件中 (本地可能是pip 也可能是pip3)
阅读全文
摘要:让内核从错误中恢复 1.简介 微软早期的DOS系统 存在一个严重的问题是 如果应用程序运行出现问题 它会导致整个系统完全奔溃掉 我们当前的系统内核也存在这一的问题 例如打开api_call.asm,其内容如下 [SECTION .s32] BITS 32 call main retf api_put
阅读全文
摘要:运行简单的程序 (本节原来老师给的链接挂掉了) 所以这里直接编译运行了 本节大概就是 用汇编写了一个小程序 只有几行(这个小程序启动之后 hlt卡住) 我们写的操作系统 通过控制台命令 将其从软盘中载入到内存中运行 运行后 控制台卡住 就达到我们的目的了 这里放一个Makefile文件 可以实现自动
阅读全文
摘要:dir命令 和 文件写入 1.简介 本节要实现的控制台命令是dir 它的作用是列举出当前目录下的文件信息 我们当前的操作系统根本没有硬盘 更没有文件系统 那么这个命令列举的文件从哪里来呢? 由于我们的系统内核是存储在软盘上的 因此 我们直接把软盘当做系统硬盘 该命令列举的是存储在虚拟软盘上的文件 假
阅读全文
摘要:caps键响应 1.简介 上一节 我们成功实现了对shift按键的处理 这一节 我们看看如何处理caps 按键 当该键按下时 输入系统的字符在大小写间切换 由于我们系统启动后 默认输入是大写字符 完成本节后 我们把系统的默认字符改成小写 按下caps键 系统字符自动切换成大写 当caps键按下时 键
阅读全文
摘要:进程优先级 1.简介 我们有了进程调度 目前来看 所有进程一律平等 我们的调度算法是遍历每一个进程 然后给每一个进程一定的运行时间 然后再切换下一个进程 但实际运用上 进程间不会是平等的 有些进程承担着比较重要的工作 因此 它有理由获得更多的运行时间 例如内核进程 一些进程不是很重要 它就不应该占用
阅读全文
摘要:进程自动切换 1.简介 我们已经通过时钟中断完成了两个进程间的相互切换 但当前实现有很大的缺陷 例如我们只能在两个指定的进程间切换 如果要想增添新的进程 那么 没增加一个进程 按照当前模式 我们只能再增加相应代码 这显然是不可接受的 因此 这节 我们希望完成进程的切换机制 使得有新进程时 我们无需改
阅读全文
摘要:多任务多窗口 1.简介 为了让多任务的特性展示的更直观 本节 我们基于多任务的基础上 为系统实现多个窗口特效 每个窗口都运行于一个任务或进程 由于窗口基于各自不同的进程 因此窗口自身的变化更新不会影响到其他窗口 2.代码 CMain void CMain(void) { initBootInfo(&
阅读全文
摘要:进程挂起和恢复 1.简介 有了进程的自动调度后 接下来的任务在于 如何将空闲进程挂起 空闲进程往往是那些没有具体任务需要处理的进程 因此 如果继续让其运行的话 那么必然会耗费宝贵的CPU资源 如果能让它先挂起 等到它需要执行具体任务时 再把它调度到前台 那才是一种合理的进程管理机制 我们实现的进程调
阅读全文
摘要:进程之间互相切换 1.简介 上一节 我们初步介绍了进程相关的具体概念 特别是讲解了进程切换相关的数据结构 也就是TSS 也实现了进程的自我切换 本节 我们看看如何从当前的进程切换到新进程 然后再切换回来 进程A -切换->进程B-切换->进程A. 2.代码 先看看进程B的实现 一个进程主要包含一个主
阅读全文
摘要:输入文本框和鼠标移动窗体 1.简介 上一节 我们实现了按键转换成字符的功能 这一节 我们更近一步 在message box中实现一个输入文本框 按键时 字符显示在文本框内 并且输入光标在文本框中不断闪动 2.代码 2.1 输入文本框 write_vga_desktop.c中做如下改动 void ma
阅读全文
摘要:修改分辨率 1.简介 当前 我们系统的分辨率是320*480 这种分辨率太小 绘制出来的系统界面看起来很大条 也很粗糙 跟我们现实使用的操作系统比起来 差别太大 因此 本节 我们就在分辨率上做一些改进 2.代码 2.1 分辨率的改进 设置显示分辨率是在内核的汇编部分实行的,代码如下(kernel.a
阅读全文
摘要:利用时钟开发光标闪烁 1.简介 上一节,我们已经实现了时钟超时功能 但一个操作系统 肯定是能支持多个时钟的 本节 我们就看看如何从上一节的单时钟向多时钟转变 同时利用时钟超时机制实现光标的闪烁特效 2.代码 现在 我们要把有个时钟的信息抽取出来 这样的话 就使得一个控制器能对应管理很多个时钟对象 因
阅读全文
摘要:消除鼠标闪烁 1.简介 上一节 我们消除了因刷新而导致的严重闪烁 但问题并没有从根子上解决 因为当我们把鼠标挪动不断刷新自己的Message Box上面时 发现鼠标居然变得闪动起来 当窗体自身刷新时 它会把处于它上方的窗体也进行刷新 而这种操作其实是没有必要的 我们看下面这种情况 1 1 1 1 1
阅读全文
摘要:消除闪烁1 1.简介 就以前几节我们创造的Message box为例 我们修改一下代码 不断的修改Box窗体内的字符 进而导致图层不断刷新 (在上节我们已经出现了这样的问题 22-突破连续读取72个扇区) 运行后 就疯狂的闪烁 这个现象的产生 是因为我们在刷新Box窗体时 我们也同时在刷新底层桌面
阅读全文
摘要:图层叠加优化 1.简介 在前几节 我们使用窗体图层叠加技术 解决了窗体鼠标移动时 破坏其他窗体界面的问题 但同时 也引入了新的问题 当鼠标移动时 内核会将所有窗口重新绘制 如果当前系统打开的窗口很多 假设有几十上百个 那么鼠标动一下 就重新绘制上百个窗口 这对cpu资源的消耗就会非常大 整个系统的性
阅读全文
摘要:图片分层技术 1.简介 在前面的章节中 我们完成了鼠标的绘制 但存在一个严重的问题是 当鼠标移动的时候 鼠标下方的窗口或图案会因为内核重绘鼠标而被擦除掉 解决这个问题的办法是 每当鼠标移动时 我们先把底下的图案绘制一遍 然后把鼠标在移动后的新坐标处再绘制一遍 由此 我们引出一个叫图层的概念 鼠标下面
阅读全文
摘要:挪动鼠标 1.简介 鼠标发送的数据 必须三个字节连在一起解读 所以我们的内核要等待鼠标发送足够的数据后才可以采取行动 前面我们看到 当鼠标被激活后 它会立马给内核发送一个字节数据 数值为0xfa 当内核收到这个数据后 就可以开始积攒数据 每接收三个字节后 根据数据绘制鼠标 这三个字节数据是有一定特点
阅读全文
摘要:建立中断机制 1.简介 上一节,我们绘制了鼠标图案,遗憾的是,鼠标箭头是死的,动不了,要想让鼠标移动,我们需要为内核建立中断机制 当我们移动鼠标时,鼠标会给CPU发送信号,CPU接收到信号后,终止当前的运算,执行内核给定的代码以处理鼠标发送的信号 中断信号的发送机制 每一个8259A控制器有8根中断
阅读全文
摘要:给系统绘制字体 1.简介 如果我们把字体的大小限定在一个8*16的长方形区域,那么我们在这个区域内,将特定位置的像素点设置成黑色,其他点设置成白色,那么我们就可以得到一个白底黑色的字体: 2.单字体实现 如果我们把8*16区域当做一个二维数组,白色的像素我们用0表示,黑色像素我们用1表示, 那么上图
阅读全文