code:start - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki

Source

  • 系统引导函数
  • _end _edata 是 装入程序的伪变量
    • _end : 数据段 + bss段 底地址(KISA5的末尾) + 1
    • _edata : 数据段 底地址 + 1

0610 /* ------------------------- */

0611 .globl start, _end, _edata, _main

0612 start:

0613     bit $1,SSR0

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

  • 写入信息到 KISA0/KISD0 - KISA5/KISD5
    • KISAi = 200 * (i-1)
    • KISDi = 77406
      • 读写
      • 长度 200 (128)块
0629

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

  • KISA6 ← _end向下修正为整块(0#进程 PPDA区的起始地址)
  • KISD6 置为
    • 段大小 = PPDA区大小
    • 读写
0638 / initialize io segment

0639 / set up counts on supervisor segments

0640

0641     mov $IO,(r0)+

0642     mov $77406,(r1)+ / rw 4k

  • KISA7 ← IO
  • KISD7 = 77406
    • 读写
    • 长度 200 (128)块
0643

0644 / get a sp and start segmentation

0645

0646     mov $_u+[USIZE*64.],sp

  • 初始化 sp
  • _u 定义在 m40.s
  • 此处 传入sp的是 相对地址,而 虚实地址映照 在下一句启用
0647     inc SSR0
  • 启用 虚实地址映照
0648

0649 / clear bss

0650

0651     mov $_edata,r0

0652 1:

0653     clr (r0)+

0654     cmp r0,$_end

0655     blo 1b

0656

0657 / clear user block

0658

0659     mov $_u,r0

0660 1:

0661     clr (r0)+

0662     cmp r0,$_u+[USIZE*64.]

0663     blo 1b

  • 清零 0#进程 PPDA区
0664

0665 / set up previous mode and call main

0666 / on return, enter user mode at 0R

0667

0668     mov $30000,PS

  • 置 PS
0669     jsr pc,_main
0670     mov $170000,-(sp)

0671     clr -(sp)

  • 向 堆栈中 构造
    • PS = 170000
    • PC = 0
0672     rtt
  • 转入 用户态 PC=0 处 开始运行
0673

Ref

⚠️ **GitHub.com Fallback** ⚠️