自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(21)
  • 收藏
  • 关注

原创 30天自制操作系统(第28天)

思路:打开文件时需要指定文件名,如果打开成功,操作系统将返回文件句柄。在随后的操作中,只要提供这个文件句柄就可以进行读写操作了,操作结束后将文件关闭。读取和写入API基本上需要指定需要读取(写入)的数据长度以及内存地址,文件的内容会被传送至内存(写入操作时是由内存传送至文件)。“RET”指令实际上相当于“POP EIP”,“POP EIP”实际上又相当于下面两条指令:MOV EIP,[ESP] ADD ESP,4)。EDI的值(可以临时改变它们的值,但要使用。:定位的起点为当前的访问位置。

2024-03-06 21:54:18 4898 3

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

思路:1.先调整bootpack.c中按下"x"按钮时,暂时将窗口隐藏起来,并当fifo接收从console.c发送的关闭窗口请求数据时释放指定的图层。2.由于cons.sht在命令行关闭后会置0,所以将console_task函数中的变量sheet。和_api_linewin这些在这个应用程序中根本用不到的函数,所以将a_nask.nas中的函数都拆开,形成api001.nas~api020.nas。中的段设置是供所有任务通用的,而LDT中的段设置则只对某个应用程序有效。.obj文件打包成一个文件。

2024-03-05 19:40:13 626 1

原创 30天自制操作系统(第26天)

是因为mmx、mmy与mmx2都是鼠标按下时才被确定的数据,而窗口移动时调用sheet_slide函数会修改图层的窗口坐标,其当前窗口的x坐标仅和mmx、mmx2有关系,而这两个数据是不随着鼠标变化的,后者y坐标用的是sht->vy0+y进行更新的,每次都会随着鼠标my坐标更新sht->vy0数值。思路:由于col_inv表示透明色,且在bootpack.c文件中将背景图层的透明色号设置为-1,像窗口都是有大量透明色,所以没有透明色图层需要全部刷新,有透明色的图层只需要刷新部分。

2024-03-04 20:53:28 897 1

原创 30天自制操作系统(第25天)

思路:由于25.5节中已经在TASK结构体中增加了元素,所以需要调整bootpack.c文件中的HariMain函数,将其中的task_cons[0]变成task。思路:可以为光的三原色reg、green、blue(红、绿、蓝)中每种颜色赋予6个色阶2,这样一来,就可以定义出6×6×6=216种颜色。思路:在TASK结构体中添加命令结构体和基地址,将console.c文件中task中的cons和ds_base进行赋值。当创建2个命令窗口时,第一个窗口数据会被第二个窗口数据覆盖,导致窗口无法正常关闭。

2024-03-03 20:03:14 602

原创 30天自制操作系统(第24天)

按照24.5节中的思路,只需要在接收鼠标数据时增加一个选中的窗口是否为最上面的窗口判断,若不是则调整标题颜色(鼠标点击标题成为最上面窗口的功能已经在第24.2节中实现)。思路:结合24.2节的代码,并且原函数中已实现了鼠标的实时坐标,仅需要记录移动前的鼠标位置,并设置一个标记,若鼠标左键长按标题位置时移动窗口,否则更新移动前鼠标位置。由于定时器只有一个标记状态的flags,没有是谁设置的定时器的标记,所以在TIMER结构体中增加flags2(当是应用程序申请的定时器,将flags2置为1)。

2024-03-02 22:13:38 722

原创 30天自制操作系统(第23天)

的目的为,窗口句柄归根到底是struct SHEET的地址,这一定是一个偶数,所以使ebx为字符串的地址进行运算。ebx&1 == 0是判断ebx作为字符串的地址,是否为空,如果为空则刷新图层。考虑画的是直线,如果点间隙较大则会变成虚线,较小则会可能出现在一个坐标上多次花点浪费时间,所以选择将坐标跨度较大的间隙分为1024,直接看代码。按照下表对api的设计,编写a_nask.nas中的相关函数,以及增加console.c文件中对edx的判断。task的成员,当应用程序结束时,查询所有的图层,如果图层的。

2024-03-01 21:42:14 4769 4

原创 30天自制操作系统(第22天)

PUSHAD,第一次是为了保存寄存器的值,第二次是为了向hrb_api传递值。因此如果查出被传递的变量的地址,在那个地址的后面应该正好存放着相同的寄存器的值。读键盘数据是在文件bootpack.c中实现的,所以将组合键的代码也放在该文件中。inthandler0c函数中的esp[11]是取esp栈中的第11号元素,如果想要得到产生异常时其他寄存器的值,可按照下面显示相应元素即可。文件内数据部分的大小,向数据段传送的部分的字节数。获取修改后的值,实现将值返回给应用程序的功能。E9是JMP指令的机器语言编码,

2024-02-27 22:03:18 941

原创 30天自制操作系统(第21天)

按照之前章节的理解,都是从汇编程序中输入了提前设定的字符才能进行打印,若将其整合成一个函数,当调用该函数时,便可打印岂不是更方便?hrb_api并不知道代码段的起始位置位于内存的哪个地址,但cmd_app应该知道,因为当初设置这个代码段的正是cmd_app。中注册一个函数即可,这是因为在x86架构规范中,当应用程序试图破坏操作系统,或者试图违背操作系统的设置时,就会自动产生。要做到这一点,可以创建应用程序专用的数据段,并在应用程序运行期间,将。但在显示字符串时,由于无法指定段地址,程序误以为是。

2024-02-26 21:38:24 3083 2

原创 30天自制操作系统(第20天)

思考一下,需要在执行hlt.nas文件时打印的字符,所以需要在文件中规定要打印的字符。打印字符需要调用cons_putchar函数,而该函数需要3个输入参数,还需要另外两个参数,怎么传递呢?bootpack.map文件中的_asm_cons_putchar的地址,由于每个电脑生成的bootpack.map文件中的地址不相同,所以需要根据自身情况进行调整。),再调用函数cons_putchar时将对栈中元素进行依次读出,形成其输入参数并执行。,因此我们不能使用普通的CALL,而应该使用far-CALL。

2024-02-23 21:55:25 521

原创 30天自制操作系统(第19天)

那么文件名存储在扇区中,而扇区对应的磁盘映像中的地址具体位置在哪?而应用程序并不知道内容被读到哪个内存地址,按照任务切换(mtask.c)操作,可将该内容放到GDT中,并调用farjmp实现任务切换功能。按照对windows系统的了解,当我们输入一个文件名,并按下回车键时将在屏幕上显示文件的内容。时,将执行如下操作:先打印一个空格字符,更新cursor_x,如果cursor_x超出窗口长度则将光标移到下一行的头。对于文件的下一段存放在哪里,在磁盘中是有记录的,只要分析这个记录,就可以正确读取文件内容了。

2024-02-22 20:27:50 520 1

原创 30天自制操作系统(第18天)

console_task函数的输入参数增加了,需要在函数HariMain中设置sht_cons处增加一行代码:*((int *) (task_cons->tss.esp + 8)) = memtotal;为解决这个问题,可将命令窗口中第1行数据改成第2行的,以此类推,第7行数据改成第8行的,并将第8行数据置空(置空也能看成将该行全部涂黑)。下面就是修改console_task函数,思路与上一节思路相似,增加两个取值(2和3)判断,废话不多说,直接上代码。2、切换到命令行窗口时,TASK_A的光标不显示。

2024-02-21 21:45:33 998

原创 30天自制操作系统(第17天)

将make_window8中描绘窗口标题栏的代码(make_wtitle8),和描绘窗口剩余部分的代码(make_window8)区分开来,以便在按下TAB按键后标题栏的颜色进行变化,达到窗口切换的视觉要求。在for循环的开头,当keycmd中有数据,且keycmd_wait为-1时,向键盘发送1个字节的数据,在开始发送数据的同时,keycmd_wait变为非-1的值。到这里,已经实现了锁定键模式的切换,不过现在还是有一个问题,模式是可以切换了,但是键盘上面的指示灯却不会发生变化。思路就是在按照之前的。

2024-02-20 21:51:32 790

原创 30天自制操作系统(第16天)

首先,要在FIFO的结构定义中,添加用于记录要唤醒任务的信息的成员。按照上述在mtask.c中进行的操作,变更timer.c中相关操作,最终在bootpack.c中的进行调用上述函数。B2以同样的速度运行,从公平竞争的角度来说确实不错,不过在某些情 况下,我们需要提升或者降低某个应用程序的优先级。凡是调用task_run函数的位置,都需要添加一个输入参数(priority),在这就不一一说明。也需要改写一下,不过和上一节一样,只是将唤醒休眠任务的。各自拥有自己的窗口,它们的功能都一样,即进行计数。

2024-02-19 22:31:34 515 1

原创 30天自制操作系统(第15天)

功能是让task_b_main在背景图层中的(0, 144)位置显示计数,就需要在task_b_main调用函数putfonts8_asc_sht刷新图层。因为memman_alloc_4k(memman, 64 * 1024)返回的是申请的内存首地址,在此基础上加上64*1024,已经超过申请的内存范围,所以是-8。首先创建两个任务tss_a和tss_b,并将任务写入GDT中,加载第一任务tss_a,并对后一任务进行的元素进行赋值tss_b,在系统运行10s后进行任务切换。//任务设置相关的信息。

2024-02-09 11:41:43 1014 1

原创 30天自制操作系统(第14天)

思路:首先在窗口中画一个白底的输入框,再判断键盘中断产生时按下的字符是否在字符串keytable中。如果在,进一步确认是否为退格符,如果是则用空字符进行覆盖,否则显示该字符。实现鼠标拖动窗口移动的功能,思路为当按下鼠标左键时,调用sheet_slide函数将sht_win的位置修改为(mx-80, my-8)。通过14.4节中已经实现在窗口中显示一个键盘输入的字符,下面将在窗口中实现连续输入字符。如果AX是0x004f以外的值,就意味着所指定的画面模式不能使用。画面模式信息中,重要的信息有如下。

2024-02-08 22:00:33 569

原创 30天自制操作系统(第13天)

还有就是using元素的重要性已经不大,如果想遍历链表,从表头就可以开始,而表头在TIMERCTL结构体中的元素t0已经记录了。但由于以前的每个结构体中data的数据类型为char,共有256个,而将鼠标、键盘等中断均整合到一起时,char类型无法满足要求,遂将char类型改成int。下面仅展示keyboard.c函数,如mouse.c、fifo.c、bootpack.c和bootpack.h等(只要使用了FIFO结构体的函数,均需要修改)文件就不一一展示。测试程序运行后的3s到10s期间,程序运行次数。

2024-02-08 17:16:46 337

原创 30天自制操作系统(第12天)

在12.4节中void inthandler20(int *esp)函数,需要递减timerout和判断,非常的费时。下面就是对TIMERCTL结构体初始化,并实现分配、释放、初始化和设置一个计时器的功能,并完善12.2节中的inthandler20函数。根据定时器分配的中断号为IRQ0(《深入理解linux内核》P158页),将中断周期设定为11932,换算成16进制为0x2e9c。上述结构体的元素出现变更,所以使用该结构的函数也需要进行完善(下面列举了改动较大的函数)。12.5 加快中断处理(

2024-02-07 18:07:03 273 1

原创 30天自制操作系统(第10-11天)

窗口图层刷新是因为窗口的内容有变化,所以要在画面上显示变化后的新内容。4.oldtop]的图层变成[hieght+1, ctl->top+1],ctl->top++。2.old>height && height == -1,表示该图层被隐藏了,所以将图层高度范围[old+1, ctl->top]变成高度[old, ctl->top-1],ctl->top--;

2024-02-05 22:00:38 527 1

原创 30天自制操作系统(第7-9天)

假设每页有4k内存,如果函数需要3226字节的内存,则从memman.free[0]中选一段连续的、未被使用的3226字节分配给函数( memman.free[0].addr+=3226;申请内存时需要考虑在哪个内存数组中申请多大的内存,确定函数的输入项为struct MEMMAN *man和size,接着就需要遍历man中所有的页,检查页中剩余内存能否满足size,如果可以满足则返回分配到的内存首地址,否则检查下一页内存。内存释放就是确定从什么地址开始的多大内存释放到哪页内存中,由此得出函数的输入项为。

2024-02-03 23:13:41 644

原创 30天自制操作系统(第4-6天)

第天语言与画面显示的练习4.1 用C语言实现内存写入由于函数的输入项为addr和data,且该两项数据类型为int,占4个字节,所以使用32位寄存器进行存储。将addr读到ECX寄存器,data的低八位读到AL寄存器(AL寄存器占8位,即一个字节),并将AL寄存器中的数据赋值给ECX寄存器中的地址处,总结。在3.8节中提到,VRAM的地址为0xa0000~0xaffff的64KB,所以下面函数的功能就是VRAM全部写入了15,而颜色种类也是2^8=256种,这可能就是为何要取低8位的原因。

2024-02-02 23:58:29 1090

原创 30天自制操作系统(第1-3天)

前3章主要搭建操作系统的基础功能,实现画面展示、C程序与汇编程序的相互转换等功能。

2024-01-31 16:56:47 1218 3

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除