《Linux内核完全剖析》这本书在第4章给出了一个简单多任务内核示例程序,我们称之为Linux 0.00系统。本文介绍了一种把它跑起来的方法。

一、实验环境

Win7(64位)+Vmware+Ubuntu(64位)+Bochs

说明:我是win7的操作系统,在上面安装了虚拟机VMware,虚拟机上安装了Ubuntu 14.04(64位),Ubuntu上又安装了x86模拟器——Bochs(版本是2.4.5)

我准备在Ubuntu环境下编译源码,生成镜像文件;然后用Bochs来运行镜像文件,并观察结果。

二、源码下载

下载地址是
http://oldlinux.org/Linux.old/bochs/
要下载的文件是linux-0.00-050613.zip
下载此文件,并解压。解压后,其中一个文件是linux-0.00-rh9.tar.gz,继续解压这个文件,得到文件夹linux-0.00-rh9,此文件里面有3个文件,如下图:

boot.s,采用as86语言编写,是引导启动程序,用于把映像文件中的内核代码加载到内存某个指定位置处,并在设置好临时GDT表等信息后,把处理器设置成保护模式,然后跳转到内核代码处运行。

head.s采用GNU as汇编语言编写,实现了2个运行在特权及3上的任务,他们在时钟中断控制下相互切换运行,一个在屏幕上打印“A”,另一个在屏幕上打印“B”。

三、编译

(1)因为缺少as86编译器,所以需要安装bin86

sudo apt-get install bin86

(2)之后进行make, 但是有一大堆报错信息。

as86 -0 -a -o boot.o boot.s
ld86 -0 -s -o boot boot.o
as -o head.o head.s
head.s: Assembler messages:
head.s:59: Error: invalid instruction suffix for pushf'
head.s:61: Error: invalid instruction suffix for
popf’
head.s:68: Error: invalid instruction suffix for push'
head.s:69: Error: invalid instruction suffix for
push’
head.s:70: Error: invalid instruction suffix for pushf'
head.s:71: Error: invalid instruction suffix for
push’
head.s:72: Error: invalid instruction suffix for push'
head.s:99: Error: invalid instruction suffix for
push’
head.s:113: Error: invalid instruction suffix for pop'
head.s:121: Error: operand type mismatch for
push’
head.s:122: Error: invalid instruction suffix for push'
head.s:127: Error: invalid instruction suffix for
pop’
head.s:128: Error: operand type mismatch for pop'
head.s:134: Error: operand type mismatch for
push’
head.s:135: Error: invalid instruction suffix for push'
head.s:144: Error: unsupported instruction
ljmp’
head.s:147: Error: unsupported instruction ljmp'
head.s:148: Error: invalid instruction suffix for
pop’
head.s:149: Error: operand type mismatch for pop'
head.s:155: Error: operand type mismatch for
push’
head.s:156: Error: invalid instruction suffix for push'
head.s:157: Error: invalid instruction suffix for
push’
head.s:158: Error: invalid instruction suffix for push'
head.s:159: Error: invalid instruction suffix for
push’
head.s:163: Error: invalid instruction suffix for pop'
head.s:164: Error: invalid instruction suffix for
pop’
head.s:165: Error: invalid instruction suffix for pop'
head.s:166: Error: invalid instruction suffix for
pop’
head.s:167: Error: operand type mismatch for `pop’
make: * [head.o] 错误 1

我们在head.s文件开头加上一句.code32,如下图所示,问题就解决了。

SCRN_SEL    = 0x18
TSS0_SEL    = 0x20
LDT0_SEL    = 0x28
TSS1_SEL    = 0X30
LDT1_SEL    = 0x38
.code32          # 加上这句话
.global startup_32
.text
startup_32:movl $0x10,%eaxmov %ax,%ds

(3)再次make,还会有错误:

ld -m elf_i386 -Ttext 0 -e startup_32 -s -x -M head.o -o system > System.map
ld: i386:x86-64 architecture of input file `head.o’ is incompatible with i386 output
make: * [system] 错误 1

我们修改Makefile文件,在AS=as后面加上--32,变成AS=as --32.
make clean后重新make,就成功了。显示如下:

as86 -0 -a -o boot.o boot.s
ld86 -0 -s -o boot boot.o
as –32 -o head.o head.s
ld -m elf_i386 -Ttext 0 -e startup_32 -s -x -M head.o -o system > System.map
dd bs=32 if=boot of=Image skip=1
记录了16+0 的读入
记录了16+0 的写出
512字节(512 B)已复制,0.000836727 秒,612 kB/秒
objcopy -O binary system head
cat head >> Image

四、运行

首先写一个简单的Bochs配置文件,假设命名为bochsrc-0.00.bxrc

romimage: file=$BXSHARE/BIOS-bochs-latest
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
megs: 16
floppya: 1_44="Image", status=inserted
boot: a
log: bochsout.txt

把这个配置文件和编译出的镜像Image放在同一目录下,然后运行命令

bochs -f bochsrc-0.00.bxrc

会看到

  1. Restore factory default configuration
  2. Read options from…
  3. Edit options
  4. Save options to…
  5. Restore the Bochs state from…
  6. Begin simulation
  7. Quit now

Please choose one: [6]

按回车

(0) [0xfffffff0] f000:fff0 (unk. ctxt): jmp far f000:e05b ; ea5be000f0
< bochs:1>

输入 c ,再回车,就可以看到运行结果了。

Linux 0.00 的编译和运行相关推荐

  1. Linux Kernel 0.01 的编译和运行

    Linux Kernel 0.01 的编译和运行 本文操作环境均在 Linux 系统中实现. ===================================================== ...

  2. Linux 0.00 代码解析(一)

    <Linux内核完全剖析>这本书在第4章给出了一个简单多任务内核示例程序,作者称之为Linux 0.00系统. 源码的下载地址和实验方法可以参考我的博文 http://blog.csdn. ...

  3. Linux 0.00简单多任务内核head.s超详注释

    # head.s包含32位保护模式初始化设置代码.时钟中断代码.系统调用中断代码和两个任务的代码. # 在初始化完成之后程序移动到任务0开始执行,并在时钟中断控制下进行任务0和1之间的切换操作. LA ...

  4. 【解决方案】64位Linux系统下无法编译、运行32位C、C++程序的解决办法

    [故障] 1. 从32位系统里面复制过来的32位C或C++程序无法运行,提示找不到程序文件,或找不到libstdc++.so.6库 [oct1158@oct1158-fedora 32env]$ ./ ...

  5. Xp下的程序编译成linux,WinXP下打造自己的linux 0.11简易编译环境(原创)

    http://caiwei8888.blog.163.com/blog/static/3017424120101913353856/ 学习赵炯博士的<linux 0.11 内核完全注释>, ...

  6. Linux 0.00 Makefile 说明

    关于Linux-0.00 的编译和运行可以参考我的博文:http://blog.csdn.net/longintchar/article/details/78757065 为了能在64位的Ubuntu ...

  7. Linux 0.00简单多任务内核boot.s超详注释

    ;标题:简单内核引导启动程序 ;作者:黄旭冬 ;程序描述: ; 该程序首先跳到0x07c00处,这是BIOS开始时将本程序加载到的位置, ; 然后本程序将内核代码(head.s代码)加载到0x1000 ...

  8. Linux下C程序的编辑,编译和运行以及调试

                                                                                                        ...

  9. C++(0)--mac 使用VScode 进行C++编译、运行、调试

    mac 使用VScode 进行C++开发 1.查看编译器情况 2.安装插件C/C++,C/C++ Clang Command Adapte 3.新建一个C++ project 3.1.本地新建文件夹 ...

最新文章

  1. ×××生成算法的分析
  2. xampp中php连接mysql数据库乱码解决
  3. dvwa_xss_储存型
  4. js验证开始日期不能大于结束日期_Excel之日期与时间函数YEAR/MONTH/DAY/DATE/DATEFIF...
  5. Spring源代码学习之where is Bean instance created
  6. https://blog.csdn.net/weixin_40412037/article/details/112235003
  7. [APIO2009]抢掠计划
  8. 使用PowerShell和SQL的示例可用性监视服务的插图
  9. 基于windows PE文件的恶意代码分析;使用SystemInternal工具与内核调试器研究windows用户空间与内核空间...
  10. php搭建后台 xampp_你还在用wordpress?|搭建独一无二个人网络日志发布平台
  11. open cv+C++错误及经验总结(十三)
  12. 20171103_Python学习三周五次课
  13. 阅读之大量数据访问机器的架构优化
  14. 在控制台上看苹果手机的LOG
  15. 计算机上安装了更新ie版本,电脑ie浏览器版本过低怎么升级方法
  16. 常用通信光纤是如何分类的
  17. python学习——pandas查看数据集null值:isnull
  18. 【进程管理器】PM2应用进程管理器
  19. 唯芸星童鞋的第一个博客。
  20. 计算机平面设计基础 photoshop基本操作

热门文章

  1. NYOJ 269 VF
  2. 静态call 动态call LINK
  3. Codeforces 494E. Sharti
  4. 课后作业-阅读任务-阅读笔记
  5. C# WinForm 添加Windows Media Player 控件调试出现未能加载文件或程序集Interop.WMPLib,该怎么解决...
  6. 让PHP程序永远在后台运行
  7. 高性能jdbc封装工具 Apache Commons DbUtils 1.6(转载)
  8. VS.NET2005中的WEBPART初步(一)
  9. ubuntu16安装anaconda显示没有文件或那个目录
  10. 图像梯度处理MATLAB代码