chenyiliang
chenyiliang

Reputation: 29

what is meant "seg fs" in the linux kernel bootsect.s file

When I reading the early Linux kernel code, I encountered a problem in boot/bootsect.s that was difficult to understanding."seg fs" ,What is it doing? If I want to change to AT&T's assembly syntax, How should I do!

    go: mov ax,cs       
    mov dx,#0x4000-12   ! 0x4000 is arbitrary value >= length of
                ! bootsect + length of setup + room for stack
                ! 12 is disk parm size

! bde - changed 0xff00 to 0x4000 to use debugger at 0x6400 up (bde).  We
! wouldn't have to worry about this if we checked the top of memory.  Also
! my BIOS can be configured to put the wini drive tables in high memory
! instead of in the vector table.  The old stack might have clobbered the
! drive table.

    mov ds,ax
    mov es,ax
    mov ss,ax       ! put stack at INITSEG:0x4000-12.
    mov sp,dx
/*
 *  Many BIOS's default disk parameter tables will not 
 *  recognize multi-sector reads beyond the maximum sector number
 *  specified in the default diskette parameter tables - this may
 *  mean 7 sectors in some cases.
 *
 *  Since single sector reads are slow and out of the question,
 *  we must take care of this by creating new parameter tables
 *  (for the first disk) in RAM.  We will set the maximum sector
 *  count to 18 - the most we will encounter on an HD 1.44.  
 *
 *  High doesn't hurt.  Low does.
 *
 *  Segments are as follows: ds=es=ss=cs - INITSEG,
 *      fs = 0, gs = parameter table segment
 */

    push    #0
    pop fs
    mov bx,#0x78        ! fs:bx is parameter table address
    seg fs
    lgs si,(bx)         ! gs:si is source

    mov di,dx           ! es:di is destination
    mov cx,#6           ! copy 12 bytes
    cld

    rep
    seg gs
    movsw

    mov di,dx
    movb    4(di),*18       ! patch sector count

    seg fs
    mov (bx),di
    seg fs
    mov 2(bx),es

    mov ax,cs
    mov fs,ax
    mov gs,ax

    xor ah,ah           ! reset FDC 
    xor dl,dl
    int     0x13    

Upvotes: 3

Views: 457

Answers (2)

chenyiliang
chenyiliang

Reputation: 29

who can tell me to change this to be correct or not? !

__go:   
movw    %cs         ,   %ax
movw    $0x4000-12  ,   %dx
movw    %ax         ,   %ds
movw    %ax         ,   %es
movw    %ax         ,   %ss
movw    %dx         ,   %sp
pushw   $0x0000
popw    %fs
movw    $0x0078     ,   %bx
lgs     %fs:(%bx)   ,   %si
movw    %dx         ,   %di
movw    $0x0006     ,   %cx
cld
rep
movw    %dx         ,   %di
movw    $0x12       ,   0x0004(%di)
movw    %di         ,   %fs:(%bx)
movw    %es         ,   %fs:0x0002(%bx)
movw    %cs         ,   %ax
movw    %ax         ,   %fs
movw    %ax         ,   %gs
xorb    %ah         ,   %ah
xorb    %dl         ,   %dl
int     $0x13

Upvotes: -1

Peter Cordes
Peter Cordes

Reputation: 363980

I assume it assembles as a fs prefix for the next instruction. That would match the comments, and is the only thing that makes sense.

Should be easy enough to build it and disassemble (into AT&T syntax if you want).

In AT&T syntax, you can just use fs as a prefix to other mnemonics.

fs movsw

assembles to this (in 64-bit mode. 16-bit mode would skip the 66 operand-size prefix).

0000000000000000 <.text>:
   0:   64 66 a5                movsw  %fs:(%rsi),%es:(%rdi)

Upvotes: 4

Related Questions