code:start - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki
- 系统引导函数
- _end _edata 是 装入程序的伪变量
- _end : 数据段 + bss段 底地址(KISA5的末尾) + 1
- _edata : 数据段 底地址 + 1
0610 /* ------------------------- */
0611 .globl start, _end, _edata, _main
0612 start:
0614 bne start / loop if restart
0615 reset
- 等待 内存管理机制(虚实地址映照) 关闭
0616
- 重置 总线设备
0617 / initialize systems segments
0618
0619 mov $KISA0,r0
0620 mov $KISD0,r1
0621 mov $200,r4
0622 clr r2
0623 mov $6,r3
0624 1:
0625 mov r2,(r0)+
0626 mov $77406,(r1)+ / 4k rw
0627 add r4,r2
0628 sob r3,1b
0629
- 写入信息到 KISA0/KISD0 - KISA5/KISD5
- KISAi = 200 * (i-1)
- KISDi = 77406
- 读写
- 长度 200 (128)块
0630 / initialize user segment
0631
0632 mov $_end+63.,r2
0633 ash $-6,r2
0634 bic $!1777,r2
0635 mov r2,(r0)+ / ksr = sysu
0636 mov $USIZE-1\<8|6,(r1)+
0637
0638 / initialize io segment
- KISA6 ← _end向下修正为整块(0#进程 PPDA区的起始地址)
- KISD6 置为
- 段大小 = PPDA区大小
- 读写
0639 / set up counts on supervisor segments
0640
0641 mov $IO,(r0)+
0642 mov $77406,(r1)+ / rw 4k
0643
- KISA7 ← IO
- KISD7 = 77406
- 读写
- 长度 200 (128)块
0644 / get a sp and start segmentation
0645
0646 mov $_u+[USIZE*64.],sp
0647 inc SSR0
- 初始化 sp
- _u 定义在 m40.s
- 此处 传入sp的是 相对地址,而 虚实地址映照 在下一句启用
0648
- 启用 虚实地址映照
0649 / clear bss
0650
0651 mov $_edata,r0
0652 1:
0653 clr (r0)+
0654 cmp r0,$_end
0655 blo 1b
0656
- 清零 .bss区
0657 / clear user block
0658
0659 mov $_u,r0
0660 1:
0661 clr (r0)+
0662 cmp r0,$_u+[USIZE*64.]
0663 blo 1b
0664
- 清零 0#进程 PPDA区
0665 / set up previous mode and call main
0666 / on return, enter user mode at 0R
0667
0668 mov $30000,PS
0669 jsr pc,_main
- 置 PS
- 先前态 为 用户态
- 当前态 为 核心态
- 进程优先级 为 0
- 调用 main
0670 mov $170000,-(sp)
- 以下 由 1# 进程 执行 (参看 系统初启)
0671 clr -(sp)
0672 rtt
- 向 堆栈中 构造
- PS = 170000
- 当前态 为 用户态
- 先前态 为 用户态
- 进程优先级 为 0
- PC = 0
0673
- 转入 用户态 PC=0 处 开始运行