2
시리얼 포트 사용 확인 시리얼 포트 처리 yes 키보드 버퍼 비움 (키보드 버퍼의 크기가 32 바이트이므로, 32번 반복) – 인터럽트 0x16_00 이용 no (nocom:으로 점프) 두번째 ‘L’출력 플로피 디스크 파라메터 테이블을 읽어온후 트랙당 섹터수에 대한 정보를 읽어옴 (인터럽트 0x1E 이용) second.S 시작 트랙당 섹터수 > 9 no 키보드 입력 타임아웃 처리를 위한 타이머 인터럽트 수정 관련 처리 yes second 로더가 잘 로딩되어 있는지 체크함(버전, “LILO” 문자열 비교) Fisrt.S를 참조해서, 이미지 디스크립터 테이블들을 로딩한다. -1 st 이미지 디스크립터 테이블을 0x9D200에 로딩함 -2 nd 이미지 디스크립터 테이블을 0x9D400에 로딩함 로딩한 디스크립터 테이블 체크섬 확인 Keyboard Translation Table 을 0x9D800에 로딩함 Default Command Line을 0x9D600에 로딩함 로딩한 Default Command Line한 시작 위치의 2 바이트 = 매직 넘버(0xf4f2) ? 디스크에 저장된 Default Command Line의 시작 위치에 0x6b6d를 덮어씀 yes Disable Command Line no dokay: ‘O’ 출력 vgaover = 0x8000 memlim = 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섹터이다.

Second.s 분석 by_송형주

Embed Size (px)

Citation preview

Page 1: Second.s 분석 by_송형주

시리얼 포트 사용 확인 시리얼 포트 처리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섹터이다.

Page 2: Second.s 분석 by_송형주

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