• 孟祥毅🇨🇳Xiang...
    置顶
    2021-10-21
    P.S. 不想每次改完程序重启看效果的同学可以考虑用qemu来boot kernel,之前有两个同学给了solution,但是好像一个制作引导镜像的步骤有点问题,另一个没用grub,用的自定义的bootloader。我follow老师的课程做了个grub版的(包括怎么制作引导镜像)放在了github上 https://github.com/xymeng16/helloOS,不想深究直接make qemu-grub就可以用,想深究的话脚本也都在repo里面~之后我会把联合gdb调试的脚本也加进去,方便找bug...

    作者回复: 666666

    共 2 条评论
    4
  • royalfarmer
    置顶
    2021-09-25
    也来交个作业 既然是从0到1,建议像我一样的小白用户,全部代码自己动手写一遍,哪怕很多细节不懂,但从整体上会有一个感性认识,有了框架,后面慢慢补充相关知识,这样学的会更加牢固。 那些折腾虚拟机直接copy老师的代码,是高手玩的,需要有足够的基本功才玩的转。小白一定要先练好自己的基本功,手动抄代码是练基本功非常好的方法,看一遍和写一遍感觉完全不一样。 操作系统算是比较难的了,开始学习之前,自己得先有些基本的知识储备。 首先,要对Linux有基本概念,会在物理机上装Linux,知道Linux常用的命令,知道怎么在Linux里安装程序。 说下我的作业过程: 一、个人PC上直接装的Linux,版本是ubuntu。 二、在自己的家目录下新建一个HelloOS文件夹,在里面新建5个文件,文件内容照着老师给的源码全部手抄一遍,一定要仔细,一个字母都不能差: entry.asm (汇编文件,进行一些针对电脑硬件的操作) main.c (我们自己这个操作系统的主函数源代码,里面就一个printf函数,功能是我们这个操作系统运行时显示的那句话) vgastr.c (printf函数的具体实现代码,需要调用到显卡显存) vgastr.h (主函数的头文件) Makefile (make命令编译时遵照的格式文件) install.md (确切的说,这是一段代码,有没有这个文件都行,把代码补充到/boot/grub/grub.cfg 文件的末尾,目的是更新grub 引导程序的配置文件,让grub能找到我们的helloOS,评论里出现最多的找不到文件的问题,基本都是这段代码没写对,更确切说,就是那一句 multiboot2 /boot 或改为 multiboot2 / ) 三、途中可能会遇到几个问题 1 提示没有装nasm, 无法编译汇编文件 .asm,解决方法,直接根据系统提示,输入命令安装该程序 2 提示make不是命令,无法编译,解决方法,直接根据系统提示,输入命令安装该程序 3 源代码抄写错误,都会有提示具体在哪个文件哪一行,写错字符,缺少横杠,字符大小写等(我甚至都没有用编辑器,抄起来确实比较痛苦,但完成后的成就感也更大) 四、补充一个细节,确认完挂载点后,记得把helloOS.bin文件放到挂载点的目录下,要不然,即使grub.cfg配置写对了,仍然会提示找不到文件。 五、有个小问题没搞明白,为啥我生成的helloOS.bin 文件的首字母是小写的?我看别人的截图都是大写的,不过这个貌似不影响系统启动。
    展开

    作者回复: 最后一个问题 看一下代码 可改的

    共 2 条评论
    7
  • De_sword
    置顶
    2021-09-10
    补充一点对于内核文件路径设定的方案。 尝试过@Vic, @陈诚 , 的方案。 进入过grub模式查看硬盘下的路径,但是仍然遇到error : file '/boot/HelloOS.bin' not found的问题。 因此,我这边参考了grub.cfg里面,“Ubuntu”的设置: menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-c2b35b75-3fa4-4021-b628-65742342045e' {         insmod gzio         insmod part_msdos         insmod ext2         set root='hd0,msdos1'         initrd  /initrd.img-4.4.0-57-generic } 可以发现,默认载入时就已经以/boot为根目录, 因此,我也照葫芦画瓢,没有额外设定/boot目录。 重新启动,就可以成功运行HelloOS内核了。

    作者回复: 是的 要看看你的boot目录的挂载路径

    
    2
  • 不安好心
    置顶
    2021-08-25
    有一个疑问,汇编代码那里: ;重新加载 GDTlgdt [GDT_PTR] jmp dword 0x8 :_32bits_mode 这里明明没有开启保护模式,为什么能这样跳转,而且经验证,也确实使用了gdt。 但是实模式不是cs << 4 + offset进行寻址吗?

    作者回复: 因为GRUB已经在保护模式下了

    
    1
  • 喜欢吃鱼
    置顶
    2021-07-13
    实验注意几个关键问题。 - 将作者提供的代码git到本地; - 安装nasm、gcc等工具,否则make不通过。随后执行“make -f Makefile”,得到HelloOs.bin; - 在/boot/grub/grub.cfg中添加如下引导内容: ```shell menuentry 'HelloOS' { insmod part_msdos #GRUB加载分区模块识别分区 insmod ext2 #GRUB加载ext文件系统模块识别ext文件系统 set root='hd0,msdos1' #注意boot目录挂载的分区,这是我机器上的情况 multiboot2 /boot/HelloOS.bin #GRUB以multiboot2协议加载HelloOS.bin boot #GRUB启动HelloOS.bin } ``` - ```she #其中set root='hd0,msdos1'根据/boot挂载的实际情况填写,如我的机器是: ubuntu@ubuntu-virtual-machine:~$ df /boot Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda1 20509264 7482912 11961496 39% / ``` - 将HelloOs.bin拷贝到/boot/目录; - 重启机器,vmvare长按shift进入引导页面,可以看到HelloOS,选择HelloOS进入。
    展开

    作者回复: 对的

    共 2 条评论
    16
  • Freddy
    置顶
    2021-05-24
    我用的是CentOS 7虚拟机,有点不一样: 环境说明: gcc --version gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44) [root@node01 ~]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) 下面是添加HelloOS启动项的流程: 1.在/etc/grub.d/40_custom文件中,添加HelloOS在grub2中的配置 #!/bin/sh exec tail -n +3 $0 # This file provides an easy way to add custom menu entries. Simply type the # menu entries you want to add after this comment. Be careful not to change # the 'exec tail' line above. #以下是添加内容 menuentry 'HelloOS' { insmod part_msdos #GRUB加载分区模块识别分区 insmod ext2 #GRUB加载ext文件系统模块识别ext文件系统 set root='hd0,msdos1' #注意boot目录挂载的分区,这是我机器上的情况 multiboot2 /HelloOS.bin #GRUB以multiboot2协议加载HelloOS.bin boot #GRUB启动HelloOS.bin } 2.重新生成/boot/grub2/grub.cfg文件 [root@node01 grub2]# grub2-mkconfig -o /boot/grub2/grub.cfg 3.重启VM,即可在grub引导项中看到多了HelloOS
    展开

    作者回复: 你好,你这样操作也是对的

    共 10 条评论
    9
  • Shinymimiq
    置顶
    2021-05-22
    我测试了一下M1的Mac也是能跑起了HelloOS的,虽然坑比较多。我大致总结了一下步骤: 首先需要安装x86版的homebrew 用Rosetta 打开iTerm 然后安装x86的homebrew `arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"` 接下来是重点, Apple自带的C/C++工具链是clang,外加用的linker和GUN linker不兼容,没办法使用课程中提供的linker script,所以我们需要编译安装x86的gcc工具链,顺便可以把nasm和qemu给装了 ``` /usr/local/bin/brew tap nativeos/i386-elf-toolchain /usr/local/bin/brew install i386-elf-binutils i386-elf-gcc nasm qemu ``` 安装完成之后确认一下我们的gcc和ld ``` /usr/local/Cellar/i386-elf-gcc/9.2.0/bin/i386-elf-gcc /usr/local/Cellar/i386-elf-binutils/2.31/bin/i386-elf-ld ``` 接下来的步骤我参考了Viz的评论,代码是在 `https://github.com/vizv/learn\_os/tree/master/hello-os` 可以手动修改Makefile里面的宏 ``` ASM := /usr/local/Cellar/nasm/2.15.05/bin/nasm CC := /usr/local/Cellar/i386-elf-gcc/9.2.0/bin/i386-elf-gcc LD := /usr/local/Cellar/i386-elf-binutils/2.31/bin/i386-elf-ld ``` 顺带一提,我使用iTerm跑还需要在qemu命令上加上-nographic,不然好像没法退出 ``` qemu-system-x86_64 -nographic -curses -drive 'file=$<,format=raw,index=0,media=disk' ``` 然后直接`make all`就可以运行我们的hello-os了
    展开

    作者回复: 你好,感谢你的分享,m1的同学有福了

    共 6 条评论
    55
  • 青玉白露
    置顶
    2021-05-21
    写了一个基于Vmare和Ubuntu16.04的详细教程,只要手头有电脑就可以运行,大家可以看看: https://zhuanlan.zhihu.com/p/373996858

    作者回复: 谢谢

    共 5 条评论
    11
  • Viz
    置顶
    2021-05-15
    我也搞了份不需要 GRUB 可以直接用 QEMU 或者其他虚拟机软件跑的版本 https://github.com/vizv/learn_os/tree/master/hello-os 克隆仓库后在 hello-os 目录里 只编译链接并创建镜像: make hello-os.img 编译链接并创建镜像后用 QEMU 启动磁盘镜像: make

    编辑回复: 6666,佩服佩服,感谢你的分享!教学相长,期待之后课程里,你还有更多的输出。

    共 9 条评论
    36
  • Strangeen🚁
    置顶
    2021-05-15
    我是小白,只会java,没学过c,当时也只是抱着了解下操作系统的想法报了课程,学到第2课,发现完全听不懂... 不过跟着课程和陈诚的博客走(https://blog.csdn.net/chenchengwudi/article/details/116707122),然后下载了老师的代码,最终居然还是跑出Hello OS!来了,虽然还不太明白汇编、Makefile、hello.lds代码的含义... 看来又多了一份学下去的信心了! 我是在mac pro(os 10.15.6)上使用parallel安装的ubuntu kylin 18.04,这里我要对像我这样的小白说3个点: 1、安装nasm,才能执行make 先安装nasm:sudo apt-get install -y nasm 然后在HelloOS目录下执行:make -f Makefile 就可以得到HelloOS.bin文件了 2、一定要按照陈诚的博客的2.1中配置下启动项,不然无法选择HelloOS菜单 先修改文件:/etc/default/grub 然后执行:sudo update-grub 3、menuentry直接添加到grub.cfg文件的末尾即可

    作者回复: 你太用功了

    共 18 条评论
    77