X86内核启动分析四 打开保护模式之门

保护模式准备活动,上一章是假的准备,这次玩真的了

go_to_protected_mode
    =>realmode_switch_hook(); //关中断
    =>move_kernel_around(); //如果不是大内核,从0x10000挪到0x1000
    =>enable_a20()
    =>reset_coprocessor();
    =>mask_all_interrupts();
    =>setup_idt();
    setup_gdt();
    =>protected_mode_jump(boot_params.hdr.code32_start,
                (u32)&boot_params + (ds() << 4));

对于code32_start,是解压缩内核的起始地址
code32_start:               # here loaders can put a different
                    # start address for 32-bit code.
#ifndef __BIG_KERNEL__
        .long   0x1000      #   0x1000 = default for zImage
#else
        .long   0x100000    # 0x100000 = default for big kernel
#endif

我纵情一跳

    .code16

/*
 * void protected_mode_jump(u32 entrypoint, u32 bootparams);
 */
protected_mode_jump:
    =>movw  $__BOOT_DS, %cx

    movl    %cr0, %edx
    orb $1, %dl            # Protected mode (PE) bit
    movl    %edx, %cr0  //关键是设置cr0的 PE位
    movw    %cx, %ds    //各类段寄存器设置合适的置
    movw    %cx, %es
    movw    %cx, %fs
    movw    %cx, %gs
    movw    %cx, %ss

    # Jump to the 32-bit entrypoint  //我挥一挥手,不带走一片云彩
    .byte   0x66, 0xea      # ljmpl opcode
2:  .long   0           # offset
    .word   __BOOT_CS       # segment

参考
Linux kernel boot process——从实模式(real mode)到保护模式(protected mode),再到分页(paging)
http://blog.csdn.net/bokee/article/details/6900361

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值