1. 程式人生 > >(OK) 編譯核心及移植MPTCP過程

(OK) 編譯核心及移植MPTCP過程

編譯核心及移植MPTCP過程

編譯方式

編譯核心有兩種方式:本地編譯和交叉編譯

  • 本地編譯是指在需要安裝核心的裝置上直接編譯,編譯得到的核心也是在本地執行
  • 交叉編譯是指一個在某個系統平臺下可以產生另一個系統平臺的可執行檔案的編譯器。交叉編譯在目標系統平臺(開發出來的應用程式序所執行的平臺)難以或不容易編譯時非常有用

編譯過程

這裡我的電腦系統為Ubuntu16.04, 裝置為樹莓派3B

本地編譯

由於是給樹莓派編譯核心,首先要連線到樹莓派,這裡使用ssh

如果使用乙太網線將電腦和樹莓派連線的話,鍵入下面的命令

1 ssh [email protected]

如果沒有網線而樹莓派已經接入網路的話

1 ssh [email protected]'s-ip-address

連線成功之後就進入了樹莓派的bash介面,首先安裝編譯需要的工具和依賴

1 sudo apt-get install git bc

在樹莓派上下載核心原始碼

1 git clone --depth=1 https://github.com/raspberrypi/linux

編譯流程

1234 cd linuxKERNEL=kernel7make bcm2709_defconfigmake -j4 zImage modules dtbs

安裝核心

12345 sudo make modules_installsudo cp arch/arm/boot/dts/*.dtb /boot/sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/sudo cp arch/arm/boot/zImage /boot/$KERNEL
.img

交叉編譯

交叉編譯相對負載一些,首先要先下載樹莓派對應的交叉編譯工具

1 git clone https://github.com/raspberrypi/tools

然後新增環境變數,這裡假設將工具下載到了使用者主目錄

1 export PATH=$PATH:$HOME/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin

在電腦上下載對應核心原始碼

1 git clone --depth=1 https://github.com/raspberrypi/linux

進行編譯

1234 cd linuxKERNEL=kernel7make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfigmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs

樹莓派的系統是安裝在SD卡上的,所以我們要先將SD卡掛載到電腦上

插入SD卡,檢視SD卡對應的裝置檔案

1 lsblk

應該可以看到下面格式的輸出(具體內容可能不一樣,我這裡是sdb)

123 sdb sdb1 sdb2

掛載SD卡,由於樹莓派系統有兩個分割槽,所以這裡也對應的要掛載兩個

1234 mkdir mnt/fat32mkdir mnt/ext4sudo mount /dev/sdb1 mnt/fat32sudo mount /dev/sdb2 mnt/ext4

然後安裝核心

123456 sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/ext4 modules_installsudo cp mnt/fat32/$KERNEL.img mnt/fat32/$KERNEL-backup.imgsudo cp arch/arm/boot/zImage mnt/fat32/$KERNEL.imgsudo cp arch/arm/boot/dts/*.dtb mnt/fat32/sudo cp arch/arm/boot/dts/overlays/*.dtb* mnt/fat32/overlays/sudo cp arch/arm/boot/dts/overlays/README mnt/fat32/overlays/

最後解除掛載

12 sudo umount mnt/fat32sudo umount mnt/ext4

移植MPTCP過程

關於編譯方式

編譯方式推薦交叉編譯,理由如下

  • 編譯核心需要的時間十分漫長,而樹莓派的運算能力遠不如電腦,本地編譯會浪費大量的時間
  • 移植過程中經常會出現核心編譯失敗或者無法啟動的情況。一旦出現,就無法遠端連線樹莓派,還需要一番折騰

更改配置檔案

先選用預設的配置檔案

1 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig

然後開啟menuconfig,在對應的介面中啟用與MPTCP相關的選項後儲存

1 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

DEBUG過程

由於有張博士給的程式碼,移植過程並不是特別漫長,不過由於張博士的程式碼是Android系統的核心,和樹莓派程式碼有一定出入,所以經歷了一段DEBUG的過程

不同的人遇到的BUG也不可能完全相同,因此這裡我無法寫出明確的DEBUG的路線,只能分享一點我的經驗

  • 不同的核心之間差異非常大,移植的話最好能夠選擇兩個較為接近的版本,不要盲目求新,這樣能節約下很多工作量

  • 不要蠻幹,對要移植的程式碼一定要有相應的知識儲備,這樣在遇到問題時才有可能意識到是哪裡出了問題,當遇到Android系統核心和樹莓派的核心程式碼有出入的時候才能理清是不是與MPTCP相關

  • 保證細心,改動可能很多,一定要自己明白這段和要移植的功能有關再動手。如果這時候為了省時間偷懶,只會在後來的BEBUG上花費更多的時間

  • DEBUG時確保自己沒有任何錯誤再編譯,編譯核心需要很長時間,如果改一點點就編譯,會浪費很多時間在等編譯上

  • 編譯核心時的輸出資訊十分龐大,想要在這麼多資訊中找到錯誤很困難。這時可以將編譯資訊匯出到文字,可以比較方便的查詢warning、error等資訊,具體操作如下

    1 make -j4 zImage modules dtbs > kernel.log

    這樣會把編譯資訊儲存到kernel.log檔案中


相關推薦

(OK) 編譯核心移植MPTCP過程

編譯核心及移植MPTCP過程 編譯方式 編譯核心有兩種方式:本地編譯和交叉編譯 本地編譯是指在需要安裝核心的裝置上直接編譯,編譯得到的核心也是在本地執行交叉編譯是指一個在某個系統平臺下可以產生另一個系統平臺的可執行檔案的編譯器。交叉編譯在目標系統平臺(開發出來的應用

撩課-JavaWeb之Statement介面與預編譯語句呼叫儲存過程

Statement介面 介面 Statement介面作用 用於進行Java程式和資料庫之間的資料傳輸 具體類有3個實現 Statement 用於對資料庫進行通用訪問,使用的是靜態sql PreparedStatement PreparedSta

手把手帶你自制Linux系統之六 編譯核心busybox完成系統定製

手把手帶你自制Linux系統之六 編譯核心及busybox完成系統定製 重新看了一下前面的幾章,發現其實前面的5章一直圍繞一個話題講解 — 如何利用CentOS現有資源組裝一個Linux。這種方式十分拙劣,Linux核心是固化的、initrd沒有充分精簡、命令需要一個一個

JVM原理(Java代碼編譯和執行的整個過程+JVM內存管理垃圾回收機制)

變化 並行 colspan 同時 簡單的 table 目前 動態 中心 轉載註明出處: http://blog.csdn.net/cutesource/article/details/5904501 JVM工作原理和特點主要是指操作系統裝入JVM是通過jdk中Java.ex

c++ 編譯OpenCV-3.3.0過程遇到的問題

          工作電腦之前用的是vs2013,這是在自己電腦上由於使用比較少,vs下載安裝包太大,平時用eclipse與idea用得也比較習慣,所以就有了這篇文章 平臺: windows 7

Jetson TX2重新編譯核心過程記錄

因為要裝dpdk,需要uio模組,但是tx2原裝的系統沒有這個模組,故重新編譯核心。 1. 獲取TX2 linux核心原始碼 2. 獲取當前系統的配置檔案 進入核心目錄下,即kernel-4.4/ z

linux 2.6下編譯核心啟用iptablesnetfilter

      最近在配置snat試,開啟iptables總是不成功,原來netfilter的功能在核心編譯時沒有選,所以需要載入netfilter模組,可我是菜鳥根本不會載入模組,只有重新編譯了核心。找了幾篇文章總結如下: 編譯核心時,您可以選擇使用make config、make menuconfig或ma

Linux核心檔案系統移植之jffs2燒錄後無法啟動

近一週的時候都在玩linux 核心及檔案系統移植,使用的版本如下: Bootloader: u-boot-2010.06.tgz Kernel:   linux-3.0.y.tgz

05-S3C2440學習之核心移植)linux3.4.2移植(3)之支援DM9000C網絡卡修改支援串列埠2

接下來我們在此基礎上,在linux3.4.2中移植DM9000c網絡卡驅動,使核心可以支援網絡卡晶片,這樣方便使用NFS網路檔案系統。 一、移植思路 (1)我們現在移植好的核心中,支援smdk24

Linux 核心編譯步驟配置詳解

前言    Linux核心是作業系統的核心,也是作業系統最基本的部分。    Linux核心的體積結構是單核心的、但是他充分採用了微核心的設計思想、使得雖然是單核心、但工作在模組化的方式下、並且這個模組可以動態裝載或卸 載;Linux負責管理系統的程序、記憶體、裝置驅動程式、檔案和網路系統,決定著系統的效

vsftpd 編譯安裝 隱藏版本號

str 本地服務 沒有 版本號 取數據 賦值 其他 映射 自動啟動 環境:Redhat Enterprise Linux AS 4.0 update2(i386) 不提示,均表示以root權限執行。 [註:]//為註釋符,如“// 建立MySQL組”,即為一句註釋。 我

JAVAEE開發工具環境配置過程

www system 環境 aries 文件 clip ppi env app 軟件152 盧仁順 一、準備開發環境 1. 安裝Tomcat 這裏使用Apache Tomcat作為Web容器,下載網址: http://tomcat.apache.org/download-7

java --代碼編譯和執行的整個過程

pan home 面向 share 簡單的 下一條 c++ oot 註解 1. 什麽是 JVM   JVM 是 Java 的核心和基礎,在 Java 編譯器和 os 平臺之間的虛擬處理器。它是一種基於下層的操作系統和硬件平臺並利用軟件方法來實現的抽象的計算機,可以在上面執行

java之JVM學習--簡單理解編譯和運行的過程之概覽

層次 概覽 聲明 是否 class 異常處理器 語義 net ots java代碼編譯流程圖: java字節碼執行由JVM執行引擎完成 Java代碼編譯和執行的整個過程包含了以下三個重要的機制: Java源碼編譯機制 類加載機制 類執

Linux中如何恢復rm命令誤刪除的文件之extundelete編譯安裝使用

可用 並且 地址 cat inode res 丟失 lin 所在 1、下載extundelete包,安裝依賴 我用的是Centos系統,在安裝extundelete之前需要安裝e2fsprogs,e2fsprogs-libs,e2fsprogs-devel。 yum in

達夢數據庫存儲過程存儲過程調用

程序 auth ger result 時間 post manage building 計時 /***Manager***/CREATE OR REPLACE PROCEDURE "GZAPP_09"."SP_OLAP_V_BUILDINGTYPE"("P_DATE" IN

jsoncpp linux平臺編譯和arm移植

clas inux sta 編譯 動態 cpp 取出 dir 沒有 下載 http://sourceforge.net/projects/jsoncpp/ 或者 http://download.csdn.net/detail/chinaeran/8631141 Linux平

文章閱讀:計算機體系-計算機將代碼編譯和持續運行過程中需要考慮的問題,以及具體的實現原理講解

body ext ont 計算機 display convert pan 數據 borde 文章太棒,我無法理解和評價,備份一下。1、編程漫遊 - Mr.Riddler‘s Puzzle http://blog.mrriddler.com/2016/12/15/%E7%BC

LinuxFL2440使用過程遇到的各種問題和小技巧

變化 AR tro 退出 details 服務 level bootstrap 標準輸出 原文鏈接:http://www.cnblogs.com/NickQ/p/8900474.html ## Linux及FL2440使用過程遇到的各種問題和小技巧 關於移植linux根文

nginx源碼編譯安裝配置文件說明

nginx源碼安裝nginx源碼編譯安裝 安裝nginx的依賴包(pcre-devel openssl-devel) [root@anuo ~]# yum install pcre-devel openssl-devel -y 創建管理用戶 nginx [root@anuo ~]# useradd -s /s