[OS64位][017]源码阅读:程序4-1 内核执行头程序head.S->内核主程序 main.c

学习笔记

使用教材(配书源码以及使用方法)
《一个64位操作系统的设计与实现》
http://www.ituring.com.cn/book/2450
https://www.jianshu.com/p/28f9713a9171

源码结构

  • 配书代码包:第4章\程序\程序4-1
程序4-1 源码结构

命令行操作

[anno@localhost bootloader]$ make
nasm boot.asm -o boot.bin
nasm loader.asm -o loader.bin

[anno@localhost kernel]$ make
gcc -E  head.S > head.s
as --64 -o head.o head.s
gcc  -mcmodel=large -fno-builtin -m64 -c main.c
ld -b elf64-x86-64 -o system head.o main.o -T Kernel.lds 
objcopy -I elf64-x86-64 -S -R ".eh_frame" -R ".comment" -O binary system kernel.bin


[anno@localhost 4-1]$ sudo mount boot.img media -t vfat -o loop
[anno@localhost 4-1]$ sudo cp bootloader/loader.bin media
[anno@localhost 4-1]$ sync
[anno@localhost 4-1]$ sudo cp bootloader/boot.bin media
[anno@localhost 4-1]$ sync
[anno@localhost 4-1]$ sudo cp kernel/kernel.bin media
[anno@localhost 4-1]$ sync

[anno@localhost 4-1]$  bochs -f ./bochsrc

调试过程

内存示意图

死循环 rip 停住不变

源码阅读

内核执行头程序 head.S

  • 内核执行头程序head.S: 设置寄存器、GDTR、IDTR、CR3,跳转到内核主程序;

线性地址 与 物理地址

  • 内核层的起始线性地址0x ffff 8000 0000 0000对应着物理地址0
  • 内核程序的起始线性地址位于0x ffff 8000 0000 0000 + 0x 10 0000

设置 四级页表 PML4 - PDPT - PDT - PT

//=======   init page
.align 8

.org    0x1000

__PML4E:

    .quad   0x102007
    .fill   255,8,0
    .quad   0x102007
    .fill   255,8,0

.org    0x2000

__PDPTE:
    
    .quad   0x103003
    .fill   511,8,0

.org    0x3000

__PDE:

    .quad   0x000083    
    .quad   0x200083
    .quad   0x400083
    .quad   0x600083
    .quad   0x800083
    .quad   0xe0000083      /*0x a00000*/
    .quad   0xe0200083
    .quad   0xe0400083
    .quad   0xe0600083      /*0x1000000*/
    .quad   0xe0800083
    .quad   0xe0a00083
    .quad   0xe0c00083
    .quad   0xe0e00083
    .fill   499,8,0
  • 使用2MB大小的物理页,页表结构参考Linear-Address Translation to a 2-MByte Page using 4-Level Paging

设置CR3

//=======   load    cr3

    movq    $0x101000,  %rax
    movq    %rax,       %cr3
    movq    switch_seg(%rip),   %rax
    pushq   $0x08
    pushq   %rax
    lretq
  • CR3寄存器 存放 PML4物理基地址 0x101000

GDT

//=======   GDT_Table

.section .data

.globl GDT_Table

GDT_Table:
    .quad   0x0000000000000000          /*0 NULL descriptor             00*/
    .quad   0x0020980000000000          /*1 KERNEL  Code    64-bit  Segment 08*/
    .quad   0x0000920000000000          /*2 KERNEL  Data    64-bit  Segment 10*/
    .quad   0x0020f80000000000          /*3 USER    Code    64-bit  Segment 18*/
    .quad   0x0000f20000000000          /*4 USER    Data    64-bit  Segment 20*/
    .quad   0x00cf9a000000ffff          /*5 KERNEL  Code    32-bit  Segment 28*/
    .quad   0x00cf92000000ffff          /*6 KERNEL  Data    32-bit  Segment 30*/
    .fill   10,8,0                  /*8 ~ 9 TSS (jmp one segment <7>) in long-mode 128-bit 40*/
GDT_END:

GDT_POINTER:
GDT_LIMIT:  .word   GDT_END - GDT_Table - 1
GDT_BASE:   .quad   GDT_Table

.quad 0x0020980000000000 /*1 KERNEL Code 64-bit Segment 08*/
这一串是代码段描述符 单个描述符长度是八字节
位于第二项即内核代码段选择子 0x08

跳转到内核主程序

//=======   64-bit mode code

switch_seg:
    .quad   entry64

entry64:
    movq    $0x10,  %rax
    movq    %rax,   %ds
    movq    %rax,   %es
    movq    %rax,   %gs
    movq    %rax,   %ss
    movq    $0xffff800000007E00,    %rsp        /* rsp address */

    movq    go_to_kernel(%rip), %rax        /* movq address */
    pushq   $0x08
    pushq   %rax
    lretq

go_to_kernel:
    .quad   Start_Kernel

movq go_to_kernel(%rip), %rax
Rip relative addressing RIP相对寻址

pushq $0x08 pushq %rax lretq
相当于 jmp 0x08 : rax
0x08内核代码段选择子

内核主程序 main.c

  • 内核主程序main.c:目前只有一个死循环,目前只是提供一个内核主程序的入口;
void Start_Kernel(void)
{
    while(1)
        ;
}

参考资料

  • 四级页表结构

Intel® 64 and IA-32 Architectures Software Developer’s Manual Combined Volumes: 1, 2A, 2B, 2C, 2D, 3A, 3B, 3C, 3D, and 4
Volume 3 / CHAPTER 4 PAGING / 4.5 4-LEVEL PAGING
https://software.intel.com/en-us/download/intel-64-and-ia-32-architectures-sdm-combined-volumes-1-2a-2b-2c-2d-3a-3b-3c-3d-and-4

Figure 4-9. Linear-Address Translation to a 2-MByte Page using 4-Level Paging

  • Rip relative addressing

从机器码理解RIP 相对寻址https://www.cnblogs.com/papertree/p/6298763.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容

  • 5-Level Paging and 5-Level EPT white paper原文 修订版本1.1 2017...
    公子小水阅读 3,701评论 0 3
  • 进制基本概念 什么是进制?进制是一种计数的方式,数值的表示形式 常见的进制十进制、二进制、八进制、十六进制 进制书...
    低头看云阅读 827评论 0 1
  • 进制基本概念 什么是进制?进制是一种计数的方式,数值的表示形式 常见的进制十进制、二进制、八进制、十六进制 进制书...
    极客江南阅读 1,992评论 0 11
  • 转眼来到科锐学习已经超过一年的时间了,眼看三阶段已经进入尾声,内核的学习也快要结束,记录一下笔记和心得,也给刚接触...
    五行猫阅读 1,088评论 0 0
  • 残勾销尽欲重阳,夜风凉,冷衣裳。寂寞黄花,瑟缩舞东墙。更漏又添愁几许,人不寐,蜡灯长。 离家时节柳丝扬,燕成双,蝶...
    田梦_阅读 544评论 24 31