在已有的Linux操作系统中,安装另一个开源操作系统,我们一般是先构建新操作系统的chroot基础环境,然后chroot进入新构建的操作系统环境来安装和配置。这种构建和安装操作系统的方法,对于我们学习和研究操作系统结构和原理应该说比较重要。本文举了简单的例子,以Fedora Core 5.0 为基础,通过chroot来构建Slackware 10.2;
1、chroot方式安装操作系统的目的和用途
chroot 工具是Linux操作系统都具备的工具,从表面的意思看,chroot 是从一个/根到另一个/根。在一个Linux操作系统中安装另一个操作系统,就是利用chroot的这个特点。首先创建chroot运行的基础环境,然后通过chroot到新的/根,然后再用相应的软件包管理工具把新的操作系统其它软件包安装上;
几乎所有的开源操作系统都可以用chroot的方法来安装,比如Gentoo 、LFS及CRUX比较常用chroot;通过chroot安装操作系统,好象堆积木一样,一块一块的把操作系统安装起来,所以Gentoo和LFS的Fans特别有成就感。呵,也说是操作系统全手工打造,成就感自然不言而喻了;
天极软件专题专区精选
Windows Vista专区 POPO专区 QQ专区QQ挂机 注册表专区 Windows优化
Flash MX 视频教程 Photoshop视频教程 网页设计视频教程 照片处理数字暗房
PPT动画演示教程 Excel动画教程集 Word动画演示教程 Google专区
特洛伊木马专区 黑客知识教程专区 防火墙应用专区 了解Web2.0
Windows API开发专区 网络编程专区 VB数据库编程专区 图像处理与多媒体编程
通过chroot安装操作系统,我们能学到什么呢?主要是能知道一个操作系统最少需要多少部件可以“动”起来,以及了解一个操作系统需要哪些基础的必备的“部件”,这对开发自己的基于Linux操作系统以及了解操作系统的构成及原理是比较重要的;
2、通过chroot 方式安装操作系统所需要的系统环境
最根本的环境是是在您的机器有得有一个能运行的Linux操作系统或一个LiveCD;
3、通过chroot 安装操作系统的流程
要下面几个流程:
一、规划硬盘分区或创建映像文件;请参考:
二、创建文件系统;
三、挂载文件系统;
四、安装基础系统;主要通过解压软件包来实现;
五、修改新系统的配置文件,比如 位于新系统中的/etc/fstab
六、解决依赖关系,安装软件包管理工具;
七、通过chroot进入新系统;
八、通过新系统的软件包我管理工具来安装其它软件包;
九、处理引导问题,比如GRUB引导之类的
4、操作系统安装安装目的地的介质说明;
一个操作系统可以安装在物理硬盘中,也可以安装在一个映像文件中;安装在物理硬盘中大家都能理解。安装在一个映像文件中怎么理解呢?比如通过VMWARE来虚拟安装操作系统是不是安装在一个文件中呢?是的,和这个意思差不多; 再说一点,交换分区swap 也可以是文件;再比如Xen虚拟操作系统就可以安装在文件映像中;
安装在映像文件中的操作系统,可以用来学习,通过chroot访问,也可以通过xen来虚拟等 ... ... 还可以做成类似file.iso的形式来存储文件等;
5、实说简说在Fedora 中安装Slackware 10.2;
本例是在Fedora Core 5.0 中通过chroot 安装Slackware 10.2,安装目的地的介质分为两种,一种是物理硬盘;一种是映像文件。安装在物理硬盘的可以通过GRUB或LILO等引导管理器来独立真实运行,安装在映像文件中的能通过chroot访问或Xen虚拟运行;
5.1 通过chroot 安装Slackware 10.2 到一个硬盘物理分区中;
这个过程好象是有点多余,但写一写也好,这是大多开源操作系统的安装都通用的,也是最原始、最有效的方法,也就是说在一个已有的操作系统环境中安装另一个操作系统;
挂载文件系统就是通过mount 来挂载;
举例:
比如我的硬盘/dev/hda5是空白分区,并且我想创建/dev/hda5为ext3文件系统,并且把它挂载到 /mnt/slack目录中,然后通过chroot来安装Slackware 10.2;
第一步:您要通过分区工具fdisk 或parted来规划您的分区
第二步:创建文件系统;
[root@localhost
~]#mkdir /mnt/slack
[root@localhost ~]# mkfs.ext3 /dev/hda5 注:格式化/dev/hda5为ext3文件系统;
第三步:挂载文件系统;
[root@localhost ~]# mount /dev/hda5 /mnt/slack 注:挂载/dev/hda5到 /mnt/slack目录;
第四步:挂载slackware 10.2 光盘的第一张,安装基础系统;
[root@localhost
~]# mount -o loop slackware-10.2-install-d1.iso /mnt/cdrom/
我们可以先在/mnt/slack目录中创建一个软件包存放目录,用于存放slackware-10.2-install-d1.iso中的所有内容;
[root@localhost
~]#mkdir /mnt/slack/pack
[root@localhost ~]# cp -rp /mnt/cdrom/* /mnt/slack/pack
然后把slackware 第一张盘中的slackware目录中的a目录中的所有包都进行解压缩,以及d目录中glibc开头的包,d目录中的zlib以及zsh 并且把解出来目录,比如 /usr、etc、lib等所有目录都复制到 /mnt/slack中;
第五步:解决依赖关系;
如果我们运行下面的命令提示没有/bin/bash这个文件时,我们要解决依赖关系;通过解决依赖关系,也会发现运行chroot所需要的必备的基础软件包;
[root@localhost
~]# chroot /mnt/slack
如果提示缺少一些文件,我们可以自行判断缺少哪些包;当我们进入/mnt/slack/bin目录发现,的确没有bash这个文件,所以我们要复制一个bash过去;
[root@localhost
~]# cd /mnt/slack/bin
[root@localhost bin]# cp bash2.new bash
这时我们还要判断 bash 所依赖的库文件;
[root@localhost
bin]# ldd bash
出来的依赖关系,大多是glibc的,glibc被安装在了/mnt/slack/lib/tls目录中,我们可以根据提示一个一个的做链接。少什么东西就做什么的链接;要看/mnt/slack/lib中是否有glibc的文件,然后做链接。如果是存放在tls目录中的,也要链到/mnt/slack/lib中。链接时要用相对路径,不能用绝对路径;
创建链接文件和在Windows创建快捷方式比较相似,用ln 命令;
#ln -s 原文件名 新文件名
什么才算解决了 bash的依赖关系了呢?直到能chroot /mmt/slack才算成功;
第六步: chroot成功,进入Slackware系统;
chroot 成功后,我们就能进入Slackware系统,然后通过pkgtool 或installpkg 工具来安装其它的软件包,比如 内核什么的;
[root@localhost
~]# chroot /mnt/slack
第七步;更改/etc/fstab文件;
如果要让一个操作系统独立运行,非得写一写/etc/fstab文件,对于这个您可以参考,比如 下面的这个例子,您改一改就可以用了;
/dev/hda7
swap swap defaults 0 0
/dev/hda6 / reiserfs defaults 1 1
/dev/hda1 /mnt/winc
ntfs ro 1 0
/dev/hda3 /mnt/wind vfat defaults 1 0
/dev/cdrom /mnt/cdrom
auto noauto,owner,ro 0 0
/dev/fd0 /mnt/floppy auto noauto,owner 0 0
devpts
/dev/pts devpts gid=5,mode=620 0 0
proc /proc proc defaults 0 0
none /sys
sysfs defaults 0 0
第八步:引导系统;
要通过GRUB或LILO引导管理器实现对Slackware的引导;
5.2 通过chroot把Slackware 10.2安装在一个映像文件中;
第一步:创建映像文件;
比如 我们创建一个名为slack.img的映像文件,体积为2G的,就可以用下面的命令;bs是每个块的大小为1M,共创建2000块;
[root@localhost
~]# dd if=/dev/zero of=slack.img bs=1M count=2000 seek=1024
第二步:创建文件系统;
我们可以创建为ext3、fat32或reiserfs等文件系统,创建文件系统,
[root@localhost
~]# /sbin/mkfs.ext3 slack.img
mke2fs 1.38 (30-Jun-2005)
slack.img is not
a block special device.
Proceed anyway? (y,n) y
第三步:挂载已被格式化映像文件;
[root@localhost
~]# mkdir /mnt/slack
[root@localhost ~]# mount -o loop slack.img /mnt/slack/
第四步以后和物理硬盘操作基本相同,省略过去;
6、有关软件包rpm、tgz、deb等软件包提取;
发行版都有一定的软件包格式,比如 file.rpm 、file.deb或file.tgz或file.tar.gz等;rpm格式的软件包,一般基于Redhat或Fedora为基础开发的都采用RPM格式。因为chroot安装操作系统,首要的是从一个软件包中提取文件,然后复制到文件系统中,所以提取文件工具也得做一点解说;
6.1 从rpm软件包抽取文件;
操作的前提是得有rpm的管理工具,也就是说得有rpm等相关命令;
命令格式: rpm2cpio file.rpm |cpio -div
举例:
[root@localhost
RPMS]# rpm2cpio gaim-1.3.0-1.fc4.i386.rpm |cpio -div
抽取出来的文件就在当用操作目录中的 usr 和etc中;
其实这样抽到文件不如指定安装目录来安装软件来的方便;也一样可以抽出文件;
为软件包指定安装目录:要加 -relocate 参数;下面的举例是把gaim-1.3.0-1.fc4.i386.rpm指定安装在 /opt/gaim 目录中;
[root@localhost
RPMS]# rpm -ivh --relocate /=/opt/gaim gaim-1.3.0-1.fc4.i386.rpm
Preparing...
########################################### [100%]
1:gaim ###########################################
[100%]
[root@localhost RPMS]# ls /opt/
gaim
这样也能一目了然;gaim的所有文件都是安装在 /opt/gaim 中,我们只是把gaim 目录备份一下,这样其实也算提取文件的一点用法;
6.2 file.tgz、file.tar.gz和file.tar.bz2的提取;
[root@localhost
~]# tar zxvf file.tgz
[root@localhost ~]# tar zxvf file.tar.gz
[root@localhost
~]# tar zxvf file.tar.bz2
6.3 file.deb的提取;
[root@localhost
~]# ar x file.deb
[root@localhost ~]# tar zxvf data.tar.gz
file.deb通过ar x 来解包,然后再把data.tar.gz解开就看到相关的目录和文件了;
6.4 file.iso文件的提取;
这样的文件在Linux主要通过mount -o loop file.iso 挂载地址;比如 ;
[root@localhost
~]# mount -o loop slackware-10.2-install-d1.iso /mnt/cdrom/
7、chroot 成功切入新的操作系统后的软件安装问题补充;
如果通过chroot能进入新安装的操作系统,我们就可以新操作系统的软件包管理工具来安装其它软件包了,比如 Slackware 用的是pkgtool 或installpkg工具;Fedora 用的是 rpm 等工具;大多发行版所用的工具不尽相同,以发行版为准 ;
8、关于本文;
在去年的时候就想写此文,随着时间的推移,今天想起来的事情可能明天就忘的差不多了,所以用到chroot的时候就想写,用不到的时候就把写文档的事扔到一边。今天正好写关于Xen的文档,也恰恰用到chroot方式安装新的操作系统,所以“被迫”中写了一篇。虽然涉及chroot的功用少了点,但大体上还是把chroot说了差不多了;可能本文的名字有点不符合,我也不知道用什么命名标题不好。
B. 如何从零开始写一个简单的操作系统
如何从零开始写一个简单的操作系统?
看了这个:从零开始写一个简单的操作系统 求指教。
知乎用户 学生生涯只剩半年。
548 人赞同
终于可以来回答这道题了……
一年多前,也就是大一下学期末的时候,我看到这个问题下 @fleuria 叔的答案,然后看了 F 叔给的这个链接 基于 Bochs 的操作系统内核实现 ,当然是什么都看不懂,除了惊诧之外也了解了一件事情:一个人写一个简单的操作系统内核是一件非常帅气并且可行的事情。
于是我开始写了,那时候我的水平大概是:只会做 C 语言的习题,编译的话只知道按 F9,汇编知道常见的指令,另外会一点点的 Win 32 编程,能流畅使用 Windows。
一开始我找了《30 天自制操作系统》来看,每天看书,然后把从书里把代码打出来,一次一次地编译运行。因为要同时写汇编和 C,所以从那时候起就开始用 vim。
在啃完了差不多半本书后,开始觉得没意思了……因为觉得作者为了让内容更简单而省略了太多细节。也看了于渊的《Orange‘s 一个操作系统的诞生》,依然没看下去:汇编用得太多了。期间也曾斗胆发邮件给 F叔,然后他推荐了 Bran's Kernel Development Tutorial 这个教程,于是我就从这教程重新开始了: 「30天自制操作系统」 Stop & 「OS67 」 Start
那时候大概是大二上学期,于是在 github 上又开了一个 repo,一开始在 Windows 下开发,后来又切换到了 Linux 下,因为 Bran's 用的 bootloader 是 Grub,不符合我的初衷,所以就自己写了一个,之后便跟一路教程写,跨过了保护模式这道坎,完成了基本的设备驱动。
在完成 Bran's 后,我又部分参考了 写一个操作系统内核有多难?大概的内容、步骤是什么? - To浅墨的回答 中推荐的:hurley25/hurlex-doc · GitHub 文档,完成了一些简单的调试函数和库函数,printk 和内存分配。
事实证明,尽早写好调试函数诸如 panic, assert 和 printk 是非常重要的。 大量地使用有助于你尽快地发现 bug (当然前提是这些函数本身不能有 bug)。
看完了 hurlex-doc 该看的部分后,很长一段时间了都不知道该干嘛好,模仿 hurlex-doc 里的内核线程切换也一直出错。这一情况一直持续到我开始读 Xv6, a simple Unix-like teaching operating system 。
如果你去看知乎关于「自制内核」的问题,你会发现 xv6 被反复地提及并推荐,事实上它非常值得被推荐:这是我读完大部分代码之后真切体会到的。
之前的 Bran‘s 和 hurlex-doc 的篇幅都比较小,我是在电脑和 kindle 上看完的,xv6 相对来说代码量比较大,有 9000+ 行和一份文档,之后我又找到了这个:ranxian/xv6-chinese · GitHub xv6 文档的中文译版,所以我就去花了十二块钱学校打印店打印了一份中文文档和一份代码。这又是一个正确的决定,让我不必对着电脑就能看代码。
在之后的时间里,我先读了 xv6 中文件系统相关的部分,然后改写它的代码为我的内核添加了一个 类似 Minix 的文件系统。 然后几乎又照抄了其中了进程调度的部分(做了部分简化),又在原来的代码基础上为添加操作系统的接口,接着写用户程序,过程几乎是「一路顺风」。看 xv6 的那段时间也经常是处于醍醐灌顶的状态。
最后我终于在差不多一个月前完成了这个简陋的操作系统内核:
LastAvenger/OS67 · GitHub (没错其实我是来骗 star 的)
历时一年,一路点亮了不少技能树(虽然都点得不好),这样算是「从零开始写一个简单的操作系统」么? 跟进一步说,有谁不是从零开始的呢?所以想做的话,现在就开始做好了。
这是被「翻烂」了的 xv6 源代码和中文文档(其实是放书包里被磨烂了)
「故事」讲完了,接下来说一点经验之谈吧……
* 知乎上总是有人在讨论「做一个玩具编译器和做一个玩具内核何者更有趣」之类的问题,然后总有各种大V 跳出来说内核有多 dirty 而编译器多 clean,事实上除了 CPU 上的几个表因为历史原因长得恶心一点,内核并没有什么特别 dirty 的地方,另外,想做点什么打发时间,不过是两个代码量稍多的入门项目,有什么好纠结的?
* 写内核的过程中,你会接触到一些这辈子大概只会用到一次的知识,A20 线已经成为历史,日常的编程里面也不需要你懂得 GDT IDT 的结构。但是单凭内核主要部分部分(文件系统,进程,内存)给你带来的知识而言,这点冗余是值得的。
* 尽早实现调试函数并大量使用,善于利用 bochs 的内置调试器,能省下你不少时间。
* 有时候觉得书里的做法非常奇怪,你觉得你有更好的做法,一般是你想错了。(当然只是一般)
* 上面说看 xv6 一路顺风是假的,20% 时间在抄代码,80% 的时间用来调试。
* 对我这种能力一般的人来说,「写内核」只是好听的说法,正确的说法是「抄内核」。当然,就算是抄一个,也算是受益匪浅了。
* 抄 xv6 的好处在于,即使你的代码出错了,你可以坚信,正确的答案肯定在 xv6 的代码里,或许只是你还没理解透而已,只要不断地看和理解,你就离正确的道路越来越近。
最后,感谢 @fleuria 在微博和邮件里的多次帮助, @To浅墨 的 hurlex-doc 文档,鲜染同学翻译的 xv6 中文文档, @郭家华 完美地解答了我一开始的疑问,让我在内核中得以使用 C 语言。
在 #archlinuxcn 频道里也得到了很多人的帮助。
发布于 2015-11-09
邱永臣 喜剧演员,兼开发工程师
890 人赞同
大二的时候,老师(中山大学万海)对我们说:“如果有谁能自己写一个内核出来,那么,他平时可以不来听课,也不用做平时作业,做出来还能加分,怎么样,有没有人有兴趣?”
和老师一番讨价还价之后,我成为全年级几百号人里唯一一个自己写内核/整个学期都不去教室听课/任何作业都不做的那个人(代表着我的身边将没有可以提供参考的人,任何资料都只能自己找)。
一开始买了《30天自制操作系统》,上面写着需要软盘还有其它的模拟器,我的初衷是写一个可以烧在真机上一按开机键就能跑起来的那种,所以看了几页后就丢开了。后来又找了国人写的一本,也不是特别符合,也丢开了。
这时我看到了那本教材(俗称绿宝书),约莫800页。之后的两个星期里,我每天泡图书馆,以每小时10页的速度读完了它,在上面乱涂乱画了许多标记。800页的英文书,我从中学到了大量的基本概念(线程进程,内存算法,寻址方式等等)。
接着我寻思直接从网络上而不是从书上寻找资料,TA师兄给我提供了一个OS Development,我照着上边的例子,写了数以千记的汇编代码,习得了汇编技能。
此时,我具备基本的概念知识,对程序的语言也已经理解,知道了虚拟机的调试方法,差的,就只有对内核整体是如何协作不太明白。于是我去找来老师用于教学的PintOS,找来MIT那个项目的代码,还有国内一个高校自制的OS(是几个研究生一起写的),仔细研究了一遍,最后开始写代码。
在那个学期里,我放弃了LOL,一心看代码,写内核,写各种模块,将过程记录在博客上,花了三个月的时间,最终写出一个具备terminal的内核(文件系统没写好,时间不够),可以跑命令,运行函数,管理内存和进程,处理中断。
--------------------------
这个Tittle非常好,衷心希望不要因为莫须有的理由封杀。
C. 我们中国有自己电脑操作系统么使用效果如何
1、中国第抄1款操作系统 opendesktop 1.0 rc版
也是国产的第袭一个桌面操作系统,有点longhorn又有点linux风味.
(longhorn我装过,硬件配置要求比较高,一般机器装不来)
2、中国的第2款操作系统:银河麒麟
我找了N久的东西,终于给我找到了,有兴趣的朋友也请一并安装测试吧~~
银河麒麟操作系统由863软件重大专项资助,简称KYLIN操作系统。KYLIN操作系统是参照UNIX操作系统国际主流标准,针对服务器需求,设计并开发的具有自主版权的中文服务器操作系统。它支持多种微处理器和多种计算机体系结构的,具有高性能、高可用性与高安全性,并与Linux应用二进制兼容。
2、中国的第3款操作系统:红旗Linux
4、中国的第4款操作系统:中软Linux。
5、中国的第5款操作系统:XteamLinux就是冲浪 。
6、第6款操作系统:Linux2005。
D. 如何编写Linux操作系统的设备驱动程序
Linux是Unix操作系统的一种变种,在Linux下编写驱动程序的原理和
思想完全类似于其他的Unix系统,但它dos或window环境下的驱动程序有很大的
区别.在Linux环境下设计驱动程序,思想简洁,操作方便,功能也很强大,但是
支持函数少,只能依赖kernel中的函数,有些常用的操作要自己来编写,而且调
试也不方便.本人这几周来为实验室自行研制的一块多媒体卡编制了驱动程序,
获得了一些经验,愿与Linux fans共享,有不当之处,请予指正.
以下的一些文字主要来源于khg,johnsonm的Write linux device driver,
Brennan's Guide to Inline Assembly,The Linux A-Z,还有清华BBS上的有关
device driver的一些资料. 这些资料有的已经过时,有的还有一些错误,我依
据自己的试验结果进行了修正.
一. Linux device driver 的概念
系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统
内核和机器硬件之间的接口.设备驱动程序为应用程序屏蔽了硬件的细节,这样
在应用程序看来,硬件设备只是一个设备文件, 应用程序可以象操作普通文件
一样对硬件设备进行操作.设备驱动程序是内核的一部分,它完成以下的功能:
1.对设备初始化和释放.
2.把数据从内核传送到硬件和从硬件读取数据.
3.读取应用程序传送给设备文件的数据和回送应用程序请求的数据.
4.检测和处理设备出现的错误.
在Linux操作系统下有两类主要的设备文件类型,一种是字符设备,另一种是
块设备.字符设备和块设备的主要区别是:在对字符设备发出读/写请求时,实际
的硬件I/O一般就紧接着发生了,块设备则不然,它利用一块系统内存作缓冲区,
当用户进程对设备请求读/写时,它首先察看缓冲区的内容,如果缓冲区的数据
能满足用户的要求,就返回请求的数据,如果不能,就调用请求函数来进行实际
的I/O操作.块设备是主要针对磁盘等慢速设备设计的,以免耗费过多的CPU时间
来等待.
已经提到,用户进程是通过设备文件来与实际的硬件打交道.每个设备文件都
都有其文件属性(c/b),表示是字符设备还蔤强樯璞?另外每个文件都有两个设
备号,第一个是主设备号,标识驱动程序,第二个是从设备号,标识使用同一个
设备驱动程序的不同的硬件设备,比如有两个软盘,就可以用从设备号来区分
他们.设备文件的的主设备号必须与设备驱动程序在登记时申请的主设备号
一致,否则用户进程将无法访问到驱动程序.
最后必须提到的是,在用户进程调用驱动程序时,系统进入核心态,这时不再是
抢先式调度.也就是说,系统必须在你的驱动程序的子函数返回后才能进行其他
的工作.如果你的驱动程序陷入死循环,不幸的是你只有重新启动机器了,然后就
E. 如何才能自己写一个简单的linux操作系统
只要你学过汇编和C,只满足于写个“简单的操作系统",一两天就能搞定。
随便把你写过的小程序,用直接写硬盘软件(或者自己编一个,调用winapi的WriteFile函数就可以),写进硬盘/U盘引导区。记住,起始地址是7c00。
这就好了。注意,引导区只有440个字节给你用,程序不能太大,所以这部分基本要用汇编写。440字节后面是硬盘/U盘分区信息,不可以乱动。乱动以后bios可能没法识别硬盘/U盘。
引导区最后两个字节必须是55AA,不过一般你不用管,硬盘/U盘格式化的时候都已经给你写好了。
这样你的程序就在开机的时候直接运行了。
想调用大程序也没问题,你需要写个不超过440字节的程序,负责把第二个扇区的内容载入内存并执行,由第二个扇区的代码负责把所有代码载入内存。后面的部分用C写或者别的高级语言写都没什么问题了。
至于你想要具体作什么,就写什么,屏幕上画个画,管管硬盘上的文件,和用户互动一下,你随意。和你平常写程序没啥两样。总之一个能完成任务的简单操作系统就完事了。
最多几天时间你就能搞定。这差不多能搞个接近dos1.0的“简单操作系统”。
不过接下来才是你真正要学的。例如文件管理,内存管理,保护模式,进程管理啥的。麻烦归麻烦,但解放了自由了,终于可以编写内核态才准用的代码了,做的事情全部都是用户态下面不让做的事情。操作系统的学习,从这里才算真正开始。
F. 如何从零开始写一个简单的操作系统
题主你好,如何写一个简单的操作系统,不是三言两语能够讲清楚的,也不是一两行代码就可完成的。
要完成一个简单的操作系统,而不是一个裸机下打印一下hello world的引导扇区。这需要有足够的计算机系统的知识。包括但不仅限于汇编,C和操作系统原理。
在自己写操作系统这一领域,也有不少大作。我之前也曾拜读过一部分,曾奉为圭臬,跟随作者的脚步慢慢前进,但是没多久,就做不先去了。。。
当知识经过一段时间的沉淀,在回首,曾经的大作看起来亦有不妥之处。
操作系统系统是一个复杂的技术话题,如何实现一个简单的操作系统,楼上已有回答,题主也可读一些大作来参考实现。
最近我发现一个不错的公众号,就是做自己操作系统这方面的,公众号里的文章,试图通过简单的话语来阐述,那些晦涩的计算机概念。 此公众号的作者也曾写过一个小的内核,可以引导到shell执行。
我正在关注这个公众号,如果题主对这个主题十分感兴趣的画,也可以关注下,我们共同进步。
公众号:操作系统探究