自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(12)
  • 收藏
  • 关注

ucore-project5: linker script

要对内核进行页映射,首先要知道内核在内存中的位置和内核的大小。内核在内存中的位置很好知道,因为是启动代码拷贝进去的,而内核的大小就不好知道了,只有最后将各个obj文件组合成内核文件的ld命令才知道。而ld命令的命令行参数很难定义参数告诉代码,此时就需要链接器脚本linker script了。ld使用命令-T指定链接器 linker script功能很强大,可以告诉链接器应该怎么干活儿,除了...

2011-12-22 00:00:29 87

ucore-project5:mm(3)

paging由x86 cpu控制寄存器中的三个bit控制:CR0 bit31:PG位,控制是否启用pagingCR4 bit4:PSE位,页大小扩展,允许4M大小的页面CR4 bit5:PAE位,物理地址扩展 先看32位的paging处理,就是PSE=PAE=0,而PG=1时的情况。 一个线性地址被分为3部分,第一部分是页目录表项索引,高10位(bit31-bit22)...

2011-12-21 23:29:15 95

ucore-project5: mm(2)

看内核刚进入时加载临时gdt的代码:lgdt __gdtdesc - KERNBASE.datagdt:...__gdtdesc: .word 0x17 .long gdt-KERNBASE 其中KERNBASE = 0xC0000000。在lgdt指令中,使用了__gdtdesc的真实物理地址,而在__gdtdesc中,使用了gdt的真实物理地...

2011-12-20 00:27:28 89

ucore-project5: mm(1)

project5到project9主要处理内存管理。 其中project5是一个大工程,内部分为5个小工程,本次主要针对第一个小工程进行分析。 在project3.1中,就已经使用了ld的linker script,直接在其中指定链接时的一些配置。比如起始代码的符号,起始地址值,某个段的align值,以及可以定义一些变量。 在project5中,起始地址改为汇编函数kern...

2011-12-19 01:30:50 89

ucore-project4: 内核态和用户态切换(3)

这是内核态和用户态切换的最后一篇,也是project4的最后一篇了。 完成了使用call gate进行用户态到内核态的切换,使用lret进行内核态到用户态的切换的实验。这是project4.1.2的内容。 内核态到用户态的切换比较麻烦一些,首先将用户态段selector给ds,es,fs,gs赋值,将用户态栈的selector压栈,然后ebp压栈。因为c编译器会再函数开头将ebp压...

2011-12-18 15:16:30 192

ucore-project4: 内核态和用户态切换(2)

用户态到内核态切换相对比较简单。用户态切换到内核态时,需要切换堆栈,堆栈地址在当前task的tss段中,因此需要先建立好一个task,并为内核态的ss和esp赋好值。 仍然使用中断切换到内核态,中断处理函数中,首先将保存在新堆栈中的老堆栈的esp取出来,然后在老堆栈的esp指针指向位置之上建立一个trapframe(不包括ss和esp值),然后将新堆栈中的这一堆内容拷贝过来,然后给tf赋值...

2011-12-18 13:14:19 140

ucore-project4: 内核态和用户态切换(1)

终于又回来了。内核态和用户态切换比较麻烦,今天解决了一个bug,搞定了从内核态切换到用户态。 x86中,从高优先级代码切换到低优先级代码的唯一方法就是使用ret或iret返回指令,而从低优先级切换到高优先级的方法是int或call调用指令。这几个指令在跨优先级过程中,都会进行堆栈切换。而切换的目的堆栈,对于int/call指令,是记录在当前task的tss段中,对于ret/iret指令,是...

2011-12-18 12:24:50 264

ucore-project4: interrupt--x86 cpu复习

离上次更新ucore工程已经过去6天了。这几天工作比较忙,经常加班,回家一般23点多了。另外x86 cpu知识忘得差不多了,优先级切换、段式、页式内存访问和保护等记不起来,project4也没法继续做下去。周末终于有时间把x86文档啃了一下(25366821-pentium4-V3A-System-Programming-Guide.pdf),终于又捡起来些。 这是以前学习x86时记的一些...

2011-12-11 20:04:41 106

ucore-project4: interrupt -- 搞定第一个中断:timer

修改了代码中的一个bug,时钟终端终于正常了。 project4是一个很大的工程,包括了6个小工程。今天完成的是第一个工程:添加中断,初始化pic(8259A)和pit(8253)。第二个工程project4.1主要添加了用户态段和一个TSS段,重新初始化gdt,并加载了一个TSS第三个工程project4.1.1实现用户态和内核态的切换,主要通过修改int中断,在中断处理函数中修...

2011-12-05 23:56:21 135

ucore-project4: interrupt

中断处理程序总算调进去了,刚才调试主要有两个问题:1. outb时,两个参数反了,输出参数放在了后面,而端口号放在了前面。究其原因,是直接抄ucore代码的后果。我的outb函数定义时,参数顺序与AT&T的outb指令参数顺序一样,输入值在前,输出值在后,而ucore的定义把他们反过来了,所以所有ucore调用outb的地方,都是端口在前,而输出数值在后。 2. %ds/%es...

2011-12-05 07:55:25 83

电路图

刚才在看怎样初始化时钟芯片8253。cpu通过执行out指令,往时钟芯片的某些寄存器写入特定的数值,就可以配置时钟芯片的三个时钟,让他们分别干不同类型的事。时钟芯片三个时钟可以分配配置处于六种模式中的一种,提供不同的功能。 为什么out指令往某个特定端口写入特定值,就可以完成特定的事呢?cpu的地址线、数据线管脚分别练到各种设备的不同管脚,当往某个地址输出某个特定值时,实际上就是调整了这些...

2011-12-04 00:46:28 189

我的操作系统的方向

做操作系统到底是为了什么呢? 好玩,当然是一个很重要的目的,对它很有兴趣。不过后续要做成一个什么样子的呢?做OS是很耗时间的工作,Linus让linux可以工作,花费了整整一年的全职时间,这是建立在一个定义良好、文档丰富的操作系统界面的基础上,紧紧是让一些用户态程序可以在这个基础上运行起来。 如果要自己定义一个语言,自己设计一个全新的界面,基本上要耗费几年的时间,做出来的东西还不一...

2011-12-03 11:14:36 226

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除