随笔分类 - 自己动手写操作系统
摘要:首先在将tty纳入文件系统后,它将处于核心位置。主要分为三个模块,tty.c(控制),keyboard.c(输入),console.c(输出)模块。将tty纳入文件系统后,dev_tty1, dev_tty2, dev_tty3三个文件。现在假设进程SHELL打开了dev_tty1, 把它当做文件一样读写.具体读入的过程是这样的:SHELL进程调用read,传文件(dev_tty1)的fd和buf到文件系统。文件系统发现此文件属性为tty设备,就向task_tty发消息准备让tty从外界读入信息。此时shell阻塞,文件系统继续运行,tty正在等待用户输入。task_tty是一个不断运行的进程
阅读全文
摘要:在代码写到后期的时候,加入操作系统之后,作者的代码组织风格突然一转。刚开始lib中的函数很多是供kernel自己调用的,利用lib中的这些函数,kernel中又添加了硬盘驱动task,tty驱动task,并且向外提供了printf函数接口。可供其他的User Task来调用。后来加上了FileSystem之后,又多出来了一个模块,可能因为FileSystem比较大。单独一个文件夹存放FileSystem的代码。并且FileSystem也向外UserTask提供了open close write read接口。在不断开发的过程中,不断又很多模块的对外接口,搀杂在各自的模块中,不是太好管理。于是将
阅读全文
摘要:1首先硬盘分区的优点和缺点有很多,这里Google一下Disk Partition Wiki。就能了解很多,至少我们都知道的是下面几条优点。不同的操作系统可以安装在不同的分区里面,而且可以互相不影响。并且可以在不同的分区内使用不同的文件系统。比如Linux里面可能需要一块swap分区,用于虚拟内存的硬盘交换。还有可能由于一些安全的原因,需要将一些数据单独放到一个分区里面。2 分区的实现(写给自己看的,不是科普知识)。首先硬盘0扇区是引导扇区,硬盘分区表就记录在0扇区的1BEh处的一个结构体数组(分区表)中。记录了Primary(主分区)和Extended(扩展分区)的起始扇区号和扇区数目。Pa
阅读全文
摘要:串输入指令 指令格式1: [REP] INS 目的串 , DX 指令格式2: [REP] INSB 指令格式3: [REP] INSW 功能: INS指令可从DX指出的外设端口输入一个字节或字到由ES: DI指定的存储器中。 输入字节还是字,则由ES: DI目标操作数的属性决定,且根据方向标志位DF和目标操作数的属性来修改DI的值:若(DF)= 0,则DI加1(或加2);否则DI减1(或减2)。 与INS指令相似,INSB 和INSW指令也分别从DX指出的外设端口输入一个字节或字到由ES: DI指定的存储器中,且根据方向标志位DF和串操作的类型来修改DI的值...
阅读全文
摘要:以前看这篇文章大内容,估计还是糊头把脑的看不懂。可是最近自己动手写简单的操作系统之后了,便跟明镜似的了,呵呵。对这些理论有比较清晰的认识了。当。。。下面为转:计算机用户在使用计算机的过程中,都会接触到BIOS,它在计算机系统中起着非常重要的作用。一块主板性 能优越与否,很大程度上取决于主板上的BIOS管理功能是否先进。 BIOS(Basic Input/Output System,基本输入输出系统)全称是ROM-BIOS,是只读存储器基本输入/输出系统的简写,它实际是一组被固化到电脑中,为电脑提供最低级最直接 的硬件控制的程序,它是连通软件程序和硬件设备之间的枢纽,通俗地说,BIOS是硬件与.
阅读全文
摘要:The standard predefined macros are specified by the C and/or C++language standards, so they are available with allcompilers thatimplement those standards. Older compilers may not provide all ofthem. Their names all start with double underscores.__FILE__--------------当前文件的名字__BASE_FILE--------假设a.h..
阅读全文
摘要:下面的模型一般都用在核心服务器或者kernel中的多任务控制部分!十分有用。消息发送函数原型:send(dest, message);recv(src, message);下面将接收消息的叫做Server,发送消息的叫做Client.1 Client -> Server (send)if(server.state != Recieving) //将Client挂起,并且加入Server的消息队列。 set(client.state); block(client); add client to server's Queue.else copy message to server;
阅读全文
摘要:怎么说呢?最近在写系统调用的时候,牵扯到从User空间拷贝内存到Kernel空间的问题,因为当前写的进程都是和Kernel一起编译的,也没有什么虚拟地址的问题,就都是保护模式下的4G空间的地址。所有的Kernel中的代码包括好几个进程都是在这个空间运行的。比如TTY进程虽然是自己单独运行在Task特权级上的,但是因为和Kernel一起编译,Kernel中的代码随时可以调用TTY中的代码并修改TTY中的数据结构或者变量的值。如果进程是单独编译,并且不使用虚拟地址空间,那么需要链接时候指定自己在内存中的地址,但是由于ldt的存在使得它其实还是可以被存放到其他实际内存地址的,如果它的内存地址已经有进
阅读全文
摘要:作为一个初学者,我们可能一直迷惑为何自己的代码不能直接访问kernel中的变量和资源,还要这么麻烦的使用系统调用?就比如最近我在写一个tty模块,这个模块负责接受键盘操作并在Console上做相应的显示。当然也可以在其他进程中直接操作tty的输入缓冲,或者直接在这个tty的控制台上进行显示。现在问题来了:我该怎么调用tty模块中的代码让其在控制台上显示呢?直接在其他进程中的代码调用tty中的代码使用系统调用,让kernel去调用tty中的代码去操作已经运行起来的进程中的数据。一般在操作系统上层,大家的理解就是利用系统调用进入kernel,让kernel来操作这一块。但并没有想过为什么?如果想要
阅读全文
摘要:最近在学习操作系统的开发过程中,到了输入输出系统了,但是由于输入输出系统这部分,思路很简单,但又过程很繁杂,鉴于时间有限,所以决定先跳过自己动手写的过程,只是将书写的思路记录于下,以备以后查阅,待其他更加重要的部分完成后,再回头来试着自己动手完成输入输出系统这部分。TTY模型是很不错的输入输出模型,完成后面的后,一定要回头来写一下这个模型(MVC?)。职责分工分明,层次清晰。tty负责管理不同的切面。包括与下层键盘缓冲的通信,每个tty的缓冲的控制。console负责显示,根据tty传过来的char进行相应的显示动作的改变。滚屏,删除,换行,切屏。键盘:这里主要是完成键盘的 扫描码------
阅读全文
摘要:[仅供自己参考]1 第一个进程的书写思路:前提:申请好相应gdt,idt,tss的内存(可用C写),并进行必要的初始化。申请好proc_table的内存,proc_table包涵了stack_frame(进程切换时候用于存放cpu状态的地方)和ldt表(这个进程对应的ldt)和 ldt_sel(GDT表中的selector)。对proc_table进行必要的初始化(这个进程第一次运行之前当然得初始化我们希望进程开始时候的cpu状态)调入一个叫restart的函数,它做得主要工作是:将此进程的ldt赋值为p_proc_ready的ldt_sel.将tss中的esp赋值为自己的proc_table
阅读全文
摘要:1 首先要说明的是 “一致代码段和非一致代码段” 的概念。“一致”的意思是这样的:当转移的目标是一个特权级更高的一致代码段(CPL<=DPL,RPL<=DPL(级别的高低,不是数字的大小)),当前的特权级会被延续下去,CPL不变。而向特权级更高的非一致代码段的转移会引起常规保护错误。说明:代码段是否为一致代码段的属性是在规定GDT表的Descriptor的属性选项规定的。数据段都是非一致的。利用call和jmp总结:向非一致代码段访问,只能访问同一特权级别的,要真想访问其他级别的,使用调用门和retd。向一致代码段访问,只能Low->High or Same Privileg
阅读全文

浙公网安备 33010602011771号