head.S
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:3k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/boot/head.S
  3.  *
  4.  *  Copyright (C) 1991, 1992, 1993  Linus Torvalds
  5.  *
  6.  *  $Id: head.S,v 1.3 2001/04/20 00:59:28 ak Exp $  
  7.  */
  8. /*
  9.  *  head.S contains the 32-bit startup code.
  10.  *
  11.  * NOTE!!! Startup happens at absolute address 0x00001000, which is also where
  12.  * the page directory will exist. The startup code will be overwritten by
  13.  * the page directory. [According to comments etc elsewhere on a compressed
  14.  * kernel it will end up at 0x1000 + 1Mb I hope so as I assume this. - AC]
  15.  *
  16.  * Page 0 is deliberately kept safe, since System Management Mode code in 
  17.  * laptops may need to access the BIOS data stored there.  This is also
  18.  * useful for future device drivers that either access the BIOS via VM86 
  19.  * mode.
  20.  */
  21. /*
  22.  * High loaded stuff by Hans Lermen & Werner Almesberger, Feb. 1996
  23.  */
  24. .code32
  25. .text
  26. #include <linux/linkage.h>
  27. #include <asm/segment.h>
  28. .code32
  29. .globl startup_32
  30. startup_32:
  31. cld
  32. cli
  33. movl $(__KERNEL_DS),%eax
  34. movl %eax,%ds
  35. movl %eax,%es
  36. movl %eax,%fs
  37. movl %eax,%gs
  38. lss SYMBOL_NAME(stack_start),%esp
  39. xorl %eax,%eax
  40. 1: incl %eax # check that A20 really IS enabled
  41. movl %eax,0x000000 # loop forever if it isn't
  42. cmpl %eax,0x100000
  43. je 1b
  44. /*
  45.  * Initialize eflags.  Some BIOS's leave bits like NT set.  This would
  46.  * confuse the debugger if this code is traced.
  47.  * XXX - best to initialize before switching to protected mode.
  48.  */
  49. pushl $0
  50. popfl
  51. /*
  52.  * Clear BSS
  53.  */
  54. xorl %eax,%eax
  55. movl $ SYMBOL_NAME(_edata),%edi
  56. movl $ SYMBOL_NAME(_end),%ecx
  57. subl %edi,%ecx
  58. cld
  59. rep
  60. stosb
  61. /*
  62.  * Do the decompression, and jump to the new kernel..
  63.  */
  64. subl $16,%esp # place for structure on the stack
  65. movl %esp,%eax
  66. pushl %esi # real mode pointer as second arg
  67. pushl %eax # address of structure as first arg
  68. call SYMBOL_NAME(decompress_kernel)
  69. orl  %eax,%eax 
  70. jnz  3f
  71. addl $8,%esp
  72. xorl %ebx,%ebx
  73. ljmp $(__KERNEL_CS), $0x100000
  74. /*
  75.  * We come here, if we were loaded high.
  76.  * We need to move the move-in-place routine down to 0x1000
  77.  * and then start it with the buffer addresses in registers,
  78.  * which we got from the stack.
  79.  */
  80. 3:
  81. movl %esi,%ebx
  82. movl $move_routine_start,%esi
  83. movl $0x1000,%edi
  84. movl $move_routine_end,%ecx
  85. subl %esi,%ecx
  86. addl $3,%ecx
  87. shrl $2,%ecx
  88. cld
  89. rep
  90. movsl
  91. popl %esi # discard the address
  92. addl $4,%esp # real mode pointer
  93. popl %esi # low_buffer_start
  94. popl %ecx # lcount
  95. popl %edx # high_buffer_start
  96. popl %eax # hcount
  97. movl $0x100000,%edi
  98. cli # make sure we don't get interrupted
  99. ljmp $(__KERNEL_CS), $0x1000 # and jump to the move routine
  100. /*
  101.  * Routine (template) for moving the decompressed kernel in place,
  102.  * if we were high loaded. This _must_ PIC-code !
  103.  */
  104. move_routine_start:
  105. movl %ecx,%ebp
  106. shrl $2,%ecx
  107. rep
  108. movsl
  109. movl %ebp,%ecx
  110. andl $3,%ecx
  111. rep
  112. movsb
  113. movl %edx,%esi
  114. movl %eax,%ecx # NOTE: rep movsb won't move if %ecx == 0
  115. addl $3,%ecx
  116. shrl $2,%ecx
  117. rep
  118. movsl
  119. movl %ebx,%esi # Restore setup pointer
  120. xorl %ebx,%ebx
  121. ljmp $(__KERNEL_CS), $0x100000
  122. move_routine_end:
  123. /* Stack for uncompression */ 
  124. .align 32
  125. user_stack:  
  126. .fill 4096,4,0
  127. stack_start:
  128. .long user_stack+4096
  129. .word __KERNEL_DS