Sep 18

在youtube上面看到这个视频专辑:“Hardware and Operating System basics”

如果看不了,我已经上传优酷了:硬件和操作系统概要

主要内容:

  • programming the CPU and its interactions with memory and i/o devices: instructions, registers, big-endian vs. little-endian, memory-mapped vs. port-mapped i/o, interrupts, hardware exceptions, the cache
  • use of memory: stack-based execution, allocating heap, virtual memory, swapping, stack allocation
  • operating systems: Windows vs. Unix, processes, drivers, pre-emptive multi-tasking, system calls, blocking, the filesystem, IP

介绍在这里

Sep 17
     《Orange's一个操作系统的实现》书中选择的汇编器为NASM。用过MASM和GAS,发现NASM的语法是最简洁的,而且有强大的宏。通过man可以知道nasm的使用方法及它与其它汇编器语法上的区别。
 
主要值得注意的区别,也是我们常用的如下:

0.注释用分号‘;'
    ;这是注释
    这是代码

 
1.与gas不同,寄存器名字前面不用加'%'
  与gas操作数的顺序不同,mov ax,dx表示ax=dx而不是dx=ax

2.浮点寄存器名字为st0,st1等

3.与masm的dup不同,nasm重复数据用times,如:
    message:times 3 ‘abc’
    times 64-$+message db 0
  定义了字符串“abcabcabc”,加上后面跟着的0,长度总共为64

4.$表示当前行被汇编后的地址

5.$$表示一个节的开始处被汇编后的地址

6.符号都是立即数,标号和变量是一样的,都表示地址:
    foo dw 1 等价与 foo:dw 1
 
7.[addr]表示取地址的值,可以带word,byte等前缀指定大小:
    foo dw 1
    mov ax,foo
    mov dx,[foo]
  ax中为1的地址,dx为1

8.简单宏定义:
    %macro add 2 ;定义名为add,2个参数
         mov ax, %1;第一个参数给ax
         add ax, %2;加上第二个参数
    %endmacro
    add 1,3;调用宏

9.条件预编译宏
    %ifdef _BOOT_DEBUG
         org 0100h
    %else
         org 07c00h
    %endif

 
nasm的文档下载:http://www.nasm.us/docs.php
网上有翻译的中文文档下载,这里有一份。
Sep 17

      俱乐部的新学期又开始了,OS组的同学又要开始看《Orang‘s一个操作系统的实现》和做操作系统实验了。在这里把做的过程中的收获和体会写下来。

本篇是关于书中的第一,二章的开发环境搭建。这里讲的是完全在linux下的环境搭建

用到的工具及作用:

一台安装有linux操作系统的计算机:这是其它一切的前提。

nasm,gcc,make:编译链接的基本工具

bochs:运行调试工具

qemu:运行工具,比bochs更快

dd:绝对扇区读写工具,用来写引导扇区和查看映像内容

bximage:用来生成虚拟映像

objdump,readelf:查看目标文件结构,查看elf文件

vim:用来编译代码,也可以是其它的文本编辑器。

freedos映像:在第三章中,因为程序可能超过512字节,不能写入引导扇区,
                      于是编译成com文件在dos中运行,这个在bochs官网可以下到。

bochs编译选项及说明:
       --enable-vbe
       --enable-debugger:开启调试功能,默认不开
       --enable-debugger-gui:调试时有运行窗口
       --enable-smp
       --enable-new-pit
       --enable-all-optimizations
       --enable-4meg-pages
       --enable-reset-on-triple-fault
       --with-all-libs
       --with-x
       --with-x11
       --with-nogui:使可以不显示运行窗口

需要了解的:

2.引导扇区:硬盘或者软盘某个分区的第一个扇区,如果以0xAA55结束,则BIOS认为它是一个可引导扇区。
   计算机启动时,先进行加电自检(POST),然后按顺序寻找启动盘,也就是检查所有磁盘的第一个扇区,一旦发现以0xAA55结束,则将这512字节装载到内存地址0000:7c00处,然后跳转到0000:7c00,运行引导扇区的代码。
更准确定义见这里:
http://en.wikipedia.org/wiki/Boot_sector
Apr 12

        从最开始用vim时不知道怎么输入文字,怎么退出,到现在被vim的特性所折服。
它毫无疑问地成为我最喜欢的编辑器。
    vim小巧快捷,命令的分类清晰,分工明确,各司其职,命令格式统一,组合起来,威力无穷。

vim官方网站
        这里我只是说一下自己学习和使用vim的一些情况。
        学习基本的入门知识,vim为我们提供了一个 vimtutor。在命令行中敲入vimtutor就可以进入。
基本上把vimtutor跟着做一遍之后,用vim写东西就没什么大问题了。接下来只是要多多练习,积累命令与经验。
用vimtutor zh命令可以进入中文版教程。但是默认是繁体的。
可以下载一份简体中文版的(或者自己转换一下)。。替换掉原来的,看着舒服点。
再要进一步提高也用不着更多的资料,vim的help就足够了,其实耐心的一点点把vim help看一遍还是很有意思的。
当然默认安装的vim文档都是英文的,看英文的效率相对要低一些,当然对提高英文还是有帮助的,但我们只是
想学习vim的使用,我们完全可以用中文的文档。vim官方网站也有中文文档的安装文件(附件中包含也有一份)。
这样我们就可以安心的学习vim 啦。

Mar 20
    LXDE 是支持快捷键的,只是没有明确的快捷键设置图形管理工具。快捷键是通过openbox来实现的,在 ~/.config/openbox  目录下有一个 lxde-rc.xml 文件,其中<kebbind></keybind>之间的就是设置快捷方式。
<keybind key="A-F2">
	<action name="Execute">
		<command>lxpanelctl run</command>
	</action>
</keybind>
其中
A:Alt,C:Ctrl,W:windows,等等。。。
    可以看到系统默认已经设置了快捷方式。像上面的Alt+F2打开运行,而且还设置了两套快捷键,Alt+F2是linux习惯,W+r则是windows习惯。还有比如W+e打开文件管理器,W+d显示桌面等等。不过可能只有部分快捷键起作用。
    还可以看到 ~/.config/openbox 目录下有别外一个文件rc.xml,打开看,发现里面同样定义了各种快捷方式,有许多和lxde-rc.xml中有冲突,并且rc.xml似乎是让用户自定义的,因为其中调用的很多程序是没有的。原来rc.xml才是真正起作用的配置文件。于是简单的把lxde-rc.xml复制成rc.xml,这样所有的快捷键都可以用了。如果还有什么快捷键没有,自己仿照上面的格式添加就可以了,非常方便。
下面添加一个Alt+F1打开lxterminal的快捷键:

<keybind key="A-F1">
	<action name="Execute">
		<command>lxterminal</command>
	</action>
</keybind>
特别感谢:
阿泰的菜园

 

 

 

 

 

 

Mar 20

以下内容以GNU GRUB 0.97为标准,并且是从U盘引导。

1.     安装grubU盘。

安装grubU盘最方便的方法就是在linux系统下使用grub安装程序。

具体步骤如下:

a)        首先找到U盘所在设备(这里假设为/dev/sdb1),然后挂载:

mkdir /mnt/sdb1
mount /dev/sdb1 /mnt/sdb1

b)       创建相关目录

mkdir /mnt/sdb1/boot
mkdir /mnt/sdb1/boot/grub

c)        找到文件stage1, stage2, *_stage1_5的位置

find /usr/ -name statge

d)       复制以上文件到grub 目录(假设上面的文件在/usr/share/grub/ 目录下):

cp /usr/share/grub /mnt/sdb1/boot/grub
cp /usr/share/grub /mnt/sdb1/boot/grub

如果U盘是用FAT文件格式格式化的则复制fat_stage1_5,这里用的是FAT32

cp /usr/share/grub /mnt/sdb1/boot/grub

e)        运行grub安装程序:

sudo grub

接着如下操作:(其中设备号要具体确定)

好了现在U盘上已经装好了grub,引导配置写在grub.conf中。

2.     grub引导 内核

grub有两种不同的引导机制,一种是直接 载入系统内核,另一种是通过chainloader载入另一个bootloader来引导自己的系统。可以被bootloader原生支持的内核一般要符合多重引导规范(Multiboot Specification)。当然为了方便grub也支持直接引导linuxFreeBSD等。

我们要用grub来引导自己的内核,当然我们不希望自己写一个bootloader再让grubchainload,所以我们得支持多重引导规范。

 

  一个简单的内核实例(grub0.97源文件/docs/下面有三个文件multiboot.hloader.skernel.c,下面作了简化):