Linux Kernel Porting #1, 基本概念
(原文發表於 2005/01/17)
作者/陳俊宏
Copyright (c) 2005
Last date: 2005/01/17
理論上,一個完整的 Embedded Linux 系統開機過程可分成 3 個階段:
bootstrap loader
boot loader
linux kernel
bootstrap loader 比較像是 PC 上的 BIOS,大部份的target device,像是evaluation board、reference board等,都是在設計板子時由廠商設計完成並提供(ship)給終端使用者(end-user)。
Boot loader 則是像 desktop Linux 上的 LILO、GRUB 等,支援 ARM 的 boot loader 像是比較知名的 RedBoot 等都可以用在 ARM 板子上,一般 boot loader 都會提供 serial port 傳輸與 MTD 支援,讓我們可以燒錄資料到 ROM (flash) 裡。本文會以KS8695 (ARM9) 板子來當例子,這張板子上的 boot loader 還支援 ethernet 傳輸,可以讓我們透過網路將資料直接燒錄到 ROM 裡面。
* 可以參考筆者所著”Embedded Linux 嵌入式系統—原理與實務 (2e),學貫”第6 章有關 Linux 在 PC (x86) 上的開機流程講解。
我們主要所要講解的部份為 linux kernel 本身的 porting。再次,就理論上,對於linux kernel本身的porting可以分為2個層面來討論:
Microprocessor architecture level
Board support package (BSP) level
Microprocessor architecture level 主要的工作是讓 Linux kernel 能支援不同的處理器架構,例如:PowerPC、ARM、MIPS...等等。Microprocessor 又可分為 MMU 與 MMU-less 的架構,前者可使用標準的 Linux kernel 來 porting,後者可使用 uClinux 做為解決方案。Linux kernel 本身 (包含 uClinux) 對於微處理器架構方面的 porting 工作都已經完成了! 所以我們沒有可以發揮的空間,因此 BSP level 的 porting 才是目前做 kernel porting 最主要的工作。
我們以 KS8695 板子為例來做說明。Board support package 故名思義就是要修改 kernel 讓 kernel 可以支援我們所設計的板子,我們所使用的板子採用 KENDIN KS8695 SoC,這顆 SoC 是 ARM9TDMI 的架構,因此我們要先對 Linux kernel 做 ARM Linux 的 patch,讓 Linux kernel 能完整支援 ARM 微處理器。
接著,就要修改 patch 好的 Linux kernel (ARM9) 讓 kernel 可以支援 KS8695 這顆 SoC。也就是基於支援 ARM9 (armv) 的 Linux kernel 來加入 (porting) 對 KS8695 SoC 的支援,即進行 KS8695 的 board support package level porting。
針對 ARM (with MMU) 的 BSP porting 工作,是存在一個標準的操作流程的! 在本文#2中將會介紹此 porting 流程。
--jollen
Linux Kernel Porting #2, 基本流程與方法
Copyright (c) 2005
Last date: 2005/01/17
在將 Linux kernel porting 到其它的 ARM 平臺之前, 必須先取得標準 Linux kernel,然後再做 ARM Linux patch。
下載以下檔案:
ftp://ftp.arm.linux.org.uk/pub/armlinux/source/kernel-patches/v2.4/patch-2.4.26-vrs1.gz
ftp://ftp.nsysu.edu.tw/Linux/Kernel/linux/kernel/v2.4/linux-2.4.26.tar.bz2
安裝 Linux kernel 與 patch:
# bzip2 -dc linux-2.4.26.tar.bz2 | tar xf -
# mv linux-2.4.26 linux-2.4.26-vrs1
# cd linux-2.4.26-vrs1
# gzip -dc ../patch-2.4.26-vrs1.gz | patch -p1 -
本文以 KS8695 板子為實例,說明如何將 kernel 2.4.26 (vrs1) porting 到其它的 ARM 平臺。對於所有的 ARM 平臺而言,我們可以歸納出 3 個基本的 porting 流程如下:
1. 登錄一個 Machine ID
2. 編輯 config.in 設定檔與 Makefile.
linux/arch/arm/config.in
arch/arm/Makefile
arch/arm/boot/Makefile
arch/arm/mach-XXX/Makefile
3. 修改原始檔如下.
arch/arm/kernel/entry-armv.S
arch/arm/kernel/debug-armv.S
arch/arm/mach-XXX/arch.c
arch/arm/mach-XXX/irq.c
arch/arm/mach-XXX/mm.c
include/asm/arch/dma.h
include/asm/arch/hardware.h
include/asm/arch/io.h
include/asm/arch/irq.h
include/asm/arch/irqs.h
include/asm/arch/keyboard.h
include/asm/arch/memory.h
include/asm/arch/param.h
include/asm/arch/system.h
include/asm/arch/timex.h
include/asm/arch/uncompress.h
include/asm/arch/vmalloc.h
以上是 porting Linux 到其它 ARM 平臺的大原則與方法。
--jollen