一个操作系统的实现(于渊)———前七章总结

来源:互联网 发布:linux tgz 安装 编辑:程序博客网 时间:2024/06/02 02:11

        在前七章这个操作系统大概实现了用户进程、系统任务的分层,实现了TTY和键盘,和一些简单的系统调用,具体现象是在bochs上可实现键盘的输入和特殊输入(换行),

代码具体逻辑如下:

1.首先看看kernel/main.c的kernel_main.c函数

PUBLIC int kernel_main(){disp_str("-----\"kernel_main\" begins-----\n");TASK*p_task= task_table;PROCESS*p_proc= proc_table;char*p_task_stack= task_stack + STACK_SIZE_TOTAL;u16selector_ldt= SELECTOR_LDT_FIRST;int i;        u8              privilege;        u8              rpl;        int             eflags;for (i = 0; i < NR_TASKS+NR_PROCS; i++) {                if (i < NR_TASKS) {     /* 任务 */                        p_task    = task_table + i;                        privilege = PRIVILEGE_TASK;                        rpl       = RPL_TASK;                        eflags    = 0x1202; /* IF=1, IOPL=1, bit 2 is always 1 */                }                else {                  /* 用户进程 */                        p_task    = user_proc_table + (i - NR_TASKS);                        privilege = PRIVILEGE_USER;                        rpl       = RPL_USER;                        eflags    = 0x202; /* IF=1, bit 2 is always 1 */                }strcpy(p_proc->p_name, p_task->name);// name of the processp_proc->pid = i;// pidp_proc->ldt_sel = selector_ldt;memcpy(&p_proc->ldts[0], &gdt[SELECTOR_KERNEL_CS >> 3],       sizeof(DESCRIPTOR));p_proc->ldts[0].attr1 = DA_C | privilege << 5;memcpy(&p_proc->ldts[1], &gdt[SELECTOR_KERNEL_DS >> 3],       sizeof(DESCRIPTOR));p_proc->ldts[1].attr1 = DA_DRW | privilege << 5;p_proc->regs.cs= (0 & SA_RPL_MASK & SA_TI_MASK) | SA_TIL | rpl;p_proc->regs.ds= (8 & SA_RPL_MASK & SA_TI_MASK) | SA_TIL | rpl;p_proc->regs.es= (8 & SA_RPL_MASK & SA_TI_MASK) | SA_TIL | rpl;p_proc->regs.fs= (8 & SA_RPL_MASK & SA_TI_MASK) | SA_TIL | rpl;p_proc->regs.ss= (8 & SA_RPL_MASK & SA_TI_MASK) | SA_TIL | rpl;p_proc->regs.gs= (SELECTOR_KERNEL_GS & SA_RPL_MASK) | rpl;p_proc->regs.eip = (u32)p_task->initial_eip;p_proc->regs.esp = (u32)p_task_stack;p_proc->regs.eflags = eflags;p_proc->nr_tty = 0;p_task_stack -= p_task->stacksize;p_proc++;p_task++;selector_ldt += 1 << 3;}proc_table[0].ticks = proc_table[0].priority = 15;proc_table[1].ticks = proc_table[1].priority =  5;proc_table[2].ticks = proc_table[2].priority =  5;proc_table[3].ticks = proc_table[3].priority =  5;        proc_table[1].nr_tty = 0;        proc_table[2].nr_tty = 1;        proc_table[3].nr_tty = 1;k_reenter = 0;ticks = 0;p_proc_ready= proc_table;init_clock();        init_keyboard();restart();while(1){}}
这个函数在kernel/kernel.ASM中实现跳转

jmpkernel_main
这里也实现了从汇编语言到C语言的跳转,在这个跳转之前,CPU都是在执行我们用汇编写的部分。

而在kernel_main()函数里最后一句,我们的CPU停在while循环。那么接下来都是我们的CPU发生中断,然后执行其他程序了,这里也是操作系统一直干的事,可以理解为他一直在等待中断的发生。


2.接下来是中断。。。。



0 0