1. 程式人生 > >ubutu14 下編譯linux0.11核心

ubutu14 下編譯linux0.11核心

下載 linux-0.11-gdb-rh9-050619.tar.gz 程式碼,以它為藍本編譯。

1. boot/head.s:45: Error: unsupported instruction `mov'

原因: 這是因為本機系統為64位,
因此需要給所有Makefile中的as命令加上 --32 選項。
需給所有Makefile中的CFLAGS加上 -m32 選項。

2.
gcc: warning: ‘-mcpu=’ is deprecated; use ‘-mtune=’ or ‘-march=’ instead
修改:
 -mcpu=i386 改為-march=i386

3.
init/main.c:23: error: static declaration of 'fork' follows non-static declaration

修改, 把static 全去掉。
inline _syscall0(int,fork)
inline _syscall0(int,pause)
inline _syscall1(int,setup,void *,BIOS)
inline _syscall0(int,sync)


4.
 warning: function definition has qualified void return type [enabled by default]
 static inline volatile void oom(void)

解決辦法: 把volatile void 中的volatile 統統去掉

5
as -o system_call.o system_call.s
system_call.s: Assembler messages:
system_call.s:77: Error: invalid instruction suffix for `push'

解決辦法:
32位程式碼要用--32 選項

$as --32 -o system_call.o system_call.s
system_call.s: Assembler messages:
system_call.s:94: Warning: indirect call without `*'

修改94行程式碼,加上一個*
$ as --32 -o system_call.o system_call.s
$

6. 連結錯誤
ld -r -o kernel.o sched.o system_call.o traps.o asm.o fork.o panic.o printk.o vsprintf.o sys.o exit.o signal.o mktime.o
ld: Relocatable linking with relocations from format elf32-i386 (sched.o) to format elf64-x86-64 (kernel.o) is not supported
make[1]: *** [kernel.o] Error 1
解決辦法,在x86-64上鍊接出x86 檔案,新增 -m elf_i386 選項
ld -m  elf_i386 -r -o kernel.o sched.o system_call.o traps.o asm.o fork.o panic.o printk.o vsprintf.o sys.o exit.o signal.o mktime.o


7. 與內建衝突
gcc -march=i386 -Wall -O -g -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../include -m32 \
    -c -o traps.o traps.c
In file included from traps.c:13:0:
../include/string.h:128:22: warning: conflicting types for built-in function ‘strchr’ [enabled by default]
 static inline char * strchr(const char * s,char c)

解決辦法: 新增 -fno-builtin
 gcc -march=i386 -Wall -O -g -fno-builtin -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -I../include -m32 -c -o traps.o traps.c


8.
exec.c:139:44: error: lvalue required as left operand of assignment
         !(pag = (char *) page[p/PAGE_SIZE] =

解決辦法: 程式碼邏輯不清晰,重新調整一下使符合規範

9.
blk.h:87:6: error: #elif with no expression
 #elif

簡單:#elif 改為 #else

10.
In file included from string.c:14:0:
../include/string.h:38:22: warning: ‘strncpy’ defined but not used [-Wunused-function]
 static inline char * strncpy(char * dest,const char *src,int count)

定義了static 又未使用。
先讓它shut-off, -Wno-unused-function

11. 連線錯誤
/home/hjj/linux0.11/linux-gdb-rh9/linux/kernel/vsprintf.c:92: undefined reference to `__stack_chk_fail'

解決辦法:
gcc 把程式碼當成應用,來在函式尾部呼叫stack 檢查錯誤,告訴它這是os, 不用檢查了。
或者你自己新增一個stack_chk_fail. 簡單禁止掉即可
-fno-stack-protector

12.
/linux/tools/build.c:72: undefined reference to `MAJOR'
/linux/tools/build.c:73: undefined reference to `MINOR'

解決辦法。 它使用的是系統標頭檔案。
把linux/fs.h 中的定義copy 到程式碼裡即可

13.
tools/build.c:97:2: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
  if (((long *) buf)[0]!=0x04100301)

解決辦法:
它不希望左側 buf(char *) 強制轉換為long*, 令它shut-off
-Wno-strict-aliasing


14.
warning: array subscript has type ‘char’ [-Wchar-subscripts]

char 型別是有正負值的,容易出錯,所以給出警告。
解決辦法。 可以改為unsigned char

這樣,ubuntu 14 上編譯通過了linux0.11, 也沒有了warning 資訊

不過別高興太早,執行還有些問題。

讓它執行起來,是下一步任務。

相關推薦

ubutu14 編譯linux0.11核心

下載 linux-0.11-gdb-rh9-050619.tar.gz 程式碼,以它為藍本編譯。 1. boot/head.s:45: Error: unsupported instruction `mov' 原因: 這是因為本機系統為64位, 因此需要給所有Makefi

linux環境編譯linux0.11核心

原部落格很老了,我並沒有編譯通過,網上大多編譯成功的是用gcc-4.3以下的版本,也有在gcc-4.6編譯成功的,折騰了幾天,這是我在網上找到的最新的資料了, 但是ubuntu源裡面最老的版本也是gcc4.7版本的,嘗試編譯低版本的gcc原始碼,但編譯不通過. 上面的

bochs編譯linux0.11 (轉)

/********************************************轉自:http://blog.csdn.net/s_ware/archive/2007/03/22/1537088.aspx*******************************

Linux 環境編譯 0.11版本核心 kernel

原文地址:http://chfj007.blog.163.com/blog/static/173145044201132523034138/ 最近在看《linux核心0.11完全註釋》一書,由於書中涉及組合語言的地方眾多,本人在大學時組合語言學得一塌糊塗,所以實在看不下去了

Linux0.11核心引導啟動過程概述

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

LINUX編譯c++11的程式碼

 C++11,(即ISO/IEC 14882:2011),是目前的C++程式語言的最新正式標準。它取代了第二版標準(第一版公開於1998年,第二版於2003年更新,分別通稱C++98以及C++03,兩者差異很小)。新的標準包含核心語言的新機能,而且擴充套件C++標準程式庫。C++11新標準

Linux0 11核心引導啟動過程概述

Linux0.11僅支援x86架構。它的核心引導啟動程式在資料夾boot內,共有三個彙編程式碼檔案。按照啟動流程依次是:     (1)bootsect.s。boot是啟動引導的意思,sect即sector,是扇區的意思,二者合在一起啟動引導扇區。這是 磁碟載

linux除錯linux0.11

image直接用的這裡的http://oldlinux.org/Linux.old/Linux-0.11/images/ insight-6-8-1編譯 yum install nc

總結linux0.11核心中的主,次裝置號

老會忘,記下來方便後面查閱 主裝置 型別 說明 請求操作函式 0 無 無 NULL 1 塊/字元 ram,記憶體裝置(虛擬盤等) do_rd_request 2 塊 fd,軟碟機裝置 do_fd_request 3 塊 hd,硬碟裝置 do_hd_request 4 字元

LINUX0.11 核心閱讀筆記

一.原始碼目錄圖1二.系統總體流程:系統從boot開始動作,把核心從啟動盤裝到正確的位置,進行一些基本的初始化,如檢測記憶體,保護模式相關,建立頁目錄和記憶體頁表,GDT表,IDT表。然後進入main進行初始化設定,main完成系統各個模組要用到的所有資料結構和外部裝置的初始

LINUX0.11核心閱讀筆記 (2)

 (五)檔案系統模組fs: 1.總體結構: Linux把所有裝置都做為檔案來看待。提供統一的開啟,關閉,讀寫系統呼叫介面。下面是檔案系統層次關係: <!--[if !vml]--><!--[endif]--> 圖4 總體來說,檔案系統提供兩類外部

linux0.11核心空間與使用者空間資料交換

學習linux到現在對於這個問題一直都沒有在意,細看程式碼時發現這確實是一個大問題,並且感覺很巧妙,具體在segment.h檔案中函式實現。 當用戶程序執行系統呼叫進入核心空間時,所有段都指向核心段,但是fs卻除外,它需要扮演負責核心空間與使用者空間資料的交換的重要角色。其

用bochs安裝linux0.11核心

參考:http://www.oldlinux.org/oldlinux/forumdisplay.php?fid=4 1.先用gcc編譯linux0.11核心(不含檔案系統) 這是別人修改後可以gcc編譯的,原始碼已經放到: \\Cnpc0165-cd\Books\Comp

LINUX0.11核心閱讀筆記 (1)

 我是通過閱讀趙炯老師編的厚厚的linux核心完全剖析看完LINUX0.11的程式碼,不得不發自內心的說Linus真的是個天才。雖然我覺得很多OS設計的思想他是從UNIX學來的,但是他自己很周全很漂亮很巧妙地實現瞭如此龐大一個系統的絕大多數程式碼。這裡面有太多環節需要注

利用VS2013構搭linux0.11核心除錯環境

VS2013的下載連結:連結:http://pan.baidu.com/s/1mh7iLfy 密碼:ir2o linux 0.11的工程 連結:http://pan.baidu.com/s/1eRU

Linux0.11核心讀書筆記/boot/bootsect.s

果凍QQ:457283! 本程式完成的主要功能! 1.bootsect.s從0x7c00處開始執行! 2.將自己複製到0x90000處! 3.將setup.s程式從磁碟第2扇區讀取到0x90200處! 4.將system讀取到0x10000處! 5.獲取根檔案系統裝置號! 6

ubuntu16.04編譯android-goldfish-3.4核心原始碼(android6.0.1系統原始碼)

配置 筆者環境 系統: ubuntu 16.04 LTS 硬碟: 固態硬碟 筆者剛開始直接克隆的時候出現如下錯誤: error: RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with unexp

ECS裡Centos7.2編譯安裝PHP-7.2.11(PHP-FPM)

centos7下編譯安裝php-7.2.11(PHP-FPM) 一、下載php7原始碼包 1 http://php.net/downloads.php 如:php-7.2.11.tar.gz 二、安裝所需依賴 > yu

VS2013ZLIB1.2.11編譯

/******************************** ZLIB編譯 **********************************/ 1.在官網下載原始碼http://www.zlib.net/,解壓,我的解壓路徑是D:\ZLIB,新建Build作為

breakpad在C++ 11編譯錯誤修改

我只用到了exception_handler模組,暫時還未用到Server模組,因為用到了C++ 11的一些特性,而google-breadpad還沒有C++11版本,所以做了一些修改,集中在型別定義處1.typedef typeof(((struct user*) 0)->u_debugreg[0])