代码改变世界

Linux0.11---A20地址线

2013-12-08 15:11 by islandscape, 1294 阅读, 0 推荐, 收藏, 编辑
摘要:大家都知道8086/8088处理器有20根地址线,能够访问1^20 = 1M内存,实模式访存采用seg x 4 + off(seg为段寄存器,off为段内偏移地址)的方式,访问范围是0(0x0000:0x0000)---10ffef(0xffff:0xffff),对于超过1M的寻址地址将自动环绕(wrap around)到0x0ffef,比如访问地址0x100001时将访问0x0ffef + 1 = 0xfff0物理地址。随后intel发明了80286,地址线有24位,访问地址空间是1^24=16M,并且有一个和8086/8088相互兼容的实模式,如果超过了1M的内存,80286不会回滚到.. 阅读全文

C性能调优---GCC编译选项-fomit-frame-pointer

2013-11-26 21:02 by islandscape, 8260 阅读, 1 推荐, 收藏, 编辑
摘要:在看《C程序性能优化》一书时,作者提到使用gcc编译器选项-fomit-frame-pointer能够提高程序性能,自己有些不解,决定探个究竟。 假设有如下简单程序:#include int add(int a, int b){ return a + b;}int main(){ int sum = 0; sum = add(1,2); printf("%d\n",sum); return 0;} 不使用-fomit-frame-pointer选项编译出的二进制经过反汇编的代码如下:00000000 : 0: ... 阅读全文

Linux0.11---调试启动程序

2013-11-17 21:41 by islandscape, 1471 阅读, 0 推荐, 收藏, 编辑
摘要:前面一篇文章介绍了最简单的启动程序---从系统上电到屏幕输出“hello world”,linux0.11内核启动程序远比这复杂的多,后面我们会逐步深入。今天给大家介绍下如何调试这个最简单的启动程序。 “工欲善其事,必先利其器”,我们需要两“器”---编译器和虚拟机。编译器把汇编程序编译成为可执行文件,虚拟机模拟系统上电、BIOS中断等功能。编译器选择nasm,它是一款为可移植性与模块化而设计的80x86的汇编器。官方网址为http://www.nasm.us/。虚拟机选择bochs,bochs是一个模拟x86硬件平台的虚拟机,通过简单的配置即可模拟I/O设备、内存等硬件环境。相关链接:... 阅读全文

linux0.11-----从启动程序开始

2013-11-09 13:14 by islandscape, 787 阅读, 0 推荐, 收藏, 编辑
摘要:今天终于鼓起勇气在博客园开博,博客是个分享经验、交流知识的地方,最近在研究linux0.11内核,想把自己的所学记录下来,以备后用。欢迎大家留言批评指正或联系 islandscape@163.com,也欢迎大家一起学习、一起进步。 当我们按下计算机电源键后发生了什么呢?主板接收到一个启动信号,启动供电系统后BIOS进行自检,若发现某个部件不能正常工作系统将进入死循环。所有硬件都通过自检后,系统将控制权交给BIOS。BIOS按照配置顺序读驱动器,将驱动器的第一个扇区(512B)加载到物理地址0x7c00地址,找到启动扇区后从0x7c00这个地址执行启动程序。为什么BIOS会把第一个扇区加载... 阅读全文