GeekOS源代码学习(2)Main函数
来源:互联网 发布:php mysql增删改查 编辑:程序博客网 时间:2024/06/05 15:42
Main函数代码
/* * GeekOS C code entry point * Copyright (c) 2001,2003,2004 David H. Hovemeyer <daveho@cs.umd.edu> * Copyright (c) 2003, Jeffrey K. Hollingsworth <hollings@cs.umd.edu> * Copyright (c) 2004, Iulian Neamtiu <neamtiu@cs.umd.edu> * $Revision: 1.51 $ * * This is free software. You are permitted to use, * redistribute, and modify it as specified in the file "COPYING". */#include <geekos/bootinfo.h>#include <geekos/string.h>#include <geekos/screen.h>#include <geekos/mem.h>#include <geekos/crc32.h>#include <geekos/tss.h>#include <geekos/int.h>#include <geekos/kthread.h>#include <geekos/trap.h>#include <geekos/timer.h>#include <geekos/keyboard.h>/* * Kernel C code entry point. * Initializes kernel subsystems, mounts filesystems, * and spawns init process. */void Main(struct Boot_Info* bootInfo){ Init_BSS(); Init_Screen(); Init_Mem(bootInfo); Init_CRC32(); Init_TSS(); Init_Interrupts(); Init_Scheduler(); Init_Traps(); Init_Timer(); Init_Keyboard(); Set_Current_Attr(ATTRIB(BLACK, GREEN|BRIGHT)); Print("Welcome to GeekOS!\n"); Set_Current_Attr(ATTRIB(BLACK, GRAY)); TODO("Start a kernel thread to echo pressed keys and print counts"); /* Now this thread is done. */ Exit(0);}
可以看到,Main函数完成了各个模块的初始化,然后显示文本,进入死循环。
先来直接的看一下Set_Current_Attr(),这个函数用于控制终端显示属性。
位于/src/geekos/screen.c
/* * Set the current character attribute. */void Set_Current_Attr(uchar_t attrib){ bool iflag = Begin_Int_Atomic(); s_cons.currentAttr = attrib; End_Int_Atomic(iflag);}
这里有成对出现的Begin_Int_Atomic()和End_Int_Atomic();
用于控制临界区的原子执行,就是在这两个函数之间的代码,运行时,任何其他代码都不能打断它。
更本质的说,就是CPU计数器EIP只能连续的加,不能跳到其他地方。
当然,你要是关机了,那谁也拦不住你。
因为终端属性是一个全局的变量,存储于内存的一个固定空间内,任何内核进程都可以访问它,所以要对它进行保护。
这两个函数会在后面详细研究。
Set_Current_Attr函数中的s_cons是struct Console_State结构,如下
位于./src/geekos/screen.c
struct Console_State { /* Current state information */ int row, col; int saveRow, saveCol; uchar_t currentAttr; /* Working variables for processing escape sequences. */ enum State state; int argList[MAXARGS]; int numArgs;};static struct Console_State s_cons;
最后看一下TODO()这个宏
位于./include/geekos/kassert.h
#define TODO(message)\do {\ Set_Current_Attr(ATTRIB(BLUE, GRAY|BRIGHT));\ Print("Unimplemented feature: %s\n", (message));\ while (1)\;\} while (0)
这个宏的实现使用了do{something}while(0)的手法,很好的降低了宏和外部代码的耦合度。
好,先把最简单的讲完,接下来就是各个初始化函数了,还有最后一个的Exit(0),我在下面分别详细阐述。
- GeekOS源代码学习(2)Main函数
- GeekOS源代码学习(3)Main函数中Init_BSS() 与Init_Screen()
- GeekOS源代码学习(3)Main函数中Init_Mem初始化内存
- GeekOS源代码学习(5)Main函数中Init_Scheduler
- GeekOS源代码学习(4)Main函数中Init_CRC和Init_TSS和Init_Interrupts
- GeekOS源代码学习(6)Main函数中Init_Traps 和 Init_Timer 和 Init_Keyboard
- GeekOS源代码学习(0)
- GeekOS源代码学习(1) fd_boot.asm 和 setup.asm
- GeekOS源代码学习(9)project1中Init_DMA与Init_Floppy
- Gearmand学习2:main函数
- SpringBoot main启动 源代码学习
- C++学习2:main()函数深入学习
- [C学习]Main函数
- main函数学习
- 个人学习:main()函数
- RTMPdump 源代码分析 1: main()函数
- RTMPdump 源代码分析 1: main()函数
- RTMPdump 源代码分析 1: main()函数
- OA中时间库系统设计
- CloudBox uml设计图
- 进阶
- 第八周任务一(2) 友元函数的运算符重载 复数
- Android平台ROM的定制及精简教程
- GeekOS源代码学习(2)Main函数
- USACO: controlling companie
- 添加窗体以及菜单弹出命令
- vb 程序
- Spring+hibernate+springmvc 整合(四)
- java 对文件的读取
- vb
- 如何查找论文资料
- Ajax