GRUB 분석중에 화면출력

devscott의 이미지

#define MSG(x) ( movw x, %si )
notification_string: .string "GRUB"
disk_address_packet:

161 /* print a notification message on the screen */
162 MSG(notification_string)
163
164 /* set %si to the disk address packet */
165 movw disk_address_packet, %si ;source index

162 에서 notification_string 을 %si 로 넘겨주는것만으로 화면에
GRUB 문자가 찍히는 것인지 알고 싶습니다.

165 에서 아무것도 없는 disk_address_packet 을 %si 로 밀어주는 이유는 뭘까요...

두서없이 질문만 드려 죄송합니다..
한말씀만 해주시면 감사하겠습니다.

hongwoo의 이미지

... 저도 궁금합니다.

예전에 해당 코드를 살짝 공부했었는데....

disk_address_packet은 grub install 시점에 채워지는 것 같습니다.

grub이 설치되는 시점의 코드에서 실마리를 찾아보는건 어떨까요 ???

-----------------------------
in the real-time scheduler !

-----------------------------
in the real-time scheduler !

freestyle의 이미지

예전에 gnu grub 0.97 버전 분석한 적이 있어서
그것을 기준으로 답변드리겠습니다.

문자열 시작 주소를 si에 복사하고 message 루틴을 호출합니다.
call은 ret으로 돌아올 수 있다는 것은 아시지요? jmp처럼 한 번 가면 끝이 아니고...

천천히 분석해 보세요~

32	/* Print message string */
33 #define MSG(x)	movw $ABS(x), %si; call message
 
415	/*
416	 * Use BIOS "int 10H Function 0Eh" to write character in teletype mode
417	 *	%ah = 0xe	%al = character
418	 *	%bh = page	%bl = foreground color (graphics modes)
419	 */
420 1:
421	movw	$0x0001, %bx
422	movb	$0xe, %ah
423	int	$0x10		/* display a byte */
424 message:
425	lodsb
426	cmpb	$0, %al
427	jne	1b	/* if not end of string, jmp to display */
428	ret

'disk_address_packet'은 다음 전체를 대표하구요,
disk_address_packet:
sectors:
.long 0
heads:
.long 0
cylinders:
.word 0
sector_start:
.byte 0
head_start:
.byte 0
cylinder_start:
.word 0

요부분은 부팅시 바이오스가 채워주는데,
그것을 Ah 0x42, INT 0x13의 인터럽트 서비스를 사용해 메모리로 불러오는 것입니다.

212 /*
213  * BIOS call "INT 0x13 Function 0x42" to read sectors from disk into memory
214  *	Call with	%ah = 0x42
215  *			%dl = drive number
216  *			%ds:%si = segment:offset of disk address packet
217  *	Return:
218  *			%al = 0x0 on success; err code on failure
219  */
220
221	movb	$0x42, %ah
222	int	$0x13

[참고] http://www.delorie.com/djgpp/doc/rbinter/id/14/7.html

사족. 좋은 어셈블리 레퍼런스 참고하시면서 하세요. ^^
'이게 왜 여기 필요하나?'를 생각하시면서 반복해서 읽어보세요.
너무 하나의 명령에만 집착하지 마시고, 큰 그림으로 보세용.
------------------------
Go to the U-City

----------------------------------------------------------------------------------------
Don't Feed the Trolls!
----------------------------------------------------------------------------------------

hongwoo의 이미지

아.... 제가 잘못 이해하고 있었습니다.
저는 grub 1.96을 봤었는데요..

lba_mode일때 아래와 같이 disk_address_packet을 채워주고 있네요..

    movw    $ABS(disk_address_packet), %si
...
...
    /*  
     * disk address packet :
     *   
     * Offset  Size    Description     (Table 00272)
     * 00h    BYTE    size of packet (10h or 18h)
     * 01h    BYTE    reserved (0) 
     * 02h    WORD    number of blocks to transfer (max 007Fh for Phoenix EDD)
     * 04h    DWORD   -> transfer buffer
     * 08h    QWORD   starting absolute block number
     * (for non-LBA devices, compute as
     * (Cylinder*NumHeads + SelectedHead) * SectorPerTrack +
     * SelectedSector - 1
     * 10h    QWORD   (EDD-3.0, optional) 64-bit flat address of transfer buffer;
     * used if DWORD at 04h is FFFFh:FFFFh
     */
    xorw    %ax, %ax
    movw    %ax, 4(%si)
 
    incw    %ax
    /* set the mode to non-zero */
    movb    %al, -1(%si)
 
    /* the blocks */
    movw    %ax, 2(%si)
 
    /* the size and the reserved byte */
    movw    $0x0010, (%si)
 
    /* the absolute address */
    movl    ABS(kernel_sector), %ebx
    movl    %ebx, 8(%si)
    movl    ABS(kernel_sector + 4), %ebx
    movl    %ebx, 12(%si)
 
    /* the segment of buffer address */
    movw    $GRUB_BOOT_MACHINE_BUFFER_SEG, 6(%si)
...
...

freestyle 님 감사합니다 ^^

-----------------------------
in the real-time scheduler !

-----------------------------
in the real-time scheduler !

devscott의 이미지


친절한 답글감사합니다. 더불어 좋은 지침말씀또한 감사드립니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.