• 【linux 0.11 学习记录】一、环境配置,用Bochs输出hello world


    – 2023/11/07 关于学习环境

    最简单的方法是用linux编译,哈工大提供了一站式编译运行调试环境,已经比较成熟,网上相关教程很多。也可以直接搜实验楼,有相应课程在线平台用
    爱折腾的也可以尝试使用这个仓库的windows版本
    本文的方法暂时放弃折腾了,修改配置后bochs用vs怎么都编译不成功,会导致无法启用源码级调试,默认的调试方式有点太简陋了。而且我不知道windows下如何使用as编译器,这会使得难度增加。(这两个问题在linux下不存在…)
    文章还有一点参考价值,可以作汇编练习用途。打不少字,就不删除了。。


    想学习linux,又不知道从哪里下手,体系太大,哪块内容都很多,无奈下选择了linux0.11作为入口,本系列将是学习笔记,希望能坚持下去吧

    环境配置

    • 这里使用win10+bochs2.7

    安装bochs

    • 官网:https://bochs.sourceforge.io,需要使用oldlinux提供的bochs linux0.11编译环境的话就安装2.1版本,这里安装了2.7(不兼容)
    • 安装目录新建个环境变量BXSHARE,并且也把该目录添加到环境变量Path中,文件定位和命令行工具用
      在这里插入图片描述

    编译环境

    安装nasm

    • 官网:https://nasm.us
    • 安装目录添加到环境变量Path中,到此可以做些汇编实验了

    安装cygwin64

    • 官网:https://www.cygwin.com
    • 选择从互联网安装,下载站点随意,找到makegcc工具,安装后把bin目录添加到环境变量,这里均选择了最新版本
    • 因为能编译gcc的原版本太低了,好像是1.4,也有用3.4的,冒出来个大胆的想法,看是否能够移植到最新的gcc11上来(可能不行,但肯定也能学到不少东西),,,
    • 也有现成的boch编译环境可以用,需要安装boch2.1版本(和2.7不兼容),这里oldlinux.org下载链接提供一个bochs2.1的搭建好的linu0.11环境,也包含安装包,安装bochs后把其他文件都拷贝到安装目录就可以用了。里面已经移植了gcc1.4,里面也提供了linux0.11源码,做少量改动就可以编译,使用参考博文链接, 做的工作基本是把/linux/Makefile、/linux/fs/Makefile、/linux/lib/Makefile、/linux/kernel/Makefile、/linux/kernel/math/Makefile、/linux/kernel/blk_drv/Makefile、/linux/kernel/chr_drv/Makefile中的mstring-insns字段删除,并把/usr/local/bin中的ar改名为gar

    其他资源

    hello world程序

    • 在自己的工作目录新建软盘
    bximage
    
    • 1

    在这里插入图片描述

    • 在自己的工作目录新建一个boot.asm文件
    org 07C00h                   ; 告诉编译器程序加载到07C00处
           mov ax, cs
           mov ds, ax
           mov es, ax
           call DispStr                    ; 调用显示字符串例程
           jmp $              ; 无限循环
    DispStr:
           mov ax, BootMessage
           mov bp, ax                    ; es:bp = 串地址
           mov cx, 16                    ; cx = 串长度
           mov ax, 01301h            ; ah = 13, al = 01h
           mov bx, 000Ch              ; 页号为0(bh = 0) 黑底红字 (bl = 0Ch,高亮)
           mov dl, 0
           int 10h                          ; 10h号中断
           ret
    BootMessage:  db "Hello,OS world!"
    times 510-($-$$)   db   0            ; 填充剩下的空间,使生成的二进制代码恰好为512字节
    dw 0xaa55
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 编译
    nasm boot.asm -o boot.bin
    
    • 1
    • 写入软盘镜像,dd命令用于数据拷贝,if指定输入文件,of指定输出文件,bs指定每次读取和写入的数据块大小,count指定需要拷贝的数据块数量,conv=notrunc表示在写入输出文件时不覆盖(不截断)原有其他数据,即只覆盖写入的部分
    dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
    
    • 1

    在这里插入图片描述
    打开a.img可以看到boot.bin被写入了最前面
    在这里插入图片描述

    • 编写bochs配置文件test.bxrc,这里用到了上面配置的环境变量$BXSHARE
    # how much memorythe emulated machine will have  
    megs: 32  
       
    # filename of ROMimages  
    romimage:file=$BXSHARE/BIOS-bochs-latest
    vgaromimage:file=$BXSHARE/VGABIOS-lgpl-latest
       
    # what disk imageswill be used  
    floppya:1_44=a.img, status=inserted  
       
    # choose the bootdisk.  
    boot: floppy  
       
    # where do we sendlog messages?  
    log: bochsout.txt  
       
    # disable themouse  
    mouse: enabled=0  
       
    # enable keymapping, using Us layout as default  
    keyboard:keymap=$BXSHARE/keymaps/x11-pc-us.map
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 启动bochs,不用-f参数指定配置文件时需要手动Load配置文件,有-f参数直接回车即可
      在这里插入图片描述
      可以看到hello world已经输出
      在这里插入图片描述

    参考1:https://www.cnblogs.com/oasisyang/archive/2021/09/30/15358137.html,bochs一个hello world示例

  • 相关阅读:
    使用openssl生成SAN证书 多个注意点
    JS 中的各种距离 scrollTop?clientHeight?
    什么是SVG(可缩放矢量图形)?它与普通图像格式有何不同?
    【表情包分享】国庆假期结束了,该上班了,来分享一下你的表情包吧!
    glTF 中基于物理的渲染(PBR)
    “index“ should always be multi-word
    Filter过滤器及HttpServletRequest和HttpServletResponse
    软件安全测试
    Elasticsearch:什么是向量和向量存储数据库,我们为什么关心?
    Java Integer compareTo()方法具有什么功能呢?
  • 原文地址:https://blog.csdn.net/a1058191679/article/details/133879808