Upload
iamhjoo-
View
41
Download
0
Embed Size (px)
Citation preview
시리얼 포트 사용 확인 시리얼 포트 처리yes
키보드 버퍼 비움(키보드 버퍼의 크기가 32 바이트이므로,
32번 반복) – 인터럽트 0x16_00 이용
no (nocom:으로 점프)
두번째 ‘L’출력
플로피 디스크 파라메터 테이블을읽어온후 트랙당 섹터수에 대한 정보를
읽어옴 (인터럽트 0x1E 이용)
second.S 시작
트랙당 섹터수 > 9 no
키보드 입력 타임아웃 처리를 위한타이머 인터럽트 수정
관련 처리
yes
second 로더가 잘 로딩되어 있는지체크함(버전, “LILO” 문자열 비교)
Fisrt.S를 참조해서,이미지 디스크립터 테이블들을 로딩한다.
- 1st 이미지 디스크립터 테이블을0x9D200에 로딩함
- 2nd 이미지 디스크립터 테이블을0x9D400에 로딩함
로딩한 디스크립터 테이블 체크섬 확인
Keyboard Translation Table 을0x9D800에 로딩함
Default Command Line을 0x9D600에로딩함
로딩한 Default Command Line한 시작위치의 2 바이트 = 매직 넘버(0xf4f2) ?
디스크에 저장된 Default Command Line의 시작 위치에 0x6b6d를 덮어씀
yes
Disable Command Lineno
dokay: ‘O’ 출력
vgaover = 0x8000memlim = 0
ax = delay 값 (first.S에 저장)first.S의 delay 위치에 0 저장
old_del = delay 값
first.S에서prompt 값이 1인가?
입력 Timeout 설정 = ax값
no
shift,alt,ctrl키가 눌렸는지
timeout?
no
yes
no
yes
yes
ext_dl = 0xFE ?ext_es:ext_si = “LILO” ?
ext_es:ext_bx = NULL String ?
jmp iloop
yes
jmp niloop
no
참고로 3.5인치 2HD 디스켓은트랙당 18섹터이며, 5.25 2DD 디스켓은 트랙당 9섹터이다.
iloop
SS = 0x9000message 파일의 길이가 ‘0’인가?
MBR에서 message파일의 디스크에저장된 위치를 읽어와 처음 섹터를Map영역(0x9D000)에 로딩한다.
보통 사용처럼 그냥 ‘엔터키’를입력한다고 가정->
엔터키만 눌렀으므로,command line은 empty이다.
0x9D200+2에 로드된 1st 이미지디스크립터 테이블에서 ‘name’을
읽어서, cmdline 위치에 복사
cmdline = “linux”
doboot: 로 이동
1st 이미지 디스크립터 테이블에서읽어옴
를 이용하여, 확장메모리 크기를구한다.
램디스크를 할당할 메모리 위치를로 정한 후,
gdt: 의 destination descriptor의 base address를 수정한다.
0x9D200 위치에 1st 이미지 디스크립터테이블에서 를 이용해서, 램디스크를
0x10000 위치에 로딩한후,를
이용하여, gdt의 source address (0x10000)에서, 위에서 수정한 destination
address 위치로, 복사한다.
noramd:
1st 이미지 디스크립터 테이블에서를 Map영역(0x9D000)에
로딩한다.
0x9D000에 로딩된 message 파일의Map 파일을 바탕으로 전체 메시지파일을 0x10000부터 로딩시킨다.
“boot: “ 출력Interactive mode 이면(useinpm == “UI_MAGIC”)
키보드 입력 타임 아웃 설정후키보드 입력 대기
입력된 키의 ascii 값을 keyboard translation table에서 읽어와AL에 저장
First.S의 message 길이 데이터영역 = 0
BX = 메시지 길이 저장
를 불러 메시지 출력
“Loading ” 출력 후, 이미지 네임 “linux” 출력
확장메모리 크기는 최대 16MB로하고, 와
비교해서 램디스크가 메모리에 할당가능한지 파악한다.
Map 섹터가 처음 가리키는, 를0x9D600에 로딩한 후, 처음 2바이트가
DC_MGOFF(0x6b6d)이면, 로딩한 Fallback 섹터를 다시 디스크에 쓴다.
Map 섹터가 두번째 가리키는, 를0x9D600에 로딩한 후, 커맨드 라인을
만들어서, 0x9DA00에 저장한다.(예) ro root BOOT_FILE=/boot/vmlinuz-
2.4.18-4
Map 섹터가 세번째 가리키는, Bootsect 를0x90000에 로딩한 후,
0x90020에 CL_MAGIC(0xa33f), 0x90022에0x2a00을 저장한다. 여기서 0x2a00은
0x9DA00의 커맨드 라인을 접근하기 위한것이다.
Map 섹터가 가리키는 4~7섹터(Setup.S)를SETUPSEG 0x90200부터 로딩한다.
Map 섹터가 가리키는 8섹터이후(실제커널이미지)부터는 SYSSEG
0x10000에 로딩한다.
플로피 모터를 끄고, 수정한 타이머 인터럽트를 원래대로 복구한다.
0x90200으로 점프한다.(Start setup.S)
je optfnd