Skip to main content
  1. Posts/

geek OS project 0 (下)

·2 mins
Note: This article is available in Chinese only. 本文暂无英文版本。 View original

现在我们环境已经搭好了,参考 geekos实验环境的搭建

在main.c中新加个函数,命名为projecto,函数的代码如下:

 1/*
 2 * GeekOS C code entry point
 3 * Copyright (c) 2001,2003,2004 David H. Hovemeyer <daveho@cs.umd.edu>
 4 * Copyright (c) 2003, Jeffrey K. Hollingsworth <hollings@cs.umd.edu>
 5 * Copyright (c) 2004, Iulian Neamtiu <neamtiu@cs.umd.edu>
 6 * $Revision: 1.51 $
 7 *
 8 * This is free software.  You are permitted to use,
 9 * redistribute, and modify it as specified in the file "COPYING".
10 */
11
12#include <geekos/bootinfo.h>
13#include <geekos/string.h>
14#include <geekos/screen.h>
15#include <geekos/mem.h>
16#include <geekos/crc32.h>
17#include <geekos/tss.h>
18#include <geekos/int.h>
19#include <geekos/kthread.h>
20#include <geekos/trap.h>
21#include <geekos/timer.h>
22#include <geekos/keyboard.h>
23
24//added by 111qqz for project 0
25void project0()
26{
27    Print("To Exit hit Ctrl + d.\n");
28    Print("Hello from 111qqz !\n");
29    Print("This is a test of project0 !\n");
30
31
32
33    Keycode keycode;
34    while(1)
35    {
36        if( Read_Key(&keycode) )    //读取键盘按键状态
37        {
38            if(!( (keycode & KEY_SPECIAL_FLAG) || (keycode & KEY_RELEASE_FLAG)) ) //只处理非特殊按键的按下事件
39            {
40                 int asciiCode = keycode &  0xff;    //低8位为Ascii码
41
42                if( (keycode & KEY_CTRL_FLAG)==KEY_CTRL_FLAG  &&  asciiCode=='d')    //按下Ctrl键
43                {
44                    Print("\n---------BYE!--------\n");
45                    Exit(1);
46                }else
47                {
48                    Print("%c",(asciiCode=='\r') ? '\n' : asciiCode);
49                }
50            }
51        }
52    }
53}
54
55
56/*
57 * Kernel C code entry point.
58 * Initializes kernel subsystems, mounts filesystems,
59 * and spawns init process.
60 */
61void Main(struct Boot_Info* bootInfo)
62{
63    Init_BSS();
64    Init_Screen();
65    Init_Mem(bootInfo);
66    Init_CRC32();
67    Init_TSS();
68    Init_Interrupts();
69    Init_Scheduler();
70    Init_Traps();
71    Init_Timer();
72    Init_Keyboard();
73
74
75    Set_Current_Attr(ATTRIB(BLACK, GREEN|BRIGHT));
76    Print("Welcome 111qqz to GeekOS!\n");
77    Set_Current_Attr(ATTRIB(BLACK, GRAY));
78
79
80
81   // TODO("Start a kernel thread to echo pressed keys and print counts");
82    //added by 111qqz for project 0
83          struct Kernel_Thread *thread;
84    thread = Start_Kernel_Thread(&project0,0,PRIORITY_NORMAL,false);
85      // added for project 0 end
86
87
88    /* Now this thread is done. */
89    Exit(0);
90}

再修改Main函数,将TODO(“…..这一行替换为以下代码:

struct Kernel_Thread *thread; thread = Start_Kernel_Thread(&project0,0,PRIORITY_NORMAL,false);

替换的意思是,要把TODO那一行注释掉。。。

TODO语句的定义在src/project0/include/geekos/kassert.h中

1#define TODO(message)					\
2do {							\
3    Set_Current_Attr(ATTRIB(BLUE, GRAY|BRIGHT));	\
4    Print("Unimplemented feature: %s\n", (message));	\
5    while (1)						\
6	;						\
7} while (0)

可以看到,这是一个宏打印错误提示后,就直接进入一个死循环中,也就是执行到TODO之后程序就不会继续往下运行了,所以要继续进行调试project0就必须删除或者注释掉那条TODO。

保存代码,按上一篇文章中的方法编译,并在bochs中引导系统。 运行效果如下图所示:

参考博客:参考博客1 参考博客2

Related

linux下的对拍写法

·1 min
1首先先生成三个程序: 2$ g++ a+b.cpp -o a+b 3$ g++ a+b2.cpp -o a+b2 4$ g++ make.cpp -o make 5然后生成数据 6$ ./make > in.txt 7然后运行两个程序 8$ ./a+b < in.txt > out.txt 9$ ./a+b2 < in.txt > ans.txt 10最后对拍 11$ diff out.txt ans.txt 12输出的结果可以man diff查阅一下相关文档中关于输出含义的内容 13注:上面的$都是命令提示符,复制粘贴时不需要

tmp

·1 min
1#include <iostream> 2#include <vector> 3#include <cstring> 4#include <set> 5#include <algorithm> 6#include <cstdio> 7 8using namespace std; 9const int N=1E4+7; 10int n,k,Q; 11int siz; 12int pos[N]; 13int sum[N]; 14int dis[N]; 15bool vis[N]; 16vector < pair<int,int> > edge[N]; 17 18struct node 19{ 20 int l,r; 21 int id; 22 23 bool operator < (node b)const 24 { 25 if (pos[l]==pos[b.l]) return r<b.r; 26 return pos[l]<pos[b.l]; 27 } 28 29 30}q[N]; 31 32 33void dfs( int u,int val) 34{ 35 vis[u] = true; 36 dis[u+1] = val; 37 38 int Siz = edge[u].size(); 39 for ( int i = 0 ; i < Siz ; i ++) 40 { 41 int v = edge[u][i].first; 42 43 if (!vis[v]) 44 { 45 dfs(v,val+edge[u][i].second); 46 } 47 } 48} 49int main() 50{ 51 52 freopen("in.txt","r",stdin); 53 siz = 100; 54 for ( int i = 0 ; i < 10000 ; i++) pos[i] = i/siz; 55 while (scanf("%d %d %d",&n,&k,&Q)!=EOF) 56 { 57 memset(vis,false,sizeof(vis)); 58 memset(dis,0,sizeof(dis)); 59 memset(sum,0,sizeof(sum)); 60 for ( int i = 1 ;i < n ; i++) 61 { 62 int u = i; 63 int v = i/k; 64 edge[u].push_back(make_pair(v,i)); 65 edge[v].push_back(make_pair(u,i)); 66 } 67 68 for ( int i = 1 ;i <= Q ; i++) 69 { 70 scanf("%d %d",&q[i].l,&q[i].r); 71 q[i].id = i; 72 } 73 74 sort(q+1,q+Q+1); 75 76 dfs(0,0); 77 for ( int i = 1 ; i <= n ; i++) sum[i] = sum[i-1]+dis[i]; 78 } 79}

NYOJ 505 因子和阶乘

·1 min
http://acm.nyist.net/JudgeOnline/problem.php?pid=509 题意:中文题目。。。 思路:快速筛即可。。。妈蛋。。。这个oj不能用宏编译==。。。然后一直TLE…去掉了就好了。。sad