一个操作系统的实现(于渊)———前七章总结
来源:互联网 发布: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
- 一个操作系统的实现(于渊)———前七章总结
- 读书笔记-于渊(一个操作系统的实现)一
- 《一个操作系统的实现》总结1——启动流程
- 《一个操作系统的实现》总结2——中断处理
- 一个操作系统的实现——进程
- 《一个操作系统的实现》总结3——系统任务和用户进程
- 关于于渊的一个操作系统的实现第二版学习之bochsrc路径问题
- 一个操作系统的实现——引导扇区的Helloworld
- 关于于渊的一个操作系统的实现第二版学习之第二章bochs裸机启动的练习
- 关于于渊的一个操作系统的实现第二版学习之第三章bochs裸机启动的练习3.1
- 操作系统上机——实现一个简单的shell
- 一个操作系统的实现——笔记1
- 《一个操作系统的实现》——pmtest1.asm详解
- 《一个操作系统的实现》——pmtest1.asm详解
- 《一个操作系统的实现》——pmtest1.asm详解
- 一个操作系统的实现
- 对《一个操作系统的实现》的一些总结理解
- 《一个操作系统的实现》实践总结---写在前面
- 记录自己所学的,帮助自己,希望也能帮助他人!!!
- Android Source code 下载和编译
- Android下打印调试堆栈方法
- python学习——递归函数
- 移动前端开发之viewport的深入理解
- 一个操作系统的实现(于渊)———前七章总结
- RHEL 6.3安装(超级详细图解教程)
- Java中BigInteger详解
- JSP教程【2】JSP基本语法
- Android greenrobot:EventBus详解
- Comparable接口和Comparator接口的使用
- JAVA EE
- Android Service 简要概述
- Java之多线程