设为首页 收藏本站
查看: 588|回复: 0

[经验分享] Linux内核0.00-boot.s源代码分析

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-12-29 08:12:32 | 显示全部楼层 |阅读模式
/*************************************************************************
  2  > File Name: boot.s
  3  > Author: Linpeng1577
  4  > Mail:linpeng1577@gmail.com or 15820224344@163.com
  5  > Created Time: Sun 02 Nov 2014 11:42:53 PM PST
  6  ************************************************************************/

  1 ! boot.s                        !代码源自赵博的《Linux内核完全剖析:基于0.12内核》,
                                    !这里注释是笔者的阅读理解
  2 BOOTSEG = 0x07c0                !这里其实是0x07c00,  在实模式下,80386为了兼容8086而定,
                                    !80386地址会自动左移动4位
  3 SYSSEG  = 0x1000                !这里其实是0x10000,道理同上
  4 SYSLEN  = 17                    !系统扇区17个
  5 entry start                     !入口标签
  6 start:                          !同上
  7         jmpi    go,#BOOTSEG     !启动,在实模式下,jmpi会将CS:EIP自动赋值,cs段指向BOOTSEG
  8 go:     mov     ax,cs           !ax起到temp作用,因为段寄存器之间无法直接赋值
  9         mov     ds,ax           !ds段指向BOOTSEG
10         mov     ss,ax           !ss段指向BOOTSEG
11         mov     sp,#400         !设置临时堆栈指针,其值需大于程序末端并有一定空间
12!加载系统代码
13 load_system:
14         mov     dx,#0x0000
15         mov     cx,#0x0002
16         mov     ax,#SYSSEG
17         mov     es,ax
18         xor     bx,bx
19         mov     ax,#0x200+SYSLEN
20         int     0x13
21         jnc     ok_load
22 die:    jmp     die
23!把内核代码移动到内存0开始处
24 ok_load:
25         cli                     !
26         mov     ax,#SYSSEG      !
27         mov     ds,ax           !
28         xor     ax,ax           !
29         mov     es,ax           !
30         mov     cs,#0x1000      !
31         sub     si,si           !
32         sub     di,di           !
33         rep     movw            !
  18        xor     bx,bx           !
19         mov     ax,#0x200+SYSLEN!
20         int     0x13            !
21         jnc     ok_load         !
22 die:    jmp     die             !
23
24 ok_load:
25         cli
26         mov     ax,#SYSSEG
27         mov     ds,ax
28         xor     ax,ax
29         mov     es,ax
30         mov     cs,#0x1000
31         sub     si,si
32         sub     di,di
33         rep     movw
34
35         mov     ax,#BOOTSEG
36         mov     ds,ax
37         lidt    idt_48          !加载idt表
38         lgdt    gdt_48          !加载gdt表
39
40         mov     ax,#0x0001
41         lmsw    ax              !lmsw指令将CR0保护标志位PE设置为0X0001,即由实模式进入保护模式
42         jmpi    0,8             !历史一跳,这里结束实模式,开启保护模式了,8是段选择符,
                                    !0是偏移地址,
                                    !8的二进制是1000,
                                    !说明是GDT第一段
43
44 gdt:    .word   0,0,0,0         !段描述符0不用
45
46         .word   0x07FF          !段描述符1,X86是小端模式CPU,第一个字是低地址,表示段限长
47         .word   0x0000          !位0..15,16..23,24..31均为0,故段基址是0x00000
48         .word   0x9A00          !代码段
49         .word   0X00C0
50
51         .word   0x07FF          !段描述符2
52         .word   0x0000          !段基址是0x00000,同代码段
53         .word   0x9A00          !数据段
54         .word   0x00C0
55
56 idt_48: .word   0               !idt表长度是0
57         .word   0,0             !lidt指令会加载6字的信息,其中2字的长度值,4字的地址值
58 gdt_48: .word   0x7ff           !gdt表长度0x7ff,十进制就是2048,每个描述符8字节,有256个描述符
59         .word   0x7c00+gdt,0    !加载之前是实模式,所以基地址是段基址0x7c00(注意不是0x07c0,
                                    !地址和数值不要搞混)+gdt标签偏移(汇编标签其实就是段内偏移地址,
                                    !编译器自动赋值)
60 .org 510                        !一个扇区有512字节,在最后一个字节,赋值0xAA55,表示这是一个有效扇区
61         .word   0xAA55          !引导扇区有效标志

<linux/test_boot/boot.s [FORMAT=unix] [TYPE=ASM] [POS=18,21][30%] 07/11/14 - 22:58

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-39376-1-1.html 上篇帖子: Linux内核编程:Linux2.6内核源码解析_进程遍历 下篇帖子: 在contos上进行django与数据库pgsql9.1的数据库连通性时,问题记录 源代码 Linux
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表