09 2011 档案
摘要:首先在将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是一个不断运行的进程
阅读全文
摘要:< Virtual terminals >Ctrl + Alt + F1 Switch to the first virtual terminal. In Linux, you can have several virtual terminals at the same time. The default is 6.Ctrl + Alt + Fn Switch to the nth virtual terminal. Because the number of virtual terminals is 6 by default, n = 1...6.tty Typing the t
阅读全文
摘要:在代码写到后期的时候,加入操作系统之后,作者的代码组织风格突然一转。刚开始lib中的函数很多是供kernel自己调用的,利用lib中的这些函数,kernel中又添加了硬盘驱动task,tty驱动task,并且向外提供了printf函数接口。可供其他的User Task来调用。后来加上了FileSystem之后,又多出来了一个模块,可能因为FileSystem比较大。单独一个文件夹存放FileSystem的代码。并且FileSystem也向外UserTask提供了open close write read接口。在不断开发的过程中,不断又很多模块的对外接口,搀杂在各自的模块中,不是太好管理。于是将
阅读全文
摘要:怎么说呢,最近遇到一大堆程序的时候真的有点手足无措,感觉很被动阿。迎难而上才能有所得。这次的经验是面对一大堆要写的代码该怎么办呢?答案:先搭框架!其实上面这四个字着实有点太忽悠人,写代码少的人很有能够真正理解框架是什么意思。其实这个词含义真是太丰富了,可是现阶段我自己的所谓的框架,就是要完成我的功能,需要添加的代码的结构。1 分解的过程,也就是理解和总结思路的过程,这种形式的分解粒度可能会比较粗,这种形式分解结果将其写在纸上。包括model,behavior等等。2 假如现在准备写某一小块的代码了,可是由于代码可能也不是那么直接,可以在更具体的级别再进行一次分解。这次的分解结果函数之间可以写出
阅读全文
摘要: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是硬件与.
阅读全文
摘要:1 每天早上起床后,晚上睡觉前,按摩胃腹部(肚脐和上腹部各50次)。预防胃病复发应避免腹部和脚受凉按摩健胃减少胃病复发在寒冷的冬季,胃部容易受凉,慢性胃炎也易复发。若在空闲时自我按摩胃腹部,就能提高胃动力和免疫功能,减轻胃病症状,减少胃病的复发。 具体方法:两手相叠于上腹部,以胸骨柄剑突下为中心,作顺、逆时针方向按摩各30~50次;然后同法在神厥穴(即肚脐)周围按摩各30~50次。此外,还可按摩两腿足三里50~100次。每日早晚各1次,坚持进行按摩,胃肠部必有反应,或打嗝,或肠鸣,或肛门排气等,这些都是正常的生理反应。2 晚上睡觉前使用热水泡脚。前贤说的"春天洗脚,升阳固脱;夏天洗脚
阅读全文
摘要:struct的声明和面向对象中的类还是有少许区别,现总结struct的声明的用法以备以后复习。1 正规写法,这样便声明了一个类型struct apple:struct apple{...};2 同时声明一个此类型的变量,这样不但有了struct apple这个变量类型,还同时声明了一个变量myApple:struct apple{...}myApple;3 不加变量类型名,只是声明一个变量:struct {...}myApple;4 使用typedef,将struct apple进行重新定义类型:typedef struct apple{...}apple;apple myApple;上面的s
阅读全文
摘要:最近在看别人写的代码,关于宏存放在哪个头文件这一点上真是异常的郁闷。现总结如下:在将程序模块化的同时,重要的是确定自己所要使用的函数和宏的存放文件。函数或者宏可以分为专用和通用。可以将专用的根据其功能存放到几个文件(.c 和 .h)中当成一个模块。通用的可以有条理的放在一起。宏中的常量有时候单独分出来,会使代码更加的清晰(主要原因是看作者是这么干的)。在几个小的专用模块(功能互相不是太干扰)中的宏,可以将常量一起单独存放到一个const.h中。什么叫常量呢?比如我要访问某几个寄存器的端口。这个就可以声明在const.h中,而我在自己的程序假如定义个buf,将buf的大小定义为宏,这就不能被叫做
阅读全文
摘要: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;
阅读全文
摘要:问题1、判断链表是否存在环。 设置两个指针fast和slow,初始值都指向头指针,slow每次前进一步,fast每次前进两步。如果存在环,则fast必先进入环,而slow后进入环,两个指针必定相遇(见下面的证明1)。(当然,fast先到达尾部为NULL,则为无环链表)。程序如下: bool isExitsLoop(Node* head) Node *slow = head, *fast = head; //fast && fast->next保证了fast可以接着向下移动 while(fast && fast->next) slow = slow-&
阅读全文
摘要:1 内嵌汇编1)__asm__用于指示编译器在此插入汇编语句2)__volatile__用于告诉编译器,严禁将此处的汇编语句与其它的语句重组合优化。 即:原原本本按原来的样子处理这这里的汇编。The format of basic inline assembly is very much straight forward. Its basic form is asm("assembly code");Example. asm("movl %ecx %eax"); /* moves the contents of ecx to eax */__asm__(
阅读全文
摘要:怎么说呢?最近在写系统调用的时候,牵扯到从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进行相应的显示动作的改变。滚屏,删除,换行,切屏。键盘:这里主要是完成键盘的 扫描码------
阅读全文
摘要:Register usage and data alignment for 16-bit modelsWhen interfacing to 16-bit memory models, assembly languagefunctions can change the values in AX, BX, CX, DX, or ES. Functionsmust preserve the values in SI, DI, BP, SP, SS, CS, and DS. Thedirection flag must always be set to forward.Data should be
阅读全文
摘要:宏全部使用大写字母--------宏大写结构体名字全部使用typedef,typedef之后的名字为大写-------结构体别名大写函数名全部使用小写字母,单词之间使用下划线分割-------函数名小写,单词之间下划线(1)函数名第一个单词全小写,后面单词的首字母大写,单词之间使用下划线---------函数名首单词小写,后面单词首字母大写(2)变量名也是全部使用小写,单词之间使用下划线分割-------变量名小写,单词之间下划线(1)变量名第一个单词全小写,后面单词的首字母大写,单词之间使用下划线---------变量名单词小写,后面单词首字母大写(2)变量的命名前后缀规则如下(这是匈牙利命
阅读全文
摘要:最近在写操作系统的时候,学习了作者的C代码中头文件的布置风格,记录于此。可以有一个文件专门存放全局变量(也有可能是一类文件),然后对全局变量的头文件声明,使用extern关键字。普通c文件对应的头文件.h中,主要存放结构体和宏。(能定义成宏的尽量到相应的头文件中定义成宏,这有利于代码的可读性。注意头文件中要使用#ifndef等的预处理命令,防止重复定义。)而c文件中存放一些私有函数和公有函数。这样的话,将一些属于一大类的函数声明放到同一个头文件中。有一个文件专门存放typedef。有一些零碎的宏,可以使用一个比如名叫const.h来集中存放。如果在头文件中的声明、宏、结构体等等引用到了其他头文
阅读全文
摘要:[仅供自己参考]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
阅读全文
摘要:One of the "big picture" issues in looking at compiled C code is thefunction-calling conventions. These are the methods that a callingfunction and a called function agree on how parameters and return valuesshould be passed between them, and how the stack is used by the functionitself. The
阅读全文
摘要:1 首先要说明的是 “一致代码段和非一致代码段” 的概念。“一致”的意思是这样的:当转移的目标是一个特权级更高的一致代码段(CPL<=DPL,RPL<=DPL(级别的高低,不是数字的大小)),当前的特权级会被延续下去,CPL不变。而向特权级更高的非一致代码段的转移会引起常规保护错误。说明:代码段是否为一致代码段的属性是在规定GDT表的Descriptor的属性选项规定的。数据段都是非一致的。利用call和jmp总结:向非一致代码段访问,只能访问同一特权级别的,要真想访问其他级别的,使用调用门和retd。向一致代码段访问,只能Low->High or Same Privileg
阅读全文
摘要:将多个.o文件链接成可执行文件的时候。如果链接的顺序不对,会产生错误。《An introduction of gcc》里面有下面一段话:On Unix-like systems, the traditional behavior of compilers and linkersis to search for external functions from left to right in the object filesspecified on the command line. This means that the object file whichcontains the defini
阅读全文
摘要:今天在写kernel的时候碰见这么一个错误,undefined reference to `__stack_chk_fail'出现错误的地方是在 void disp_Int(int num)调用了,void itoa(char* str, int num).如果不想使用gcc的堆栈溢出保护可以使用:CFLAGS add -fno-stack-protector when compile下面是添加保护的代码: What is it? The GCC SSP protects the stack from buffer overflows. If a buffer overflow occ
阅读全文
摘要:[红字之间部分---对我自己的指引]最重要的最具启发性的部分:指针和数组。对经典话语的摘抄在此:对于数组int a[5]; int b[3][6];a是个const的type为array of 5 ints变量,&a为取出array of 5 ints的首地址,但a的值在C中规定是数组首地址,不要乱联系。&a在进行运算的时候取出的是类型array of ints的首地址,所以类型是pointer of array of ints.a在进行运算的时候取出的是类型int的首地址,所以类型是pointer of int.*p-----第一步取出存在p中地址,判断存在p中的当前的地址是
阅读全文
摘要:1 进行多行替换前首先要决定在哪几行替换?先选定多行,再按':',则默认命令是在选中的行进行操作。比如先‘v’进入visual模式,选定这几行。然后按‘:’进入命令模式,再象下面说的打上要进行的替换操作,点击‘RET’。先点击‘:’,进入命令模式再手动写需要操作哪几行。比如:1,4---代表对1到4行进行替换。4,$----代表对4到行尾进行替换。2 如何进行替换?基本命令形式:range s/.../.../g -----其中‘...’代表省略号。高级的用法需要学习Linux里面的正则表达式。下面说几种比较特殊常用的形式:替换行首:s/^/.../g ---------在行首
阅读全文

浙公网安备 33010602011771号