system内核(保护模式)
设置根设备、硬盘(将bootsect中写入的0x901FC,0x90080处设备数据备份到“内核数据区”)
规划物理内存
缓冲区(buffer_memory_end)
虚拟盘
do_rd_request与blk_dev[1]挂接
全部初始化为0,rd_init()
返回虚拟盘长度
主内存区(main_memory_start,memory_end)
内存管理(mem_map)
1MB以上内存计数全部置为USED=100
主内存区页面计数全部置0
异常处理
中断服务程序挂接,type=15
trap_init(),异常与IDT挂接
set_trap_gate,dpl=0,只能内核调用
set_system_gate,dpl=3,可以用户调用
将int 0x11~int 0x2F初始化为reserved
int 0x20~int 0x2F为intel不可屏蔽中断
初始化request[32],blk_dev_init()
request[i].dev=-1,当前设备空闲
request[i].next=NULL,当前无请求队列
人机交互外设的中断服务程序挂接,tty_init()
rs_init()
con_init()
设置串行
IDT挂接,type=14
根据tty_table对串行口初始化
设置显示器
设置键盘
IDT挂接,set_intr_gate
取消8259A中断屏蔽
允许IRQ1发送中断信号
禁止键盘工作,允许键盘工作
开机启动时间设置
CMOS,主板上的一个小存储芯片
time_init()采集时间
初始化进程0,sched_init()
系统初始化进程0
进程0的task_struct中的IDT,TSS与GDT挂接
对GDT,task[64]以及进程调度相关的寄存器初始化
TR寄存器指向TSS0
LDTR寄存器指向LDT0
多进程轮转,时钟中断设置
设置8253定时器
设置时钟中断服务程序int 0x20,timer_interrupt()
打开8259A中断屏蔽码
初始化缓冲区buffer_init()
从内核末端及缓冲区末端,方向相对增长,配对做出buffer_head与缓冲块
free_list将buffer_head形成双向循环链表
将hash_table[307]全部置NULL
初始化硬盘
do_hd_request()与blk_dev[7]第3项挂接
hd_interrupt()与IDT中int 0x2E挂接
复位8259A中断位,允许中断
初始化软盘
do_fd_request()与blk_dev[7]第2项挂接
floppy_interrupt()与IDT中int 0x26挂接
复位软盘中断屏蔽位
开启中断
#define sti() asm (“sti”::)
IF = 1
进程0翻转到3特权级
调用move_to_user_mode()
system_call int 0x80 CS:EOP切换到中断服务程序
iret实现翻转到3特权级
模仿中断返回
手动压栈SS/ESP/EFLAGS/CS/EIP,按序
SS=0x17(10111)
11 用户级
1 LDT
10 第3项
@qingdujun
2017-10-24 北京怀柔
references [1]Linux内核设计的艺术