![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
GeekOS
文章平均质量分 69
wu5795175
关注系统底层和web
展开
-
GeekOS源代码学习(2)Main函数
Main函数代码/* * GeekOS C code entry point * Copyright (c) 2001,2003,2004 David H. Hovemeyer * Copyright (c) 2003, Jeffrey K. Hollingsworth * Copyright (c) 2004, Iulian Neamtiu * $Revision: 1.原创 2012-04-10 21:41:21 · 1132 阅读 · 0 评论 -
GeekOS中的线程切换
在GeekOS中有两个地方会发生线程切换1.中断函数中,当执行完中断例程Handle_Interrupt的时候,可能会进行一次线程切换。在Handle_Interrupt中,执行完中断函数后,CPU会检查抢占标志g_preemptionDisabled和调度标志g_needRschedule,若g_preemptionDisabled==0,g_needRsched原创 2013-07-19 15:54:12 · 1016 阅读 · 0 评论 -
GeekOS 中的进程同步方法
GeekOS采用了两种同步方法用来保护临界区:0. 关中断1. 互斥量关中断void Init_Screen(void){ bool iflag = Begin_Int_Atomic(); s_cons.row = s_cons.col = 0; s_cons.currentAttr = DEFAULT_ATTRIBUTE; Clear_Scree原创 2013-07-19 15:00:01 · 975 阅读 · 0 评论 -
Geek OS 学习之pfat 文件系统
GeekOS中的pfat文件系统。结构如下。假设建立了一个10M的磁盘文件disk.img每个block为512B0 block :引导扇区1 block~n block: fat表,fat表中每个fat项存储的是一个块号,每个fat项4B,共可索引到0~2^32号块。fat表的大小根据磁盘文件而定,计算方式:(磁盘文件大小/512) * 4,fat表的作用是以链表的方式指示文原创 2013-01-22 12:44:07 · 1865 阅读 · 0 评论 -
GeekOS源代码学习(9)project1中Init_DMA与Init_Floppy
生成project1$ startProject project1 ./geekos-0.3.0/src/ project0在当前目录下生成了project1目录再来看一下main.c。/* * GeekOS C code entry point * Copyright (c) 2001,2003,2004 David H. Hovemeyer * Copyright原创 2012-04-22 20:00:58 · 2187 阅读 · 0 评论 -
GeekOS中的进程睡眠
看了GeekOS,才真正理解了进程睡眠是什么意思。在GeekOS中,有一个s_runQueue队列,队列上排的是所有的可运行进程。调度程序Idle会不断的调度s_runQueue中的进程执行,当然Idle它本身也在s_runQueue中。当Idle在s_runQueue中选择了某个进程执行的时候,首先将它移出s_runQueue队列,然后切换到此进程执行。任原创 2013-01-25 22:32:28 · 880 阅读 · 0 评论 -
GeekOS 中的project1
project2要求解析一个elf文件并执行。解析elf很简单,只要读取出elf文件中的程序头即Program Headers。需要知道:1. 总共有几个Program Headers。2. 每个Program Headers在文件中和在内存中的起始地址和界限。3. 程序入口地址。project1的代码中已经给我们定义好了elf head 和program head原创 2013-01-31 19:27:03 · 4870 阅读 · 1 评论 -
GeekOS源代码学习(3)Main函数中Init_Mem初始化内存
这此来分析Main中的第三个函数Init_Mem(bootInfo)。参数bootInfo是在主函数Main中传入的,为struct Boot_Info类型定义在./include/geekos/bootinfo.hstruct Boot_Info { int bootInfoSize; /* size of this struct; for versioning */原创 2012-04-11 19:31:20 · 1542 阅读 · 0 评论 -
GeekOS源代码学习(3)Main函数中Init_BSS() 与Init_Screen()
Main函数的第一个函数Init_BSS()位于./src/geekos/mem.c中/* * Initialize the .bss section of the kernel executable image. */void Init_BSS(void){ extern char BSS_START, BSS_END; /* Fill .bss with ze原创 2012-04-10 22:19:35 · 2262 阅读 · 0 评论 -
GeekOS学习(8)链表操作宏
这种手法,第一次见到。一个宏里面定义了多个内联函数。。不知如何称呼。不过宏只不过是原样替代。其实就是定义了很多个内联函数,但是两函数之间没有打回车,所有函数都在一行上完成。把代码贴上,注释都在代码上了,看一下就懂了。位于./include/geekos/list.h/* * Generic list data type * Copyright (c) 2001,2004原创 2012-04-16 19:32:36 · 662 阅读 · 1 评论 -
GeekOS源代码学习(5)Main函数中Init_Scheduler
来看Main中的下一个函数Init_SchedulerInit_Scheduler函数开启了系统的多任务机制。位于./src/geekos/kthread.cvoid Init_Scheduler(void){ struct Kernel_Thread* mainThread = (struct Kernel_Thread *) KERN_THREAD_OBJ;原创 2012-04-12 19:47:30 · 1605 阅读 · 0 评论 -
GeekOS源代码学习(4)Main函数中Init_CRC和Init_TSS和Init_Interrupts
看Init_CRC32()函数位于./src/geekos/crc32.c/* * This routine writes each crc_table entry exactly once, * with the correct final value. Thus, it is safe to call * even on a table that someone els原创 2012-04-11 21:33:33 · 1622 阅读 · 0 评论 -
GeekOS学习(7)Project0,创建键盘输入进程
终于看完系统的启动代码了!!哈,基本上结构我们也都已经了解了,接下来就开始做project!先来看第一个,project0,要求创建一个内核线程,打印一些信息,并且调用Wait_For_Key来供用户输入字符。先找到Wait_For_Key函数来看看位于./src/geekos/keyboard.c/* * Wait for a keycode to arrive. *原创 2012-04-13 22:41:01 · 2389 阅读 · 0 评论 -
GeekOS源代码学习(6)Main函数中Init_Traps 和 Init_Timer 和 Init_Keyboard
回到Main中,看下一个函数Init_Traps()位于./src/geekos/trap.c/* * Initialize handlers for processor traps. */void Init_Traps(void){ Install_Interrupt_Handler(12, &GPF_Handler); /* stack exception *原创 2012-04-12 20:00:28 · 1947 阅读 · 4 评论 -
GeekOS源代码学习(0)
我使用的是geekos-0.3.0,从这里下载。doc目录下的hacking.pdf有详细的运行说明,只有40页,英文也很简单,稍微仔细的看一下。我们开始建立project0$startProject project0 ./geekos-0.3.0/src这样在当下目录下生成了project0目录$cd ./project0/build$make depend原创 2012-04-07 10:29:44 · 3354 阅读 · 1 评论 -
GeekOS源代码学习(1) fd_boot.asm 和 setup.asm
这两个汇编文件完成的功能和sagalinux中的基本一致,只不过实现的更好一点,增强了一些扩展性。就把代码贴在这里。看看就行,好像我一直是在贴代码。。。。这只算是我自己学习的一个记录吧。。。可能对大家帮助不大。欢迎同学们留言讨论哦。./src/geekos/boot.asm; fd_boot.asm编译出的二进制代码存放在软盘的0号扇区内,BIOS会将此代码复制到0x07c原创 2012-04-07 13:23:44 · 1989 阅读 · 0 评论 -
GeekOS 中的文件系统
以下是构造出文件系统的主角可以看到主要有四个对象构造出了文件系统。以下是调用Read_Fully读取文件的分析。用户通过vfs接口Read_Fully读文件过程如下:1. 调用vfs的Open接口a. vfs的Open接口调用vfs的Do_Open接口b. Do_Open根据参数path,解开prefix,根据prefix返回挂载点对象mountPoin原创 2013-11-26 22:34:11 · 1042 阅读 · 3 评论