`
suoyihen
  • 浏览: 1386534 次
文章分类
社区版块
存档分类
最新评论

Linux0.11内核--启动代码分析setup.s 建立页目录和页表

 
阅读更多

head.s开始

pg_dir

....

....

....

....

.org 0x1000

pg0:

.org 0x2000

pg1:

.org 0x3000

pg2:

.org 0x4000

pg3:

.org 0x5000

后面是setup_paging代码

其中:

movl $pg0+7,pg_dir /* set present bit/user r/w */

movl $pg1+7,pg_dir+4 /* --------- " " --------- */

movl $pg2+7,pg_dir+8 /* --------- " " --------- */

movl $pg3+7,pg_dir+12 /* --------- " " --------- */

设置页目录表中的项

由于pg0的地址在0x1000位置,则$pg0+7表示的是0x00001007

第 1 个页表的属性标志 = 0x00001007 & 0x00000fff = 0x007,表示该页存在、用户可读写。(由于每个页大小为4K,用12 bit位表

示)

然后

movl $pg3+4092,%edi

movl $0xfff007,%eax /* 16Mb - 4096 + 7 (r/w user,p) */

std

1: stosl /* fill pages backwards - more efficient :-) */

subl $0x1000,%eax

jge 1b

填写4个也表的内容

由于每个页表有1024项*4个页表=4096项,4096*4K=16M,正好完全覆盖地址空间。

Linus是从后向前设置页表,最后一个页表的最后一项对应的地址为16M-4096,即0xFFF000,然后加上属性标志0x007,得0xFFF007

每写一项地址减0x1000,也就是减去4K,正好对应一个页。

这程序循环0xFFF+1次

最后:

设置页目录基址寄存器 cr3 的值,指向页目录表

设置启动使用分页处理(cr0 的 PG 标志,位 31)

使用ret指令,将main函数地址从栈中弹出至CS,跳转到main去执行。

分享到:
评论

相关推荐

    linux0.11 内核源码

    1. **启动过程**:Linux 0.11启动流程从bootsect.s开始,然后是setup.s和start.c。这些代码负责初始化硬件环境,加载内核到内存,并跳转到C语言实现的主程序。 2. **进程管理**:在内核中,进程是通过`struct task_...

    linux0.11源码分析

    本文将对 Linux 0.11 的源代码进行深入分析,主要关注启动过程、关键数据结构以及系统调用等核心概念。 #### 启动过程 Linux 0.11 的启动过程涉及几个关键步骤,包括引导扇区(boot sector)、设置(setup)和主...

    简析linux内核的内核执行流程.doc

    随后,head.s开始执行,它负责建立页目录和页表,为内存管理单元(MMU)的分页机制做准备。此外,还包含了中断描述符表和全局描述符表的初始化,这些都是32位保护模式下处理中断和任务切换的基础。执行完head.s后,...

    Linux内核注释

    根据给定的文件标题“Linux内核注释”和描述“增加了目录书签,有用的下”,结合标签“0.11 liux 书签 内核 注释”以及部分未完全解析的内容,我们可以推断这份文档是关于Linux 0.11版本内核的详细注释和解释,主要...

    linux源代码

    1. **内核启动过程**:从bootsect.s开始,通过setup.s和start_kernel.c逐步完成硬件初始化、内存管理、进程创建等任务,直到用户空间的引导。 2. **进程管理**:包括进程的创建、调度、同步和通信机制,如信号量、...

    操作系统实验概述1

    1. 系统引导:编写bootsect.s和setup.s,使学生理解系统启动过程,掌握操作系统开发的基础。 2. 系统调用:添加自定义系统调用,如"whoami",以深入了解操作系统接口的工作原理。 3. 进程运行轨迹的跟踪:跟踪进程...

    linux_core_code:linux源码-linux

    Linux内核代码是全球开发者共同协作的成果,其开源特性使得任何人都可以查看、学习和贡献。这个名为"linux_core_code:linux源码"的压缩包很可能是Linux内核的早期版本,0.11版,这在Linux的发展史上具有重要意义。...

    高级操作系统思考题

    深入理解Linux内核的代码结构和编译模型,有助于开发者更好地参与到内核开发和维护中。 #### 19. Call指令与函数调用 Call指令用于调用子程序或函数,是处理器控制流中的基本构建块。题目中探讨了为什么在函数调用...

Global site tag (gtag.js) - Google Analytics