摘要: 最近在看别人写的代码,关于宏存放在哪个头文件这一点上真是异常的郁闷。现总结如下:在将程序模块化的同时,重要的是确定自己所要使用的函数和宏的存放文件。函数或者宏可以分为专用和通用。可以将专用的根据其功能存放到几个文件(.c 和 .h)中当成一个模块。通用的可以有条理的放在一起。宏中的常量有时候单独分出来,会使代码更加的清晰(主要原因是看作者是这么干的)。在几个小的专用模块(功能互相不是太干扰)中的宏,可以将常量一起单独存放到一个const.h中。什么叫常量呢?比如我要访问某几个寄存器的端口。这个就可以声明在const.h中,而我在自己的程序假如定义个buf,将buf的大小定义为宏,这就不能被叫做 阅读全文
posted @ 2011-09-14 21:17 Jack204 阅读(183) 评论(0) 推荐(0) 编辑
摘要: 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.. 阅读全文
posted @ 2011-09-14 17:24 Jack204 阅读(317) 评论(0) 推荐(0) 编辑
摘要: 下面的模型一般都用在核心服务器或者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;  阅读全文
posted @ 2011-09-14 16:58 Jack204 阅读(350) 评论(0) 推荐(0) 编辑
摘要: 问题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-& 阅读全文
posted @ 2011-09-14 11:10 Jack204 阅读(3611) 评论(0) 推荐(0) 编辑
摘要: 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__( 阅读全文
posted @ 2011-09-13 18:45 Jack204 阅读(3091) 评论(0) 推荐(0) 编辑
摘要: 怎么说呢?最近在写系统调用的时候,牵扯到从User空间拷贝内存到Kernel空间的问题,因为当前写的进程都是和Kernel一起编译的,也没有什么虚拟地址的问题,就都是保护模式下的4G空间的地址。所有的Kernel中的代码包括好几个进程都是在这个空间运行的。比如TTY进程虽然是自己单独运行在Task特权级上的,但是因为和Kernel一起编译,Kernel中的代码随时可以调用TTY中的代码并修改TTY中的数据结构或者变量的值。如果进程是单独编译,并且不使用虚拟地址空间,那么需要链接时候指定自己在内存中的地址,但是由于ldt的存在使得它其实还是可以被存放到其他实际内存地址的,如果它的内存地址已经有进 阅读全文
posted @ 2011-09-13 10:06 Jack204 阅读(367) 评论(0) 推荐(0) 编辑
摘要: 作为一个初学者,我们可能一直迷惑为何自己的代码不能直接访问kernel中的变量和资源,还要这么麻烦的使用系统调用?就比如最近我在写一个tty模块,这个模块负责接受键盘操作并在Console上做相应的显示。当然也可以在其他进程中直接操作tty的输入缓冲,或者直接在这个tty的控制台上进行显示。现在问题来了:我该怎么调用tty模块中的代码让其在控制台上显示呢?直接在其他进程中的代码调用tty中的代码使用系统调用,让kernel去调用tty中的代码去操作已经运行起来的进程中的数据。一般在操作系统上层,大家的理解就是利用系统调用进入kernel,让kernel来操作这一块。但并没有想过为什么?如果想要 阅读全文
posted @ 2011-09-13 00:27 Jack204 阅读(624) 评论(0) 推荐(0) 编辑
摘要: 在以前也知道写程序需要用笔将不能很清晰在大脑呈现的东西,画在纸上,以备写程序的时候做参考。刚开始的时候,只知道将能看见的东西或者是容易形成看得见的东西画成图,然而更抽象一个层次的,或者是更不形象化的,却有时很难把握住。最近在写操作系统底层的时候,有很多抽象出来的,并不是那么形象化,我在写的时候就有点无从下手。其实发现将他们这些要写的部分画在纸上,标明之后,画清楚他们之间的关系,代码自然浮出水面。越抽象的,越需要将其画出来,减少抽象所带来的写代码的困难。 阅读全文
posted @ 2011-09-12 23:00 Jack204 阅读(239) 评论(0) 推荐(0) 编辑
摘要: 最近在学习操作系统的开发过程中,到了输入输出系统了,但是由于输入输出系统这部分,思路很简单,但又过程很繁杂,鉴于时间有限,所以决定先跳过自己动手写的过程,只是将书写的思路记录于下,以备以后查阅,待其他更加重要的部分完成后,再回头来试着自己动手完成输入输出系统这部分。TTY模型是很不错的输入输出模型,完成后面的后,一定要回头来写一下这个模型(MVC?)。职责分工分明,层次清晰。tty负责管理不同的切面。包括与下层键盘缓冲的通信,每个tty的缓冲的控制。console负责显示,根据tty传过来的char进行相应的显示动作的改变。滚屏,删除,换行,切屏。键盘:这里主要是完成键盘的 扫描码------ 阅读全文
posted @ 2011-09-12 09:01 Jack204 阅读(431) 评论(0) 推荐(0) 编辑
摘要: 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 阅读全文
posted @ 2011-09-09 17:25 Jack204 阅读(403) 评论(0) 推荐(0) 编辑