学习目标——能改操作系统

1.什么是操作系统

image

学习过程中的四个实验:

扩展线程

实现操作系统调用

实现虚存管理

扩展文件系统

Learn OS concepts by coding them

2.操作系统引导

开机界面的背后发生了什么?

|
计算机是如何工作的?

图灵机——>通用图灵机——>冯诺依曼

打开电源之后第一条指令是什么

读入内存—>初始化数据

IP=?
上电:IP=0x0000

0磁道0扇区是操作系统的引导扇区

(1)bootsect.s

引导扇区代码:bootsect.s(汇编代码)——将磁盘上的操作系统读到内存里

(2)setup.s

完成OS启动前的设置

start:mov ax,#INITSEG   mov ds,ax   mov ah,#0x03
 xor bh,bh  int 0x10//取光标位置dx  mov [0],dx
 mov ah,#0x88  int 0x15  mov [2],ax...
 cli
 mov ax,#0x0000  cld
do_move: mov es,ax  add ax,#0x1000
 cmp ax,#0x9000  jz  end_move
 mov ds,ax  sub di,di
 sub si,si
 mov cx,#0x8000
 rep
 movsw
 jmp do_move

挪动了操作系统 启动保护模式

(3)head.s(system中第一个模块)

Makefile->产生系统镜像(image)->产生桌面

stratup_32:  movl $0x10,%eax  mov %ax , %ds mov %ax,%es
    mov %as,%fs  mov %as,%gs
    lss _stack_start,%esp
    call setup_idt
    call setup_gdt
    xorl %eax,%eax

从汇编到c函数

after_page_tables:
    pushl $0  pushl $0 pushl $0 pushl $L6
    push $_main jmp set_paging
L6: jmp L6
setup_paging:设置页表 ret

(4)main.c (c函数)

初始化内存、中断、设备、时钟

void main(){
    mem_init();
    trap_init();
    blk_dev_init();
    chr_dev_init();
    tty_init();
    time_init();
    sched_init();
    buffer_init();
    hd_init();
    floppy_init();
    sti();
    move_to_user_mode();
    if(!fork())
        {
            init();
        }
}

补充——汇编的分类:

as86汇编

GNU as汇编

内嵌汇编

3.操作系统的接口

上层软件如何通过接口来获得操作系统的相关信息的呢?

shell命令输入之后

命令是用C语言编写的程序

图形界面就是一个包括画图的C程序

操作系统接口就是一些函数的调用,这些函数又由系统提供,所以称为系统调用。(system_call)

POSIX:IEEE制定的标准族

4.系统调用的实现

系统调用提供一些进入内核的手段

为什么在同一块内存中不能jmp mov?

出于安全性的考虑

操作系统怎样实现不能jmp和mov?

操作系统将内核程序和用户程序隔离

内核态可以访问任何数据,用户态不能访问内核数据

用CS的最低两位(CPL)来表示0是内核态,3是用户态

系统调用的核心

(1)用户程序中包含一段包含int指令的代码

(2)操作系统写中断处理,获取想调用程序的编号

(3)操作系统根据编号执行相应代码

5.操作系统历史

(1)IBSYS

批处理操作系统(Batch system)——监控系统

(2)OS/360

切换和调度成为核心

(3)MULTICS——计算机进入多个领域,使用人数增加

核心仍是任务切换,有了分时系统的概念,资源复用的思想

(4)Unix

一个简化的MULTICS

(5)Linux

开源、群体智慧

操作系统的核心视图

实现操作系统的多进程图谱

实现操作系统的文件操作视图