阅 读 文 章

linux内核原代码head.s部分的注释

[来源:网上转载 (http://www.chinaunix.net) | 作者:网友(不详) | 时间:2007-07-07 | 浏览:人次 ]

  /*
  * head.s contains the 32-bit startup code.
  *
  * NOTE!!! Startup happens at absolute address 0x00000000, which is also where
  * the page directory will exist. The startup code will be overwritten by
  * the page directory.
  */
  .text
  .globl _idt,_gdt,_pg_dir
  _pg_dir:
  startup_32:
  movl $0x10,%eax @@ds,es,fs,gs指向内核数据段
  mov %ax,%ds
  mov %ax,%es
  mov %ax,%fs
  mov %ax,%gs
  lss _stack_start,%esp @@ds送ss esp 指向stack_start (在sched.c定义)
   @@进入保护模式的堆栈段的第一次变化,很奇怪
   @@为什么堆栈段也可正向增涨?
  call setup_idt
  call setup_gdt
  movl $0x10,%eax # reload all the segment registers
  mov %ax,%ds # after changing gdt. CS was already
  mov %ax,%es # reloaded in 'setup_gdt' @@ 有reload??
  mov %ax,%fs
  mov %ax,%gs
  lss _stack_start,%esp
  xorl %eax,%eax
  1: incl %eax # check that A20 really IS enabled
  movl %eax,0x000000
  cmpl %eax,0x100000 @@这是怎么测的 0x100000为什么值,
   @@明白,a20 not
  enable,0x000000就是0x100000
  je 1b
  movl %cr0,%eax # check math chip
  andl $0x80000011,%eax # Save PG,ET,PE
  testl $0x10,%eax
  jne 1f # ET is set - 387 is present
  orl $4,%eax # else set emulate bit
  1: movl %eax,%cr0
  jmp after_page_tables @@注意,用jmp 不call,不返回
  /*
  * setup_idt
  *
  * sets up a idt with 256 entries pointing to
  * ignore_int, interrupt gates. It then loads
  * idt. Everything that wants to install itself
  * in the idt-table may do so themselves. Interrupts
  * are enabled elsewhere, when we can be relatively
  * sure everything is ok. This routine will be over-
  * written by the page tables.
  */
  setup_idt:
  lea ignore_int,%edx
  movl $0x00080000,%eax
  movw %dx,%ax /* selector = 0x0008 = cs */
  movw $0x8E00,%dx /* interrupt gate - dpl=0, present */
   @@ ignore_int 低16-->ax 高16-->edx高字

@@ 8e00-->dx 8-->eax高字
  lea _idt,%edi
  mov $256,%ecx
  rp_sidt:
  movl %eax,(%edi)
  movl %edx,4(%edi)
  addl $8,%edi
  dec %ecx
  jne rp_sidt
  lidt idt_descr
  ret

/*
  * setup_gdt
  *
  * This routines sets up a new gdt and loads it.
  * Only two entries are currently built, the same
  * ones that were built in init.s. The routine
  * is VERY complicated at two whole lines, so this

论坛热门帖子: [lch203] 写得蛮好的linux学习笔记(10-21)
[黑马制造] 学习java的30个目标(10-19)
[笑傲股林] 做测试半年了,有点迷茫,应该再学些什么提高自己的测试水平和测试能力呢?(10-19)
[udp8589] 大家用google的来吱一声? 用百度的~~也来报道下?(10-18)
[沂偌掳兆] 本人总结的一些认为C++比较经典的书籍,希望对大家有用(10-18)
TAG标签: 部分 注释 代码 %eax the movl @@ is mov %ax that page

最新评论 共有0位网友发表了评论

发表评论

评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名:(注册)
密码:
验证码:
匿名发表

网站地图友情连接交流论坛网站投稿广告服务联系我们留言本站长统计
Some rights reserved: www.chmhome.com, 鄂ICP备07010232号 E-mail:chinakafei@live.com,QQ:552766
中国咖啡技术网(Chmhome):国外编程技术书籍,中文编程手册,经典编程文章,交流技术,技术软件下载,计算机论文,毕业论文.