1.2 - main 함수 실행 전 과정

이 절 부터 코드 를 분석 할 때 저 는 비교적 상세 하 게 분석 하여 저 같은 수준 이 낮은 친구 들 에 게 적합 합 니 다.
코드http://download.csdn.net/tag/linux0.11%E5%86%85%E6%A0%B8다운로드 하 다.
	.equ SETUPLEN, 4		# nr of setup-sectors
	.equ BOOTSEG, 0x07c0		# original address of boot-sector
	.equ INITSEG, 0x9000		# we move boot here - out of the way
	.equ SETUPSEG, 0x9020		# setup starts here
	.equ SYSSEG, 0x1000		# system loaded at 0x10000 (65536).
	.equ ENDSEG, SYSSEG + SYSSIZE	# where to stop loading

플 로 피 디스크 에서 SETUPPLEN = 4 개의 섹 터 를 읽 도록 설 정 했 습 니 다. BOOTSEG 는 bios 가 복사 한 첫 번 째 섹 터 의 시작 위치 이 고 INITSEG 는 복사 한 것 입 니 다.
메모리 의 첫 번 째 섹 터 코드 는 스스로 자신의 시작 위 치 를 복사 합 니 다. SETUPSEG 는 두 번 째 에서 다섯 번 째 섹 터 (즉 setup. s) 코드 를 메모리 로 복사 합 니 다.
의 시작 위치 입 니 다. SYSSEG 는 커 널 (뒤의 240 개 섹 터) 이 불 러 온 위치 이 고 ENDSEG 커 널 의 끝 위치 입 니 다.
.equ ROOT_DEV, 0x301
	ljmp    $BOOTSEG, $_start
_start:
	mov	$BOOTSEG, %ax
	mov	%ax, %ds
	mov	$INITSEG, %ax
	mov	%ax, %es
	mov	$256, %cx
	sub	%si, %si
	sub	%di, %di
	rep	
	movsw


이 부분 코드 는 '코드 옮 기기', 즉 bios 에 의 해 메모리 에 복사 되 는 코드 를 실현 하고 이 코드 들 에 의 해 스스로 새로운 위치 에 놓 인 다.
두 명령 어 설명:
(1)ljmp $BOOTSEG, $_start
cs 를 BOOTSEG 의 세그먼트 기본 주소 로 설정 하고 ip 를 로 설정 합 니 다.start 의 오프셋 주소, 점프 실현
(2)rep
          movsw
문자열 명령, rep (repeat), movsw (moving string word) 를 옮 겨 DS: SI 가 가리 키 는 주소 의 한 글 자 를 옮 기 는 것 을 실현 합 니 다.
ES: DI 가 가리 키 는 주 소 는 옮 긴 후에 원래 의 내용 은 변 하지 않 지만 원래 의 ES: DI 가 가리 키 는 내용 은 덮어 쓰 이 고 옮 긴 후에 SI 와 DI
다음 이동 할 주소 가 자동 으로 주 소 됩 니 다.
	ljmp	$INITSEG, $go
go:	mov	%cs, %ax

이 두 문장 은 원래 의 코드 세그먼트 에서 복사 가 완 료 된 코드 세그먼트 로 실행 되 는 변 화 를 실현 했다.
load_setup:
	mov	$0x0000, %dx		# drive 0, head 0
	mov	$0x0002, %cx		# sector 2, track 0
	mov	$0x0200, %bx		# address = 512, in INITSEG
	.equ    AX, 0x0200+SETUPLEN
	mov     $AX, %ax		# service 2, nr of sectors
	int	$0x13			# read it
	jnc	ok_load_setup		# ok - continue
	mov	$0x0000, %dx
	mov	$0x0000, %ax		# reset the diskette
	int	$0x13
	jmp	load_setup

설명 하 세 요.
ah: 기능 번호 0x 02 -- 디스크 데 이 터 를 메모리 로 읽 기
al: 읽 어야 할 섹 터 의 수
ch: 트랙 (기둥면) 호의 낮은 8 비트
cl: 시작 섹 터 (0 - 5bit), 트랙 번호 의 높 은 두 자리 (6 - 7bit)
dh: 자기해드 번호, dl: 드라이브 번호 (if it 's hard - disk, set the 7th bit)
es: bx: 목적 주소 입 니 다. 데이터 버퍼 를 가리 키 며 오류 가 발생 하면 CF 플래그 가 설 치 됩 니 다.
이렇게 위의 코드 는 플 로 피 디스크 에서 네 개의 섹 터 의 코드 를 메모리 로 복사 하 는 기능 을 실현 했다.

좋은 웹페이지 즐겨찾기