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去执行。
分享到:
相关推荐
1. **启动过程**:Linux 0.11启动流程从bootsect.s开始,然后是setup.s和start.c。这些代码负责初始化硬件环境,加载内核到内存,并跳转到C语言实现的主程序。 2. **进程管理**:在内核中,进程是通过`struct task_...
本文将对 Linux 0.11 的源代码进行深入分析,主要关注启动过程、关键数据结构以及系统调用等核心概念。 #### 启动过程 Linux 0.11 的启动过程涉及几个关键步骤,包括引导扇区(boot sector)、设置(setup)和主...
随后,head.s开始执行,它负责建立页目录和页表,为内存管理单元(MMU)的分页机制做准备。此外,还包含了中断描述符表和全局描述符表的初始化,这些都是32位保护模式下处理中断和任务切换的基础。执行完head.s后,...
根据给定的文件标题“Linux内核注释”和描述“增加了目录书签,有用的下”,结合标签“0.11 liux 书签 内核 注释”以及部分未完全解析的内容,我们可以推断这份文档是关于Linux 0.11版本内核的详细注释和解释,主要...
1. **内核启动过程**:从bootsect.s开始,通过setup.s和start_kernel.c逐步完成硬件初始化、内存管理、进程创建等任务,直到用户空间的引导。 2. **进程管理**:包括进程的创建、调度、同步和通信机制,如信号量、...
1. 系统引导:编写bootsect.s和setup.s,使学生理解系统启动过程,掌握操作系统开发的基础。 2. 系统调用:添加自定义系统调用,如"whoami",以深入了解操作系统接口的工作原理。 3. 进程运行轨迹的跟踪:跟踪进程...
Linux内核代码是全球开发者共同协作的成果,其开源特性使得任何人都可以查看、学习和贡献。这个名为"linux_core_code:linux源码"的压缩包很可能是Linux内核的早期版本,0.11版,这在Linux的发展史上具有重要意义。...
深入理解Linux内核的代码结构和编译模型,有助于开发者更好地参与到内核开发和维护中。 #### 19. Call指令与函数调用 Call指令用于调用子程序或函数,是处理器控制流中的基本构建块。题目中探讨了为什么在函数调用...