linux 内核进程初始化,Linux内核——system初始化、进程0准备

0818b9ca8b590ca3270a3433284dd417.png

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内核设计的艺术

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值