Linux 0.00 的编译和运行
《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 forpushf'
popf’
head.s:61: Error: invalid instruction suffix for
head.s:68: Error: invalid instruction suffix forpush'
push’
head.s:69: Error: invalid instruction suffix for
head.s:70: Error: invalid instruction suffix forpushf'
push’
head.s:71: Error: invalid instruction suffix for
head.s:72: Error: invalid instruction suffix forpush'
push’
head.s:99: Error: invalid instruction suffix for
head.s:113: Error: invalid instruction suffix forpop'
push’
head.s:121: Error: operand type mismatch for
head.s:122: Error: invalid instruction suffix forpush'
pop’
head.s:127: Error: invalid instruction suffix for
head.s:128: Error: operand type mismatch forpop'
push’
head.s:134: Error: operand type mismatch for
head.s:135: Error: invalid instruction suffix forpush'
ljmp’
head.s:144: Error: unsupported instruction
head.s:147: Error: unsupported instructionljmp'
pop’
head.s:148: Error: invalid instruction suffix for
head.s:149: Error: operand type mismatch forpop'
push’
head.s:155: Error: operand type mismatch for
head.s:156: Error: invalid instruction suffix forpush'
push’
head.s:157: Error: invalid instruction suffix for
head.s:158: Error: invalid instruction suffix forpush'
push’
head.s:159: Error: invalid instruction suffix for
head.s:163: Error: invalid instruction suffix forpop'
pop’
head.s:164: Error: invalid instruction suffix for
head.s:165: Error: invalid instruction suffix forpop'
pop’
head.s:166: Error: invalid instruction suffix for
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
会看到
- Restore factory default configuration
- Read options from…
- Edit options
- Save options to…
- Restore the Bochs state from…
- Begin simulation
- Quit now
Please choose one: [6]
按回车
(0) [0xfffffff0] f000:fff0 (unk. ctxt): jmp far f000:e05b ; ea5be000f0
< bochs:1>
输入 c ,再回车,就可以看到运行结果了。
Linux 0.00 的编译和运行相关推荐
- Linux Kernel 0.01 的编译和运行
Linux Kernel 0.01 的编译和运行 本文操作环境均在 Linux 系统中实现. ===================================================== ...
- Linux 0.00 代码解析(一)
<Linux内核完全剖析>这本书在第4章给出了一个简单多任务内核示例程序,作者称之为Linux 0.00系统. 源码的下载地址和实验方法可以参考我的博文 http://blog.csdn. ...
- Linux 0.00简单多任务内核head.s超详注释
# head.s包含32位保护模式初始化设置代码.时钟中断代码.系统调用中断代码和两个任务的代码. # 在初始化完成之后程序移动到任务0开始执行,并在时钟中断控制下进行任务0和1之间的切换操作. LA ...
- 【解决方案】64位Linux系统下无法编译、运行32位C、C++程序的解决办法
[故障] 1. 从32位系统里面复制过来的32位C或C++程序无法运行,提示找不到程序文件,或找不到libstdc++.so.6库 [oct1158@oct1158-fedora 32env]$ ./ ...
- Xp下的程序编译成linux,WinXP下打造自己的linux 0.11简易编译环境(原创)
http://caiwei8888.blog.163.com/blog/static/3017424120101913353856/ 学习赵炯博士的<linux 0.11 内核完全注释>, ...
- Linux 0.00 Makefile 说明
关于Linux-0.00 的编译和运行可以参考我的博文:http://blog.csdn.net/longintchar/article/details/78757065 为了能在64位的Ubuntu ...
- Linux 0.00简单多任务内核boot.s超详注释
;标题:简单内核引导启动程序 ;作者:黄旭冬 ;程序描述: ; 该程序首先跳到0x07c00处,这是BIOS开始时将本程序加载到的位置, ; 然后本程序将内核代码(head.s代码)加载到0x1000 ...
- Linux下C程序的编辑,编译和运行以及调试
...
- C++(0)--mac 使用VScode 进行C++编译、运行、调试
mac 使用VScode 进行C++开发 1.查看编译器情况 2.安装插件C/C++,C/C++ Clang Command Adapte 3.新建一个C++ project 3.1.本地新建文件夹 ...
最新文章
- ×××生成算法的分析
- xampp中php连接mysql数据库乱码解决
- dvwa_xss_储存型
- js验证开始日期不能大于结束日期_Excel之日期与时间函数YEAR/MONTH/DAY/DATE/DATEFIF...
- Spring源代码学习之where is Bean instance created
- https://blog.csdn.net/weixin_40412037/article/details/112235003
- [APIO2009]抢掠计划
- 使用PowerShell和SQL的示例可用性监视服务的插图
- 基于windows PE文件的恶意代码分析;使用SystemInternal工具与内核调试器研究windows用户空间与内核空间...
- php搭建后台 xampp_你还在用wordpress?|搭建独一无二个人网络日志发布平台
- open cv+C++错误及经验总结(十三)
- 20171103_Python学习三周五次课
- 阅读之大量数据访问机器的架构优化
- 在控制台上看苹果手机的LOG
- 计算机上安装了更新ie版本,电脑ie浏览器版本过低怎么升级方法
- 常用通信光纤是如何分类的
- python学习——pandas查看数据集null值:isnull
- 【进程管理器】PM2应用进程管理器
- 唯芸星童鞋的第一个博客。
- 计算机平面设计基础 photoshop基本操作
热门文章
- NYOJ 269 VF
- 静态call 动态call LINK
- Codeforces 494E. Sharti
- 课后作业-阅读任务-阅读笔记
- C# WinForm 添加Windows Media Player 控件调试出现未能加载文件或程序集Interop.WMPLib,该怎么解决...
- 让PHP程序永远在后台运行
- 高性能jdbc封装工具 Apache Commons DbUtils 1.6(转载)
- VS.NET2005中的WEBPART初步(一)
- ubuntu16安装anaconda显示没有文件或那个目录
- 图像梯度处理MATLAB代码