摘要: 【版权所有,转载请注明出处。出处:http://www.cnblogs.com/joey-hua/p/5570691.html 】 Linux内核从启动到初始化也看了好些个源码文件了,这次看到kernel文件夹下的system_call.s,这个文件主要就是系统调用的过程。但说到系统调用,不只是这一 阅读全文
posted @ 2016-06-09 01:24 是非猫 阅读(1670) 评论(0) 推荐(0) 编辑
摘要: 按照C编译器的约定调用函数时压栈的顺序是从右向左,并且返回值是保存在eax寄存器当中。这个命题本该是成立的,下面用一个小程序来反汇编观察执行过程: 代码解释一下,asm的代码中movl %%eax, %0的意思是把寄存器eax的值赋值给咱们程序的eax变量当中。但为什么执行结果却是: z is 11 阅读全文
posted @ 2016-05-28 13:02 是非猫 阅读(3902) 评论(0) 推荐(0) 编辑
摘要: 1.简介 本文主要介绍三个文件bootsect.s、setup.s、head.s,主要是做了些从软盘加载内核和设置32位保护模式的操作。 2.程序分析 当PC电源打开后,BIOS自检后将bootsect读入内存绝对地址0x7c00处,因为bootsect.s的结尾是: 然后跳转到0x7c00处并把执 阅读全文
posted @ 2016-05-27 18:09 是非猫 阅读(1993) 评论(1) 推荐(0) 编辑
摘要: 上面的三个进程都是延迟相同的时间,让我们修改一下,尝试让它们延迟不同的时间。 运行后,数一数可以知道,输出中共有A字母140个,B字母51个,C字母32个,所以A和B的个数之比是2.745,A和C的个数之比是4.345,这两个数字与3(进程B和A的延迟时间之比)和5(进程C和A的延迟时间之比)是基本 阅读全文
posted @ 2016-05-15 15:02 是非猫 阅读(441) 评论(0) 推荐(0) 编辑
摘要: 计数器的工作原理是这样的:它有一个输入频率,在PC上是1193180HZ。在每一个时钟周期(CLK cycle),计数器值会减1,当减到0时,就会触发一个输出。由于计数器是16位的,所以最大值是65535,因此,默认的时钟中断的发生频率就是1193180/65536约等于18.2HZ。 我们可以通过 阅读全文
posted @ 2016-05-14 14:57 是非猫 阅读(683) 评论(0) 推荐(0) 编辑
摘要: 在我们的操作系统中,已经存在的3个进程是运行在ring1上的,它们已经不能任意地使用某些指令,不能访问某些权限更高的内存区域,但如果一项任务需要这些使用指令或者内存区域时,只能通过系统调用来实现,它是应用程序和操作系统之间的桥梁。 所以,一件事情就可能是应用程序做一部分,操作系统做一部分。这样,问题 阅读全文
posted @ 2016-05-13 19:35 是非猫 阅读(298) 评论(0) 推荐(0) 编辑
摘要: 如题 阅读全文
posted @ 2016-05-12 19:28 是非猫 阅读(256) 评论(0) 推荐(0) 编辑
摘要: 我们再来添加一个任务,首先添加一个进程体: 然后在global.c: 然后是proc.h: 运行结果如下: 我们把现在的添加任务的步骤总结一下: 1.在task_table中增加一项(global.c) 2.让NR_TASKS加1(proc.h) 3.定义任务堆栈(proc.h) 4.修改STACK 阅读全文
posted @ 2016-05-11 19:53 是非猫 阅读(253) 评论(0) 推荐(0) 编辑
摘要: 进程此时不仅是在运行而已,它可以随时被中断,可以在中断处理程序完成之后被恢复。进程此时已经有了两种状态:运行和睡眠。我们已经具备了处理多个进程的能力,只需要让其中一个进程处在运行态,其余进程处在睡眠态就可以了。 在main.c中进程A的代码的下面添加进程B: 打印的字母换成了B,i的初始值被设成了0 阅读全文
posted @ 2016-05-11 14:35 是非猫 阅读(426) 评论(0) 推荐(0) 编辑
摘要: 于是我换了一个思路来理解这个typedef 我们首先看常规的变量定义: 加上typedef以后,就可以理解为,原来的变量名变成了自己本身对应的类型名 如INT就代表了int类型 c就变成了char* Fun就代表了“返回值为void,无参数的函数指针”型 理解typedef的关键就是,别把typed 阅读全文
posted @ 2016-05-10 18:03 是非猫 阅读(434) 评论(0) 推荐(0) 编辑
摘要: 现在又出现了另外一个的问题,在中断处理过程中是否应该允许下一个中断发生? 让我们修改一下代码,以便让系统可以在时钟中断的处理过程中接受下一个时钟中断。这听起来不是个很好的主意,但是可以借此来做个试验。 首先,因为CPU在响应中断的过程中会自动关闭中断,我们需要人为地打开中断,加入sti指令;然后,为 阅读全文
posted @ 2016-05-08 17:21 是非猫 阅读(1132) 评论(0) 推荐(0) 编辑
摘要: 首先打开时钟中断: 为了让时钟中断可以不停地发生而不是只发生一次,还需要设置EOI: 运行后发现结果和原来没有任何区别,因为我们只是可以继续接受中断而已,其余并没有做什么。 中断现在已经被打开,于是就存在ring0和ring1之间频繁的切换。两个层级之间的切换包含两方面,一是代码的跳转,还有一个不容 阅读全文
posted @ 2016-05-08 12:49 是非猫 阅读(469) 评论(0) 推荐(0) 编辑
摘要: 进程的切换及调度等内容是和保护模式的相关技术紧密相连的,这些代码量可能并不多,但却至关重要。 我们需要一个数据结构记录一个进程的状态,在进程要被挂起的时候,进程信息就被写入这个数据结构,等到进程重新启动的时候,这个信息重新被读出来。 在很多情况下,进程和进程调度是运行在不同的层级上的。这里本着简单的 阅读全文
posted @ 2016-04-29 14:55 是非猫 阅读(564) 评论(0) 推荐(0) 编辑
摘要: 8259A虽然已经设置完成,但是我们还没有真正开始使用它呢。 所有的中断都会触发一个函数spurious_irq(),这个函数的定义如下: spurious_irq()其实什么也不做,仅仅是把IRQ号打印出来而已。 其实现在已经可以make并运行了,但是不会有什么效果,因为我们不但没有通过任何方式设 阅读全文
posted @ 2016-04-22 16:06 是非猫 阅读(595) 评论(0) 推荐(0) 编辑
摘要: 因为CPU只有一个,同一时刻要么是客户进程在运行,要么是操作系统在运行,如果实现进程,需要一种控制权转换机制,这种机制便是中断。 要做的工作有两项:设置8259A和建立IDT。 out_byte的函数体位于kliba.asm中 现在,该是把这些中断和异常的处理程序统统添加上的时候了。 异常发生时堆栈 阅读全文
posted @ 2016-04-22 14:30 是非猫 阅读(366) 评论(0) 推荐(0) 编辑