1. 程式人生 > >Linux最小核心移植

Linux最小核心移植

Linux核心編譯
本篇部落格來自凌雲實驗室開發板介紹及其燒錄學習筆記

1.核心介紹

一種開源電腦作業系統核心。它是一個用C語言寫成,符合POSIX標準的類Unix作業系統。也就是,最上面是使用者(或應用程式)空間,程式執行的地方。**函式庫(glibc或uclibc)**提供了連線核心的系統呼叫介面,還提供了在使用者空間應用程式和核心之間進行轉換的機制。區別於51,stm32微控制器等,每個使用者空間的程序都使用自己的虛擬地址空間,而核心則佔用單獨的地址空間。
Linux核心

2.核心下載

現在核心更新的比較快,我們為s3c2440選擇3.0版本。附上核心下載連結
核心

3.檔案準備

博主使用的是三星的ARM9 S3C2440,該cpu是以armv4t指令集的ARM920t,跑ARM Linux的開發板時,以SMDK2440為模板支援相應的硬體。建立整體框架。

[[email protected] ~]$ mkdir fl2440
[[email protected] ~]$ cd fl2440/
[[email protected] fl2440]$ mkdir -p {crosstool,bootloader,linux/{kernel,rootfs},driver,3rdparty,program,images}
[[email protected] fl2440]$ tree
.
├── 3rdparty
├── bootloader
├── crosstool
├── driver
├── images
├── linux
│   ├── kernel
│   └── rootfs
└── program

9 directories, 0 files
[
[email protected]
fl2440]

4.核心修改編譯

下載原始碼後,修改成自己微控制器相應的型別
一般為開發板型號
3.1
其他型號都不需要選擇,只選擇s3c2440 and s3c2442 Machines
111
不同需要,比如更改串列埠驅動裝置,自己的交叉編譯器等等。
編譯前可以檢視一下C檔案和彙編檔案的多少,當然我這個是核心生成之後的檔案個數。

[[email protected] linux-3.0]$ find -name *.c | wc -l
16563
[[email protected] linux-3.0]$ find -name *.S | wc -l
1226
[
[email protected]
linux-3.0]$

5. 有趣的三角

擬寫一個shell指令碼,博主會在另一篇文章詳細講解,文章連結在這裡。

#!/bin/bash
make
mkimage -A arm -O linux -T kernel -C none -a 30008000 -e 30008040 -n "Linux Kernel" -d arch/arm/boot/zImage linuxrom-s3c2440.bin
chmod a+x linuxrom-s3c2440.bin

執行指令碼後就可以檢視生成結果了

[[email protected] linux-3.0]$ chmod a+x build.sh
[[email protected] linux-3.0]$ ./build.sh

... ... ...
Image Name:   Linux Kernel
Created:      Thu Mar 15 11:58:01 2018
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    2314180 Bytes = 2259.94 kB = 2.21 MB
Load Address: 30008000
Entry Point:  30008040
[[email protected] linux-3.0]$ ls
arch      CREDITS        firmware  ipc      lib                   mm               net             scripts     tools    vmlinux.o
block     crypto         fs        Kbuild   linuxrom-s3c2440.bin  modules.builtin  README          security    usr
build.sh  Documentation  include   Kconfig  MAINTAINERS           modules.order    REPORTING-BUGS  sound       virt
COPYING   drivers        init      kernel   Makefile              Module.symvers   samples         System.map  vmlinux
[[email protected] linux-3.0]$ 

6.可能遇到的問題

#####1)格式錯誤

... ... ...
[[email protected] linux-3.0]$ make s3c2410_defconfig
make: *** /home/klaus/fl2440/linux/linux-3.0/arch/arm: Is a directory.  Stop.

解決辦法,在改檔案路徑時,多空格少換號都不行,要嚴格注意

export KBUILD_BUILDHOST := $(SUBARCH)
ARCH            ?=arm
CROSS_COMPILE   ?=/opt/x-tools/arm920t/bin/arm-linux-

樓主我出現這個問題是因為我多打了一個空格,arm後面。
####2)缺少依賴

... ... ...
IHEX2FW firmware/emi62/spdif.fw
IHEX2FW firmware/emi62/midi.fw
./build.sh:line 3:mkimage:command not found
chmod:cannot access `linuxrom-s3c2440.bin`:No such file or directory
[[email protected] linux-3.0]$

可能是缺少uboot-tools之間這個依賴,可以直接下載這個安裝包進行安裝

[[email protected] ~]$ wget http://rpmfind.net/linux/epel/6/x86_64/Packages/u/uboot-tools-2011.03-1.el6.x86_64.rpm
[[email protected] ~]$ sudo rpm -ivh uboot-tools-2011.03-1.el6.x86_64.rpm

7.燒錄到開發板

核心生成後,我們可以嘗試將這個.bin檔案燒錄到現有的開發板上去,看看現象會怎樣
這裡在u-boot介面採用tftp下載到開發板

U-Boot 2010.09 (May 05 2017 - 19:48:28)

DRAM:  64 MiB
NAND:  256 MiB
In:    serial
Out:   serial
Err:   serial
Net:   dm9000
Hit any key to stop autoboot:  0 
[[email protected]]#
[[email protected]]# run tb
dm9000 i/o: 0x20000300, id: 0x90000a46 
DM9000: running in 16 bit mode
MAC: 00:11:22:33:44:55
could not establish link
Using dm9000 device
TFTP from server 192.168.100.8; our IP address is 192.168.100.18
Filename 'linuxrom-s3c2440.bin'.
Load address: 0x30008000
Loading: #################################################################
         #################################################################
         ##########################################################
done
Bytes transferred = 2752308 (29ff34 hex)
## Booting kernel from Legacy Image at 30008000 ...
   Image Name:   Linux Kernel
   Created:      2017-06-19  22:03:17 UTC
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    2752244 Bytes = 2.6 MiB
   Load Address: 30008000
   Entry Point:  30008040
   Verifying Checksum ... OK
   XIP Kernel Image ... OK
OK

Starting kernel ...

Uncompressing Linux... done, booting the kernel.
Linux version 3.0.0 ([email protected]) (gcc version 4.5.4 (Buildroot 2012.08) ) #2 Tue Jun 20 06:03:14 CST 2017
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
CPU: VIVT data cache, VIVT instruction cache
Machine: SMDK2440
Memory policy: ECC disabled, Data cache writeback
CPU S3C2440A (id 0x32440001)
S3C24XX Clocks, Copyright 2004 Simtec Electronics
S3C244X: core 405.000 MHz, memory 101.250 MHz, peripheral 50.625 MHz

... ... ... 

arp_tables: (C) 2002 David S. Miller
TCP cubic registered
NET: Registered protocol family 17
lib80211: common routines for IEEE802.11 drivers
Registering the dns_resolver key type
s3c-rtc s3c2410-rtc: setting system clock to 2017-10-31 02:57:07 UTC (1509418627)
Root-NFS: no NFS server address
VFS: Unable to mount root fs via NFS, trying floppy.
VFS: Cannot open root device "(null)" or unknown-block(2,0)
Please append a correct "root=" boot option; here are the available partitions:
1f00            1024 mtdblock0  (driver?)
1f01           15360 mtdblock1  (driver?)
1f02           40960 mtdblock2  (driver?)
1f03           81920 mtdblock3  (driver?)
1f04           81920 mtdblock4  (driver?)
1f05           40960 mtdblock5  (driver?)
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)
Backtrace: 
[<c003b2cc>] (dump_backtrace+0x0/0x110) from [<c040f60c>] (dump_stack+0x18/0x1c)
 r6:00008000 r5:c38ac000 r4:c056dd40 r3:c05446d4
[<c040f5f4>] (dump_stack+0x0/0x1c) from [<c040f66c>] (panic+0x5c/0x17c)
[<c040f610>] (panic+0x0/0x17c) from [<c0008de0>] (mount_block_root+0x1c8/0x208)
 r3:00000000 r2:20000013 r1:c3819f58 r0:c04c32ed
 r7:c04c3351
[<c0008c18>] (mount_block_root+0x0/0x208) from [<c0008fc8>] (mount_root+0xac/0xd0)
[<c0008f1c>] (mount_root+0x0/0xd0) from [<c000914c>] (prepare_namespace+0x160/0x1b4)
 r4:c056d680
[<c0008fec>] (prepare_namespace+0x0/0x1b4) from [<c00089d4>] (kernel_init+0xe4/0x118)
 r5:c0025d3c r4:c056d620
[<c00088f0>] (kernel_init+0x0/0x118) from [<c004d8ac>] (do_exit+0x0/0x624)
 r5:c00088f0 r4:00000000

系統會報出 **Unable to mount root fs on unknown-block(2,0)**這樣的錯誤,這時候就是缺少根檔案系統了,下一步,將根檔案系統樹燒進核心中繫結一起就以可以將系統跑起來,這裡檔案系統的製作連結

相關推薦

Linux核心移植

Linux核心編譯 本篇部落格來自凌雲實驗室開發板介紹及其燒錄學習筆記 1.核心介紹 一種開源電腦作業系統核心。它是一個用C語言寫成,符合POSIX標準的類Unix作業系統。也就是,最上面是使用者(或應用程式)空間,程式執行的地方。**函式庫(glibc或ucl

#嵌入式Linux系統移植# yaffs2根檔案系統移植出錯記錄

busybox官網地址: 本次移植採用的busybox版本: busybox-1.26.0.tar.bz2 交叉編譯工具鏈版本: $ arm-linux-gcc -v gcc version 4.4.3 (ctng-1.6.1) 1

#嵌入式Linux系統移植# 對uboot移植和裁剪的一點點個人思考和總結

思路: 1.分析啟動流程 2.移植config檔案(smdk440_config) 3.移植包含控制條件編譯巨集的.h檔案(configs/s3c2440.h) 4.移植板級初始化.c檔案(s3c2440.c) 5.移植RAM初始化?DDR? 6.移植NorF

Linux系統移植之早期打印CONFIG_DEBUG_LL

ace makefile add ssa ptr 終端 同時 虛擬 固件 一、幾個關鍵宏定義   CONFIG_DEBUG_LL、 CONFIG_DEBUG_LL_INCLUDE   容我慢慢道來, 首先要使能早期打印, menuconfig必須選中CONFIG_

基於itop4412在Linux系統下的 ffmpeg 的移植和測試

近期在做一個視訊監控的專案,在網上了解到如下的方案: 用的V4L2的視訊驅動,然後配合ffmpeg、x264的軟體編解碼,通過udp上傳至pc顯示,配合開源的編解碼庫,實現h.264的流編碼與傳輸。 前面我們已經實現了x264編碼庫的移植,並且做了測

Linux 化安裝後IP的配置

ica 否則 修改 網卡 9.png yum too 打開 www linux最小化安裝後沒有ifconfig這個命令: yum install net-tools.x86_64 這樣就安裝了ifconfig命令。 使用ifconfig看看IP: 可以看到並沒有自動分

Linux安裝配置網絡

centos 輸入 網卡配置 art scrip ive status inux 配置 安裝環境: VMware Workstation14 centos 7.5.1804 最小化安裝 安裝過程: 在系統安裝成功後進行網絡配置,我這裏采用的是動態ip配置。首先得知道網絡配

Linux 化安裝網絡卡問題

linux 最小化安裝網絡卡問題 一、linux最小化安裝,找不到網絡卡問題:用VI編輯器,編輯網絡卡配置檔案:vi /etc/sysconfig/network-scripts/ifcfg-eth0DEVICE=eth0ONBOOT=noBOOTPROTO=staticONTROLLED="no"IPAD

Linux 化安裝網卡問題

proto 找不到網卡 etc linx sta 網卡配置文件 rip icontrol 服務 linux 最小化安裝網卡問題 一、linux最小化安裝,找不到網卡問題:用VI編輯器,編輯網卡配置文件:vi /etc/sysconfig/network-scripts/if

ZYNQ學習之路1. Linux系統構建

開發環境:window10, vivado 2017.1, ubuntu 16.04, Eclipse+cdt硬體環境:米爾科技zturn board,zynq7z010  本筆記詳細介紹了開發ZYNQ

Linux 4.4核心移植以及Android系統編譯

Android預移植到tiny4412 kernel for tiny4412  前面的文章已經把uboot給弄好了,下面就可以用自己移植的uboot來啟動核心了。對於核心的移植,一開始選擇的是linux4.4的核心,為什麼選4.4,因為開始的時候是想

linux系統的製作(嵌入式第一節課)

準備工作 硬體工具: 電腦(安裝了linux虛擬機器(UBuntu或者CentOS),需要提供一個平臺環境) 一塊板子(我這裡是使用訊為提供的Cortex-A9 4412精英板) 軟體工具:

[嵌入式開發入門]4412開發板從零建立Linux系統

iTOP-4412開發板不僅可以執行Android,還可以執行簡單的Linux最小檔案系統。 最小Linux 系統“麻雀雖小,五臟俱全”,它不帶圖形介面的Linux 系統,剔除干擾因素便於理解,用來學習Linux系統程式設計非常合適。 另外,Linux最小系統佔用的

oracle linux化安裝系統後需要rpm安裝Fastdfs的安裝包和依賴包!無需任何編譯

所有rpm包除了依賴包都來自http://blog.51cto.com/purplegrape/1710514,感謝他!!!1.進入nginx_rpm安裝 。rpm -ivh *.rpm --nodeps --force ,在進入after_that目錄 rpm -ivh *

Linux 化安裝(非生產環境)

我的Linux版本是CentOS7  採用最小化安裝 在虛擬機器中安裝 目前使用者為 root 和yunwei 1.磁碟分割槽    boot 200M    swap 2048M    /root 5096M    /var    10240M 2.靜態IP    採

製作linux核心(2)

    製作最小linux核心(1) 一文中定製了一個小型核心,當重啟系統載入小型核心後,往螢幕上輸出"Hello world"。說實話,這樣的OS並沒有什麼作用,至少得有個能和使用者互動的介面吧?本文將繼續定製核心,以實現這個目的。要實現這個目的需要2部分支援:1.繼續配

fl2440核心移植(一)——系統

--------------------------------------------------------------------------------------------------------------------------------    系統環境

移植linux-3.0.62 + busybox系統到單板TQ2440

玩了一段時間裸板開發,u-boot也移植好了,現在開始專注驅動開發,首先把linux最小系統搭建起來,移植網絡卡驅動,用NFS掛載檔案系統,再完善其它驅動。 開發環境: 系統:ubuntu 10.04.4 單板:tq2440 NAND FLASH:K9F1216U0A 25

linux核心構建的根檔案系統-一步一步精簡

linux核心init程序函式的部分程式碼如下: 01 if (execute_command) 02 run_init_process(execute_command); 03 04 run_init_process("/sbin/init");

從0移植uboot(三) _編譯可用uboot

for 移植 腳本 wid fine been dbo 設備 var 來源:Linux社區 作者:xiaojiang1025 :http://www.linuxidc.com/Linux/2017-02/141020.htm 前兩篇介紹了uboot-