首先,評論這是我的第一篇文章,希望大家都喜歡。
在本系列中,我們將模擬 Linus Torvalds的,我們將從0創建操作系統。在第一集中,我們將看到引導,並將在內核中的屏幕上顯示文本。
就我而言,操作系統稱為 下一個旅行。 一旦考慮操作系統,我們必須做出的第一個決定是引導加載程序是什麼?
這裡有多種變體,我們甚至可以自己創建一個。 但是在本教程中,我將使用 GRUB,因為大多數人或多或少地了解他。 我們創建一個文件夾,該文件夾將成為操作系統的根目錄,並在其中創建/ boot / grub文件夾
mkdir nextroot && cd nextroot
mkdir -p boot/grub
在這裡,我們創建grub.cfg文件,如下所示:
menuentry "NextDivel" {
echo "Booting NextDivel"
multiboot /next/START.ELF
boot
}
在此文件中,我們看到了 GRUB 在這種情況下,將在/next/START.ELF中加載我們的內核。 現在我們必須創建內核。
為此,我們將需要 GCC y GAS (項目的彙編程序 GNU,通常隨gcc一起提供)。 因此,我們將創建內核。
首先,我們創建一個名為kernel.asm的文件。 該文件將包含內核的起點,還將定義多重引導(某些引導加載程序的功能,例如 GRUB)。 kernel.asm的內容將是:
.text
.globl start
start:
jmp multiboot_entry
.align 4
multiboot_header:
.long 0x1BADB002
.long 0x00000003
.long -(0x1BADB002+0x00000003)
multiboot_entry:
movl $(stack + 0x4000), %esp
call NextKernel_Main
loop: hlt
jmp loop
.section ".bss"
.comm stack,0x4000
與multiboot相關的所有內容都只是遵循規範。 一切都將從開始開始,它將調用multiboot_entry,我們將在前4k中定義multiboot標頭,然後將其放入(使用movl)。
稍後我們調用NextKernel_Main,這是我們的內核C函數。 在循環中,我們暫停以停止計算機。 編譯為:
as -o kernel.o -c kernel.asm
現在,我們要開始使用C語言進行編程。您會認為,現在一切都變得輕而易舉, 的printf en 主 就是這樣,我們已經做到了。
好吧,因為 的printf y 主 它們是操作系統定義的功能,但我們正在創建它們! 我們只能使用自己定義的功能。
在後面的章節中,我將不時討論如何放置我們自己的C庫(glibc,bionic,newlibc)。 我們已經討論過要在屏幕上放置文本,那麼我們將看到如何做。
有兩種選擇,一種是調用 的BIOS 另一個是直接管理屏幕內存。 我們要進行後者,因為從C可以更清楚地看到它,並且當我們進入保護模式時,它也將允許我們這樣做。
我們創建一個名為NextKernel_Main.c的文件,其內容如下:
int NextKernel_Main()
{
char *str = "NextDivel says Hello World", *ch;
unsigned short *vidmem = (unsigned short*) 0xb8000;
unsigned i;
for (ch = str, i = 0; *ch; ch++, i++)
vidmem[i] = (unsigned char) *ch | 0x0700;
return 0;
}
這樣我們就可以直接操縱記憶 的VGA 並逐個字符地編寫。 我們通過禁用stdlib進行編譯:
gcc -o NextKernel_Main.o -c NextKernel_Main.c -nostdlib -fPIC -ffreestanding
如果到目前為止,您現在想嘗試使用全新的操作系統,但是我們還沒有完成。 我們需要一個小文件來告訴編譯器文件中每個部分的位置。 這是通過鏈接描述文件完成的。 我們創建link.ld:
ENTRY(start)
SECTIONS
{
. = 0x00100000;
.multiboot_header :
{
*(.multiboot_header)
}
.text :
{
code = .; _code = .; __code = .;
*(.text)
. = ALIGN(4096);
}
.data :
{
data = .; _data = .; __data = .;
*(.data)
*(.rodata)
. = ALIGN(4096);
}
.bss :
{
bss = .; _bss = .; __bss = .;
*(.bss)
. = ALIGN(4096);
}
end = .; _end = .; __end = .;
}
這樣,我們定義了每個部分的位置以及在kernel.asm中定義的入口點start。 現在我們可以將所有這些混合在一起:
gcc -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -ffreestanding -lgcc
現在,我們將START.ELF複製到模擬操作系統根目錄的文件夾中的/ next。 我們使用控制台轉到新操作系統的根文件夾,並驗證是否存在兩個文件:一個/boot/grub/grub.cfg和另一個/next/START.ELF。
我們轉到上層目錄,並使用GRUB調用一個ISO創建實用程序,名為 格魯夫·麥克里斯庫
grub-mkrescue -o nextdivel.iso nextroot
完成此操作後,我們將有一個 的ISO。 可以在計算機上打開此ISO x86 (也是64位)和虛擬機。 為了測試它,我將使用 QEMU。 我們稱之為 QEMU 從命令行:
qemu-system-i386 nextdivel.iso
將開始 海洋BIOS 後來我們將有 GRUB。 稍後,如果一切正確,我們將看到我們的短語。
您會認為這很困難,我回答,是的。
真正創建一個操作系統很困難,這裡的操作系統沒有任何用處。 在以後的章節中,我們將看到如何處理屏幕上的顏色,保留內存以及如果可以的話如何從鍵盤獲取數據。
如果有人不想在這裡複製所有內容,我在這裡有一個存儲庫 GitHub上 (更詳細)與操作系統 下一個旅行。 如果要編譯 下一個旅行 您只需要擁有git和cmake:
git clone https://github.com/AdrianArroyoCalle/next-divel
cd next-divel
mkdir build && cd build
cmake ..
make
make DESTDIR=next install
chmod +x iso.sh
./iso.sh
qemu-system-i386 nextdivel.iso
如果您有時間和願望來創建操作系統,我鼓勵您在NextDivel上進行協作。 也許甚至優於Linux……時間會證明一切。
:O
Torvalds將Minix操作系統(從UNIX派生)用於Andrew S. Tanenbaum,並對其進行了改進。
Tanenbaum與Linus發生了爭執,他們互相侮辱。 Tanenbaum說,微內核是未來(HURD,Minix新圓錐微內核)。
http://www.taringa.net/posts/linux/17215999/Linux-vs-Hurd-Kernel-Monolitico-vs-Microkernel.html
這是我到目前為止在此博客上看到的最好的帖子。 我已經想知道還要做什麼。
被感動
真是令人印象深刻!
FUUUUUUUA!
這是我見過的最討厭的帖子。 恭喜阿德里安,關於妓女的文章! 超級有趣! 🙂
我同意。 我想像這種情況:
GNU / Linux高級用戶(笑容滿面):
“我已經知道如何編譯我的Gentoo”
書呆子(輕蔑地):«PFF,我創建了自己的發行版...»
是的,我可以創建自己的Linux發行版。 實際上,我正在為嵌入式Linux開發initramfs和內核。 創建操作系統不同於Linux發行版。 第一個要困難得多,幾乎是不可能的,第二個就可以了,即使更改了xD徽標的Ubuntu也可以。 所以我會這樣保留它:
GNU / Linux高級用戶(笑容滿面)
-我已經知道如何編譯我的Gentoo
半書呆子
-Pff,我從頭開始學習Linux,並製作了自己的發行版
書呆子(輕蔑的態度)
-pff,因為我已經在彙編器和C中編寫了內核
您好!
在接下來的章節中,這對我來說很有趣。
我前段時間看過本教程,它是針對C ++的
https://github.com/SamyPesse/How-to-Make-a-Computer-Operating-System
感謝您的鏈接,我來看看。
我想要一個與AMD顯卡100%兼容的操作系統:/
Windows
Windows Catalyst中的hahaha不支持OpenGL,儘管在Linux中我無法使用所有圖形功能,我將一直等待觀察會發生什麼!
只等閥門消滅市場
神奇,完美,出色的貢獻,看起來像是一系列精彩的文章🙂
Buah我想知道如何編程來幫助您,只是作為一種在您正在學習和幫助的知識上進行練習的方式。 現在,一旦您完成“使用NextDivel,色情內容看起來相同(或更好)。”,我現在就給您留下一個座右銘,以吸引對該項目的關注。
Mooooooolaaa !!!!
很好的文章,但很好奇為什麼您沒有關注Linux From Scratch項目?
問候
好吧,Scratch的Linux很好,您可以說它是您的,但是它確實非常機械:
-下載字體
-修補它們
-編譯
-安裝
-下一個
在這裡,即使最後的結果更糟,您也可以說已經檢查了所有文件。
從我之前的評論中可以清楚地看出,因為它的複雜程度並不相同。 而且,從頭開始創建linux並不是真正意義上的從頭開始創建系統的過程,而是從頭開始創建系統,而是自己編寫程序,編寫自己的內核,而不是linux內核,如果可能的話,甚至是自己的bootloader而不是grub, lilo,syslinux等儘管LFS並非易事,而且相當複雜,但它甚至與您自己的內核編程還差得遠……
另外,我同意AdrianArroyo Calle的觀點,即它太機械了,我讀了一段時間,最後在第六頁放棄了,他們還告訴您使用什麼版本的軟件包,因為否則該說明將無法正常工作(表示缺乏靈活性,我認為)。 我認為最好有自己的想法,編譯所需的包,甚至編寫一些程序,編譯linux內核並且安然無.。
您好!
哦! 我從來沒有像這個職位那樣多地獲得過職位。
請繼續😀
我不知道怎麼了:
錯誤:找不到多重引導頭。
錯誤,您需要先加載內核
如果有什麼安慰的話,我犯了同樣的錯誤。 嘗試使用GitHub中的源,那裡的錯誤已經得到解決。 無論如何,我認為如果將grub.cfg行從“ multiboot /next/START.ELF”更改為“ kernel /next/START.ELF”,則可能會起作用。 我不知道。
首先,華麗的入口entrance
我從grub加載內核時遇到了同樣的問題。 甚至使用GitHub源或更改內核的多重引導...
錯誤:找不到多重引導頭。
錯誤:未加載內核
您是否正在使用clang作為編譯器? 更改為gcc
您還記得使用鏈接腳本嗎? 鏈接器(在我們的例子中為ld)必須知道要將每件事放在文件中的什麼位置,這是必要的。 在這種情況下,多重引導標頭必須位於開頭。
您正在使用CMake系統嗎? 如果您使用它,我認為它不會失敗。
如果對您不起作用,我將嘗試尋找其他解決方案。
[+100]
太棒了!!!
真的很酷🙂
我脫下帽子。 令人印象深刻的帖子。 恭喜你
哇!
如果您可以打開使用HTML5和Javascript製作的應用程序而不必使用瀏覽器,那就太好了,這可能嗎?
我說的是它們就像本機應用程序一樣。
因此,對該操作系統進行編程將很容易😀
在這種情況下,我不打算這樣做,因為它需要進行大量工作,但是有一個名為“ is”的操作系統可以執行您所說的操作。 實際上,命令行是JavaScript,並且使用JavaScript Canvas函數繪製窗口。 任天堂的工程師做到了,現在它是開源的。
http://code.google.com/p/es-operating-system/
瓦拉,謝謝你的信息😀
我會看一看
誰能夠製作自己的操作系統,誰就可以和平地死去,因為他必須具備相應的知識水平。 它使您無需天堂或地獄。
一塊過帳。
到目前為止,還沒有人知道只能製作出可以從頭開始製作的像樣的操作系統,甚至沒有像您一開始所說的那樣製作Linux Torvalds,因為這是從Unix來源開始的,其他所有東西都是共同創作的,甚至更多。與一個人相比,生命非常短暫,任何人都無法想像從頭開始,即使想要相反的情況,在Linux Torvalds複製和粘貼過程中犯的許多錯誤中也可以證明這一點。
Unix源是封閉的,使用minix ...是另外一回事。
而那些製作QDOS的人呢?
基於什麼?
從我的角度來看,誰沒有自己的操作系統是因為他們不想這麼做,哈哈哈哈。
現在認真,很有趣! 我的編程知識已經遠遠超出了我的範圍,但是我會帶著期待地閱讀本系列的其他部分。
感謝您的帖子!
你給我留下了O_O的臉...不想低估任何人的貢獻,這是我最近見過的最“親”的東西。 問候。
很好的文章,Adrián。 請繼續…
您是在愚人節開玩笑嗎?不要be“模仿Linus Torvalds:從頭開始創建自己的操作系統”。 對於那些在某個技術學院或大學追求職業的人來說,我認為這並不困難; 但是對我來說,我是一個新手弓箭手(有些人稱我們為“ Noob”,但我認為自己更像是新手,有些懶惰),聽起來好像沒有踏上陸地。 無論如何,該文章創造了很多好奇心,並且毫不懷疑和尊重其編輯,祝賀; 我要做的第一件事是嘗試至少了解一些這種有價值的材料。
謝謝Adrian Arroyo Calle,出色的工作和高尚的知識交付。
LEL優秀帖子,請繼續努力。
多麼棒的帖子啊,這就是我錯過的 desde linux。精彩的。
很棒的帖子,非常感謝。
我不明白link.ld文件的作用,有人可以向我解釋一下嗎?
link.ld文件告訴鏈接器(在本例中為ld)在代碼的每個位置應位於結果文件中的哪個位置。 我們還定義了入口點,因為由於我們沒有操作系統,所以不能將main用作常規程序,在這種情況下,我們選擇啟動功能。
偉大的所有您的帖子! 等待7! 如果我有疑問,例如,如果我只想運行沒有OS的算法,該怎麼辦,我怎麼知道我可以使用什麼而不能使用C?
如果以這種方式使用它,那麼您將無法使用stdlib中的任何東西,而這實際上是每個人都使用的東西(沒有malloc,free,printf,scanf,strcmp等)。 一切都必須直接從內存或ASM實現。 也許在更高的章節中,我將向您展示如何為操作系統安裝C庫。 如果使用C ++,則不能使用異常以及new和delete運算符(當然還有更多)。
我認為 這個 它可以讓您更好地了解如何進行操作。
您好,大約5年前,我遵循了類似的出版物,並開發了一種以相同方式啟動的微內核,它在某些方面有待改進,但您可能會感興趣,它以保護模式運行,執行多任務並執行內存虛擬化,最近,我致力於磁盤驅動器和CD驅動器的安裝,而不僅僅是在實時CD上運行。
親愛的,執行命令時出現錯誤:
gcc -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -ffreestand -lgcc
link.ld:5個語法錯誤
collect2:錯誤:ld返回1退出狀態
鏈接
。 = 0x00100000;
.multiboot_header:{
*(。multiboot_header)
}
在第5行中,我沒有看到錯誤,有人嗎?
我正在VirtualBox中使用虛擬化的Debian Wheezy
添加“;” 在*(。multiboot_header)的末尾
非常好的創舉,我一定會關注這篇文章的各個章節,打算從中學到很多東西。 非常感謝您抽出寶貴的時間教我們。 關於這方面的一個細節,應該注意,Linus Torvalds不是任何操作系統的創建者,他創建了GNU / Linux系統(已在其他OS中使用的系統)的內核,這仍然值得,但重要的是要感謝Richard Stallman創建了大多數操作系統。
非常感謝您的投入,希望您考慮我的看法。
我已經把這個話題弄亂了一段時間,當我讀到標題時,我就很感興趣。 但是消息不斷
錯誤:找不到多重引導頭。
錯誤,您需要先加載內核
我已經將我上傳的內容上傳到github的倉庫中 https://github.com/rkmax/GenyOS
我也發生了同樣的事情,找到解決方案了嗎?
我開始介紹語法的問題,而menuentryline告訴我commandnot found誰能告訴我原因
這就是我要做的
黑色@ BLACK-pc:〜/ blackroot $ menuentry«NextDivel»{
menuentry:找不到命令
該內容的內容不在命令行中輸入,而是在您創建的名為grub.cfg的文件中輸入。
優秀的文章,謝謝!
壯觀的……! 就像缺少的鏈接一樣。
我喜歡您的“模擬LInus Torvalds”教程,但是有一個我不理解的步驟,以下是:
現在,我們將START.ELF複製到模擬操作系統根目錄的文件夾中的/ next。 我們使用控制台轉到新操作系統的根文件夾,並驗證是否存在兩個文件:一個/boot/grub/grub.cfg和另一個/next/START.ELF。
我們轉到上層目錄,並調用用於使用GRUB創建ISO的實用程序,稱為grub-mkrescue。
有人可以向我解釋:p
只是為了生成GRUB可以加載的最低ISO,我們將內核複製到(ISO的/,任何文件夾)/next/START.ELF,將GRUB配置文件複製到(ISO的/,任何文件夾)/ boot / grub / grub.cfg。 完成此操作後,我們尚未在ISO上安裝GRUB,並且有一個實用程序可從文件夾生成ISO並安裝稱為grub-mkrescue的GRUB。 然後,我們最終得到一個已安裝GRUB的可引導ISO,該ISO可以讀取配置以稍後正確執行START.ELF。 我不知道自己是否已經解釋過,但是我們所要做的是一種錯誤的文件系統,通過它我們可以生成一個ISO。
大
好吧,真的不多看一個新系統,但是,如果您改進Linux,例如,創建一個帶有服務器組件的Linux外核,如果您願意的話,它可以充當微核,也就是說,一個具有微核行為的exo結構將是超級的。和linux。
另一件事是,我不是編程專家,只是一些俗氣的c ++和一些java,對於我來說,給linux內核程序一個模塊,刪除它,修改它就足夠了。
毫無疑問,我已經要去度假了。
這個好東西,它在什麼程序中設計和編碼?
請給我那個答案
從您的git編譯時,我得到:
[jmponce @ jar build] $ cmake ..
-創建NextRoot目錄
-生成ISO腳本
使DESTDIR =下次安裝
./iso.sh
-找到Doxygen:/ usr / bin / doxygen(找到版本“ 1.8.9”)
-配置完成
-完成生成
-構建文件已寫入:/ home / jmponce / next-divel / build
[jmponce @ jar版本] $ make
掃描目標START.ELF的依賴項
[7%]構建ASM-ATT對象src / CMakeFiles / START.ELF.dir / start / boot.asm.o
[14%]構建CXX對象src / CMakeFiles / START.ELF.dir / start / NextShellLite.cpp.o
[21%]構建CXX對象src / CMakeFiles / START.ELF.dir / start / ND_Screen.cpp.o
[28%]構建CXX對象src / CMakeFiles / START.ELF.dir / start / NextKernel_Main.cpp.o
[35%]構建CXX對象src / CMakeFiles / START.ELF.dir / start / ND_Panic.cpp.o
[42%]構建CXX對象src / CMakeFiles / START.ELF.dir / start / ND_Timer.cpp.o
[50%]構建CXX對象src / CMakeFiles / START.ELF.dir / start / ND_Memory.cpp.o
[57%]構建CXX對象src / CMakeFiles / START.ELF.dir / start / ND_Ports.cpp.o
[64%]構建CXX對象src / CMakeFiles / START.ELF.dir / start / ND_GDT.cpp.o
[71%]構建CXX對象src / CMakeFiles / START.ELF.dir / start / ND_ISR.cpp.o
[78%]構建CXX對象src / CMakeFiles / START.ELF.dir / start / ND_String.cpp.o
[85%]構建CXX對象src / CMakeFiles / START.ELF.dir / start / ND_IRQ.cpp.o
[92%]構建CXX對象src / CMakeFiles / START.ELF.dir / start / ND_IDT.cpp.o
[100%]構建CXX對象src / CMakeFiles / START.ELF.dir / start / ND_Keyboard.cpp.o
鏈接CXX可執行文件START.ELF
/ usr / bin / ld:不兼容的/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/libgcc.a在查找-lgcc時被跳過
/ usr / bin / ld:找不到-lgcc
collect2:錯誤:ld返回退出狀態1
src / CMakeFiles / START.ELF.dir / build.make:402:目標'src / START.ELF'的失敗指令
設為[2]:*** [src / START.ELF]錯誤1
CMakeFiles / Makefile2:106:目標'src / CMakeFiles / START.ELF.dir / all'的指令失敗
使[1]:*** [src / CMakeFiles / START.ELF.dir / all]錯誤2
Makefile:117:目標“ all”的指令失敗
使:*** [全部]錯誤2
錯誤似乎是因為您具有64位版本,所以找不到llibgcc,並且當前編譯系統被迫使用32位。 您應該在發行版或更高版本上安裝兼容包,使用32位系統。
我有32位,並且出現相同的錯誤,您是指操作系統還是體系結構? 我的是64位的,但是我使用的是32位的Ubuntu,不要問,財務問題,我就這樣說。
優秀的話題,等待更大的範圍。 問候
太棒了,我希望更多
您好,我是一位年輕的大使,他希望創建一個支持所有程序和平台的操作系統,以便開發人員不必在PC上擁有功能強大的計算機,應用程序或程序。
這就是為什麼我對此帖子感興趣,但是當我下載您的git或嘗試創建它時,一切正常,直到我執行命令./iso.sh或grub-mkrescue -o nextdivel.iso nextroot時,您會收到此錯誤
“ Grub-mkrescue:警告:您的xorriso不支持” –grub2-boot-info“。 某些功能已被禁用。 使用xorriso 1.2.9或更高版本。
grub-mkrescue:警告:您的xorriso不支持“ –grub2-boot-info”。 您的內核映像太大。 磁盤啟動已被禁用。 使用xorriso 1.2.9或更高版本..»
我真的不知道,因為我對應用程序和Web知識很多,但是對grub一無所知
您可能需要在發行版上更新xorriso程序。 您使用什麼發行版和版本?
我使用xubuntu 14.04lts並嘗試運行xorriso,但是shell告訴我它找不到它,並且我得到apt-get install xorriso,儘管我真誠地希望得到一些響應,因為我在Linux上安裝了我不知道的東西時經驗很差,呵呵。 我將立即更新並告訴您發生了什麼
然後從軟件中心安裝xorriso或直接從終端安裝“ sudo apt-get install xorriso”
我已經完成了您告訴我的所有事情,並且使用git和mine都得到了xorriso 1.3.2:RockRidge文件系統操縱器,libburnia項目。
驅動電流:-outdev'stdio:nextdivel.iso'
媒體當前:stdio文件,可覆蓋
媒體狀態:為空白
媒體摘要:0個會話,0個數據塊,0個數據,1901m免費
已添加到ISO映像:目錄'/'='/tmp/grub.OEqSzV'
xorriso:更新:在546秒內添加了1個文件
xorriso:失敗:無法確定源文件“ / media / gaia / Jupiter1 / ShellSystem / nextroot / nextroot”的屬性:沒有此類文件或目錄
xorriso:更新:在546秒內添加了1個文件
xorriso:正在中止:-abort_on'FAILURE'遇到'FAILURE'
和燈芯絨,我不了解我的結構是/nextroot/boot/grub/grub.cfg和nextroot / next / START.ELF
謝謝,我準備前進,一個朋友幫助了我,並告訴我我做錯的是目錄的組織,所以我解決了,就這樣
打擾一下,您能告訴我您執行了什麼步驟,因為我沒有錯誤可以啟動:沒有這樣的文件或目錄
無引導設備。
問候! 我想問你一個忙,如果你能給我發一封電子郵件,說明你在這裡的解釋,我有點困惑,我需要將我的理解與你的解釋進行比較,也許我不清楚的是grub.cfg的創建是在終端gcc中完成的還是在哪裡完成的? 朋友,非常感謝您!
使用任何文本編輯器創建文件grub.cfg,都必須將其保存在PROJECT_FOLDER / boot / grub / grub.cfg中
您好Adrian首先,祝賀您,並感謝您的貢獻。
您知道我正在為此做練習,並且在您進行輔導後開始將其組合在一起,但是開始後我發現了第一個錯誤
$ as -o kernel.o -c kernel.asm
bash:as:找不到命令...
類似的命令是:
'一個'
'ac'
我正在研究fedora 20,在這方面我找不到解決方案,對於您應該更改gcc還是gas的指導,我將不勝感激。
提前謝謝
您必須安裝GAS,這樣我才能看到錯誤代碼。 我手頭沒有Fedora,但從理論上講,如果您要安裝gcc-c ++,則將安裝整個GCC套件和GNU,通常會附帶它。
我和你在一起,我對C ++,C#有所了解(儘管這最後一點在這方面不是很有用),但壞的是我仍然缺乏經驗,我從不使用C語言,您的著作很棒,我沒有話要說,如果我有時間的話。 謝謝。
非常感謝您的大力幫助...。
我愛linux,這是最好的區域,因為我的Windows真是個垃圾,我知道linux的創建者是Windows的創建者
您好我在grub中收到錯誤消息
錯誤:找不到文件/next/START.ELF
錯誤:您需要先加載內核
你能幫我和谷歌,但我找不到
拜託,我如何讓它顯示HELLO WORLD消息,我是初學者,但我仍然不了解
我發生以下情況:
gcc -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -ffreestand -lgcc
/usr/bin/ld:kernel.o:在創建PIE對象時,不能將R_X86_64_32相對於符號'stack'進行重定位; 用-fPIE重新編譯
/ usr / bin / ld:最終鏈接失敗:輸出中的不可代表部分
collect2:錯誤:ld返回1退出狀態