⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kernel.c,v

📁 一个小型的操作系统,采用gcc进行开发,几千行的代码,方便初学者学习
💻 C,V
📖 第 1 页 / 共 5 页
字号:
    unsigned int i = 0X0cFFFFFF;    while (i > 0) {	i--;d790 1a790 1    int cnt1 = 0;d799 1d808 3a810 1	VGAPrintStr_8x16(25, 60, rotation[cnt1 % 4], 1);	/* rotation on 25,60 */d816 1a816 1    int cnt1 = 0;d825 1d835 3a837 1	VGAPrintStr_8x16(25, 62, rotation[cnt1 % 4], 1);	/* rotation on 25,62 */d858 4a861 3	if (videoMode == VIDTEXT_80X25) {	    memcpy((char *) 0xb8000, scrtime, strlen(scrtime));	} else {d867 3a874 1d879 4d892 3a894 2	x = rand() % 25;	cmosDelay(5);a895 2	if (x == 0)	    x++;d901 45a950 1#define TASKSTACK 0X9FF00d953 1d964 1a964 1    taskP->sp = TASKSTACK - (taskcnt - 1) * 0x1000;	/* 0x1000 bytes/stack/task */a997 1a1001 1a1004 1a1016 1a1020 1a1023 1a1037 7void delay2(int initval){    unsigned int i = initval;    while (i > 0)	i--;}d1042 32a1073 32    char *buf;    int i, j, k;    buf = (char *) malloc(sizeof(char) * SIZE);    buf[0] = 0;    printf("insert sorting for the following\n");    /* produce random data whose value <100 */    for (i = 1; i < SIZE; i++) {	buf[i] = rand() % 100;	delay2(0xcfffff);	printf("%2d ", buf[i]);    }    printf("\nsorting in progress ...");    for (i = 2; i < SIZE; i++) {	if (buf[i] < buf[i - 1]) {	    buf[0] = buf[i];	    for (j = i - 1; buf[j] > buf[0]; j--) {		buf[j + 1] = buf[j];	    }	    buf[j + 1] = buf[0];	}	printf("\n");	for (k = 0; k < SIZE; k++) {	    printf("%s%2d%s ", k == 0 ? "(" : "", buf[k],		   k == 0 ? ")" : "");	}    }    printf("\nsorting done\n");    for (i = 1; i < SIZE; i++) {	printf("%2d ", buf[i]);    }    printf("\n");    free(buf);d1079 50a1128 50    char *buf;    int i, j, k, low, high, mid, pos;    buf = (char *) malloc(sizeof(char) * SIZE);    buf[0] = 0;    printf("binary insert sorting for the following\n");    /* produce random data which value <100 */    for (i = 1; i < SIZE; i++) {	buf[i] = rand() % 100;	delay2(0xcfffff);	printf("%2d ", buf[i]);    }    printf("\nsorting in progress ...");    for (i = 2; i < SIZE; i++) {	if (buf[i] < buf[i - 1]) {	    buf[0] = buf[i];	    low = 1;	    high = i - 1;	    mid = (low + high) / 2;	    while (low <= high && buf[mid] != buf[0]) {		if (buf[mid] < buf[0])		    low = mid + 1;		else		    high = mid - 1;		mid = (low + high) / 2;	    }	    if (buf[mid] == buf[0])		pos = mid;	    else		pos = high + 1;	    printf("[%2d] ", pos);	    for (j = i - 1; j >= pos; j--) {		buf[j + 1] = buf[j];	    }	    buf[j + 1] = buf[0];	}	printf("\n");	for (k = 0; k < SIZE; k++) {	    printf("%s%2d%s ", k == 0 ? "(" : "", buf[k],		   k == 0 ? ")" : "");	}    }    printf("\nsorting done\n");    for (i = 1; i < SIZE; i++) {	printf("%2d ", buf[i]);    }    free(buf);    printf("\n");a1150 31void banner(){#define WHITE_TXT 0x07		/* white on black text */#define FORWARD 1#define BACKWARD -1    static int row = 1;    static int i = 31 * 2;    static char chs = 'A';    static char *vidmem = (char *) 0xb8000;    static int lr = FORWARD;    while (1) {	if (i < 160 * row && lr == FORWARD) {	    if (i == 49 * 2 * row)		lr = BACKWARD;	    vidmem[i] = '>';	/* chs; */	    vidmem[i + 1] = WHITE_TXT;	    delay2(0x4fffff);	/* delay(); */	    vidmem[i + 1] = 00;	    i += 2;	} else if (i >= 160 * (row - 1) && lr == BACKWARD) {	    if (i == 31 * 2 * row)		lr = FORWARD;	    i -= 2;	    vidmem[i] = '<';	/* chs; */	    vidmem[i + 1] = WHITE_TXT;	    delay2(0x4fffff);	/* delay(); */	    vidmem[i + 1] = 00;	}    }}d1193 38a1230 6void exceptionHandle(int handleID){    printf("\nException Int %02x: %s\n",	   (char) handleID, exceptionMesg[handleID]);    shreg();    __asm__("hlt\n" "iret\n");d1315 1a1315 2    beep(100);    beep(100);d1327 1d1329 1d1333 7@1.7log@remove the console switch function for the unstable reason while in running , console is all directed to the ktask(pid=1)'s task structure, console switch will be made later some day .@text@d1 1a1 1/*d4 1a4 1  (C) Copyright 2003-2004 Snallie Jockeyson <Snallie@@tom.com>d8 10d21 3a23 3  $Id: kernel.c,v 1.6 2004/03/01 12:46:13 oracle Exp oracle $  built   : $Date: 2004/03/01 12:46:13 $  $Revision: 1.6 $d26 1a26 1/*d28 2a29 1call function: void newTask(unsigned int taskEntrance, unsigned int stackAddr, char *taskname, int id);a31 4///////////////////////////// f1~fn scancode: 59~..//////////////////////////d41 1d44 1a44 1static char rcsDate[] = "Built: $Date: 2004/03/01 12:46:13 $";d46 5a50 145#define task1Stackbottom 0x9ff00	// each task's stack has 0x1000 bytes#define task2Stackbottom 0x9ef00#define task3Stackbottom 0x9df00#define task4Stackbottom 0x9cf00extern int eax_reg, ebx_reg, ecx_reg, edx_reg;extern int esi_reg, edi_reg;extern int esp_reg, ebp_reg;extern int eflag_reg, cs_reg, eip_reg;extern int ds_reg, es_reg, ss_reg, fs_reg, gs_reg;extern void initInterrupts();extern void shreg();extern long tickcount;extern void setPITspeed(int hz);extern void setKbdLed(int OnOff);/* keytail keyhead keybuf defined in keyboard.c for keybd interrupt */extern int *keyTail;extern int *keyHead;extern char *keyBuf;#define MAX_TASKS 5#define PROMPT "Snixos# "/* Definition of task table */typedef struct taskItem {    int ax, bx, cx, dx;    int si, di;    int bp, sp;    int flag, ip;    short int cs, ds, es, ss, fs, gs;    unsigned char state;    int ksts;    int cpuTicks;    unsigned int pid;    char taskName[10];    //char stack[0x1000];    char keyBufs[KBSIZE];    int keyHeads;    int keyTails;    int console;    struct taskItem *nextTaskLink;} taskData;static taskData *task, *taskTail;taskData *curTask;int ledOnOff = 0;#define KNLKEYBFLEN 128		// kernel keyboard buffer lengthchar kb[KNLKEYBFLEN];int kp = 0;typedef enum command {    PS, VER, HELP, CLEAR, SHOWREG, CHART, BEEP,    STOP, START, INSORT, BINSORT, FACTOR,    HANOI, MDP, DIR, WRFILE, RDFILE, TYPE, DEL, COPY, D0, REBOOT, BOOT,    DATE,    UNKNOWN,    // token type    ID, NUM} commands;typedef struct cmdItem {    char *cmdstr;    commands cmdType;    char *desc;} cmdTab;#define MAXCMDS 4*6+5cmdTab cmdTabs[MAXCMDS] = {    {"ps", PS, "process status"},    {"ver", VER, "snixos version and release"},    {"help", HELP, "this help page"},    {"clear", CLEAR, "clear screen"},    {"reg", SHOWREG, "show cpu register's value"},    {"chart", CHART, "output ascii table "},    {"beep", BEEP, "make speaker beep for 10ms"},    {"stop", STOP, "stop task n"},    {"start", START, "start task n"},    {"insort", INSORT, "insert sorting "},    {"binsort", BINSORT, "binary insert sorting "},    {"factor", FACTOR, "evaluation for n! , factor n "},    {"hanoi", HANOI, "hanoi recursive prog demo, hanoi n"},    {"dir", DIR, "list directory of FAT file system"},    {"wrfile", WRFILE, "Write a file to FAT file system"},    {"rdfile", RDFILE, "read a file from FAT file system"},    {"type", TYPE, "alias of rdfile"},    {"del", DEL, "delete a feile from RAM disk, syntax: del filename"},    {"copy", COPY, "file copying in RAM disk, syntax: copy src dest"},    {"d0", D0, "ignite exception: divide by zero"},    {"reboot", REBOOT, "reboot computer"},    {"boot", BOOT, "boot snixos"},    {"date", DATE, "cmos date"},    {"mdp", MDP, "memory dumping"},    {"u/a", UNKNOWN, ""}	// must reserved as the last item here};typedef struct tokenRec {    commands tokenType;    struct {	char stringVal[64];	int numVal;    } attribute;} tokenRecord;tokenRecord cmdsRecd;tokenRecord *pcmdsRecd = &cmdsRecd;int cmdIdx = 0;			// command buffer kb[] index for cmdLexcommands cmdLex(tokenRecord * pcmdsRecd);void task1();void task2();void ktask();void initTask();void newTask(unsigned int taskEntrance, unsigned int stackAddr,	     char *taskname, int id, int console);void insertSort();void binsort();long int factors(int);void ver();void hanoi(int n, char from, char via, char to);void banner();extern void dump_heap();void time(int *tm);void mkDemoFile();void doInitInts();static void reboot(void);void timeTask();void motion();void keyDeal(int pid, char *taskName);Date dt;Time tm;int holdConsole;/* data defined in fatfs.hchar *diskspace;int *fat_tab;direntry *dir_tab;*/d52 1a52 1/* kernel start here  */d55 7a61 3    screen_init();    ver();    printf("\ntype help for available commands\n\n%s", PROMPT);d65 51a115 20    initMem();			// init heap memory    initfs();    mkDemoFile();		// create sample files in file system    initTask();			// init task structure, fill header element of task link with dummy data     newTask((unsigned) &ktask, task3Stackbottom, "ktask", 1, 1);    newTask((unsigned) &task1, task1Stackbottom, "task1", 2, 0);    newTask((unsigned) &task2, task2Stackbottom, "task2", 3, 0);    newTask((unsigned) &banner, task4Stackbottom, "banner", 4, 0);    newTask((unsigned) &timeTask, task4Stackbottom - 0x1000, "timetask",	    5, 0);    newTask((unsigned) &motion, task4Stackbottom - 0x1000 * 2, "motion",	    6, 0);    getDate(&dt);    getTime(&tm);    printf("%d-%d-%d %d:%d:%d\n", dt.year + 2000, dt.month, dt.day,	   tm.hour, tm.min, tm.sec);    asm("sti");			// interrupt enabled    while (1);			// waiting for clock interruptd123 7d134 18d186 1d189 12a202 2	long a, temp;	int i, j, memcnt;d204 1a204 1	// display tickcount at top lined209 1a209 1	    *((char *) (0xb8000 + 144 + i * 2 + 1)) = 0x1f;d212 1d215 1a215 1	while (holdConsole == 1 && *keyHead % 254 != *keyTail) {a217 5	    keyAscii = *(keyBuf + *keyHead + 1);	    keyScan = *(keyBuf + *keyHead + 0);	    *keyHead = (*keyHead + 2) % 254;	    /*	    if (keyScan >= 59 && keyScan <= 61) {	// f1~f8 for console switchd219 2a220 3		holdConsole = keyScan - 58;	// process fn hold console	    }	    */d222 6a227 6#ifdef DEBUG		//output scancode while keyboard strokes		printf("%c(%d)", keyAscii, keyScan);#endif		printf("%c", keyAscii);		kb[(kp++) % KNLKEYBFLEN] = keyAscii;d229 33a261 5		//set keyboard led lit		if (keyScan == 69 || keyScan == 58 || keyScan == 70) {		    //69 numLock, 70 ScrollLock, 58 CapsLock		    ledOnOff = (ledOnOff++) % 2;		    setKbdLed(ledOnOff);d263 3a265 1	    }d267 2d270 6a275 3	    if (keyAscii == 0x0a) {		kb[(kp++) % KNLKEYBFLEN] = '\0';	/* fill EOF to keyboard buffer */		kp = 0;		/* reset keyboard buffer pointer */a277 2		//printf("?%d %d %s? ",cmds,pcmdsRecd->tokenType,pcmdsRecd->attribute.stringVal);		//printf("?%d %s?",cmds,cmdTabs[cmds].cmdstr);d301 20a320 6		    ver();		    printf("snixos help routine:\n");		    for (j = 0;			 j < MAXCMDS && strlen(cmdTabs[j].desc) > 0; j++) {			printf("%s: %s\n", cmdTabs[j].cmdstr,			       cmdTabs[j].desc);d324 4a327 1		    screen_init();d330 1a330 1		    asm("pushl $100\t\n" "call beep\t\n");	// beep(100);d346 1a346 1			commands a = cmds;	// save the previous command tokend396 2d425 21a445 1			rdfile(pcmdsRecd->attribute.stringVal);d447 1d460 16a475 1		    printf("Not implemented yet\n");a483 2		    //cli();		    //kernelEntrance();d488 26a513 3		    printf("%d-%d-%d %d:%d:%d\n", dt.year + 2000, dt.month,			   dt.day, tm.hour, tm.min, tm.sec);d521 1a521 1		}		// switch end a524 1d536 20a555 1//cmdLex: get token from command buffer ,return token string, token type, token attributed558 1a558 1#define WDLEN 30		// local token buffer length for lexingd565 2a566 2	i++;			// skip any space     if (isalpha(kb[i])) {	// command or an identifier, {letter}{letter|digit}*d569 2a570 1	} while (kb[i] != EOL && isalnum(kb[i]));	// command or identifier d580 1a580 2	|| ((kb[i] == '-' || kb[i] == '+')	    && isdigit(kb[i + 1]))) {d592 1a592 1	    pcmdsRecd->attribute.numVal = pcmdsRecd->attribute.numVal * 10 + kb[i - 1] - 0x30;	// ascii to integerd604 1a604 1    return -1;			// nothing elsed617 6a622 4    static int cnt1 = 0;    static long a, temp;    static int i;d634 1a634 20	//    printf("A");	while (i < 0X2FFFFF) {	    i++;	}	//	keyDeal(2, "task1");    }}void keyDeal(int pid, char *taskName){    while (holdConsole == pid && *keyHead % 254 != *keyTail) {	char keyAscii, keyScan;	keyAscii = *(keyBuf + *keyHead + 1);	keyScan = *(keyBuf + *keyHead + 0);	*keyHead = (*keyHead + 2) % 254;	if (keyScan >= 59 && keyScan <= 61) {	// f1~f8 for console switch	    holdConsole = keyScan - 58;	// process fn hold console

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -