- 浏览: 365115 次
- 性别:
- 来自: 深圳
最新评论
-
abc08010051:
结果呢?烂尾跑路了?
关于actor模型的优缺点分析(1) -
qinhanlei:
hi, 感谢分享,受益匪浅! 顺便请问一下,您使用的是什么绘图 ...
skynet任务调度分析 -
maxer025:
楼主,github 地址?
WebIM第一版本及下一步工作 -
boyhailong:
博主的分析能力真是强 skynet的很多东西我表示还是看不太懂 ...
skynet任务调度分析 -
ranweizheng:
亲这篇里面没有说当(.class 元素 元素) 与( .cla ...
css样式表中的样式覆盖顺序
文章列表
中断处理程序总算调进去了,刚才调试主要有两个问题:
1. outb时,两个参数反了,输出参数放在了后面,而端口号放在了前面。究其原因,是直接抄ucore代码的后果。我的outb函数定义时,参数顺序与AT&T的outb指令参数顺序一样,输入值在前,输出值在后,而ucore的定义把他们反过来了,所以所有ucore调用outb的地方,都是端口在前,而输出数值在后。
2. %ds/%es等压栈时使用了pushw进行压栈。pushw一次只压两个字节到栈上,下次pushw时会挨着这两个自己继续压,pushw不会自动加padding,让自己总是四字节对齐。并且,即使压栈4个字节(使用push ...
刚才在看怎样初始化时钟芯片8253。cpu通过执行out指令,往时钟芯片的某些寄存器写入特定的数值,就可以配置时钟芯片的三个时钟,让他们分别干不同类型的事。时钟芯片三个时钟可以分配配置处于六种模式中的一种,提供不同的功能。
为什么out指令往某个特定端口写入特定值,就可以完成特定的事呢?cpu的地址线、数据线管脚分别练到各种设备的不同管脚,当往某个地址输出某个特定值时,实际上就是调整了这些管脚的高低电平,从而改变这些芯片的内部状态,让他们做不同的事。
看了8253、8259A等各种集成芯片的管脚说明,突然对这些管脚怎么和cpu的管脚连接非常感兴趣,从网上找这些管脚连接图片,没有找 ...
做操作系统到底是为了什么呢?
好玩,当然是一个很重要的目的,对它很有兴趣。不过后续要做成一个什么样子的呢?做OS是很耗时间的工作,Linus让linux可以工作,花费了整整一年的全职时间,这是建立在一个定义良好、文档丰富的操作系统界面的基础上,紧紧是让一些用户态程序可以在这个基础上运行起来。
如果要自己定义一个语言,自己设计一个全新的界面,基本上要耗费几年的时间,做出来的东西还不一定怎么样,方向不知道怎么样。要设计一个好用、定义完备、好调试、效率高的语言,超过C的语言,的确很难,不过C语言却是有那些不好用的地方:头文件、命名冲突、等等
模拟器和虚拟机,qemu功能很强,不 ...
为了打印数字,将printf添加进去,结果打印出来乱码,并且是原来正确的、没有用printf打印出来的代码也变成了乱码。
使用readelf -e查看编译出来的kernel文件(kernel.out),发现代码是正确的,打印代码引用的打印字符串的地 ...
刚刚看一个科普节目:how the universe works
我们看到的巨大的太阳,是由几十亿恒星组成的银河系中普通的一个恒星,它与银河系中心距离25000光年,非常遥远。而银河系只是整个宇宙目前发现的几千亿星系中非常普通、非常小的星系,离我们最近的仙女座星系大小都是银河系的两倍。
星系并不单单由恒星组成,恒星只是其中很少的一部分,星系由尘埃、气体等组成,恒星只是其中很多尘埃、气体相互吸引组成的一个集合体,星系是恒星的摇篮,也是恒星的坟墓。
星系之间距离非常遥远,但星系之间互相吸引,组成星系团。不过根据目前我们理解的万有引力,这种引力不应该大到让星系互相吸引。如果只有 ...
project3实际上是两个工程,project3.1在project3的基础上添加了一个内核控制台的能力,为此添加了读取键盘/串口的能力,可以读取命令,然后查询某些内核信息,包括内核参数,调用堆栈等。
到目前为止,还没有启用中断,所以读取键盘都是cpu主动轮询的。
简单处理,只做串口的,不做键盘。发现还是串口处理最简单:只要知道一个数据IO端口,一个状态IO端口就可以了。
目前还没有正确处理串口的backspace键,明天处理。
昨天开始project3,本project是真正做一个有驱动、提供printf、strlen等功能的、可简单初始化的elf内核,然后通过MBR中的简单bootloader解析elf文件头,将elf内核以program header table中指定的位置载入内存。
今天完成文件的载入,在载入过程中,bootloader因为解析elf文件头,并完成elf内核的加载,导致虽然使用了gcc的文件大小优化(-Os),bootloader大小仍超过512字节(524字节),无法装载到MBR。看ucore完成相同功能的bootloader,才376字节,对比了一下两者的objdump反编译代码,发现 ...
反编译了C代码生成的elf文件,发现每个inline函数都很长,前面准备栈帧、参数,后面leave、ret,占用了大量空间。编译时使用gcc的-Os,大小立刻从6百多字节降到4百多,ok了
本工程很简单,就是在启动完成后,从第一个硬盘的第二个分区开始,加载8个分区到内存0x10000处。
本工程总是运行出错,C代码进不去,出现和proj1那样16进制代码重复运行的问题。第一反应就是跳转到32位时出错了,看了很 ...
哈哈,终于解决了昨天搞到半夜快三点没有搞定的问题:在C语言代码中无法使用串口输出的问题!
说到底很简单,把COM1输出端口号搞错了,把0x3F8写成了0x3B8,结果就死活不出来。实际上昨晚还有最初还有另外一个问题:gdt ...
•sign主要的作用是创建一个启动扇区,在第511、512个字节上分别写上0x55和0xAA。为此需要为编译系统专门写这么一个四五十行的C工具。
•在shell里很难处理二进制数据,大部分处理二进制数据的都是怎么将二进制数据以ascii的形式展示出来,包括od,objdump等等,而反过来处理的很少
•还好有xxd,xxd正常也是展示二进制数据,但xxd –r可以将展示的十六进制ascii数据再反向回去,这个功能非常适合替换sign
•xxd有两个文件参数,第一个是输入文件名,第二个是输出文件名,第一个可以用“-”代替表示标准输入,第二个可以 ...
以前学gcc嵌入汇编时的一些笔记,看一下对gcc的嵌入汇编比较有用处:
1· 格式:asm ( "以回车或分号分隔的汇编指令" : 以逗号分隔的输出操作数 : 以逗号分隔的输入操作数 : 以逗号分隔的受影响的寄存器或内存 )
2·输出操作数表示汇编指令执行结果,输入操作数表示汇编指令执行时的输入值;
3·每个输出和输入操作数都是分为两部分:“限定符” (C表达式),其中输出操作数的限定符必须包含等号(=)
4·如果限定符表示一个寄存器,则对于输入操作数,在生成第一部分的汇编指令之前,会先生成将C表达式的值生成到指定的寄存器的汇编指令;对于输出操 ...
x86系统C语言函数调用时的内存分布
- 博客分类:
- 日知
好久不用,很多内容都忘了。刚刚复习了一下,再写一遍:32位x86系统C函数调用时的内存分布。
每个C语言函数在运行过程中,在栈顶对应一个栈帧。想想堆栈是一个地址由上往下增长的线性内存(为什么要由上往下增长?后面说明),栈帧的顶端地址位于esp寄存器,栈帧底部地址由ebp寄存器保存(当然,这个说法不准确,ebp再往下还有这个函数的参数,后面详细说明)。结构如下所示(每行4字节):
00 临时变量2 <---- esp
04 临时变量1
08 局部变量2
0C 局部变量1
10 调用函数ebp指针值 ...
ucore-project1: boot(1)
- 博客分类:
- 学习
改了一下Makefile,可以看到编译命令了(很简单,把变量V定义成空就可以了。。。)
这个project很简单,就是把cpu内存初始化一下,然后直接端口IO的方式在屏幕上打印helloworld。
看了bootasm.S和bootmain.c,他们主要做这些事儿:
先看bootmain.c,就是通过in/out指令,把helloworld在屏幕上打印出来。打印的入口函数式bootmain,由bootasm.S中的汇编代码跳入。
bootasm.S中的代码首先从0x7C00开始执行,此时bios刚刚自检完,将启动盘的第一个扇区(512字节)拷贝到0x7C00处,就 ...
在看xv6的过程中,在硬盘上翻资料的时候,在xv6文档目录下发现去年九月份下载下来的ucore,这是清华大学的老师们(陈渝等)在参考xv6等的基础上循序渐进组织的一系列实验,从开始的启动、设备管理,到进程管理、内存管理、文件系统等,以及后续提供的网络管理,go语言支持,android libc支持,arm支持,x86-64支持等等,个人认为这个更加适合os的学习。再说,母校的不支持,还支持什么呢?
趁着最近有时间,把所有的实验全部做一遍,另外争取搞个web server,把自己喜欢的一些脚本语言搞上去。
Ken Thompson趁着老婆孩子度假写了unix,Linus在21岁时写 ...