1. 程式人生 > >linux 編譯進核心 && 編譯成模組module

linux 編譯進核心 && 編譯成模組module

refer:

http://blog.csdn.net/yicao821/article/details/6740269

http://blog.csdn.net/yicao821/article/details/6740269

1.核心編譯命令(makefile)

obj-y:把由foo.c 或者 foo.s 檔案編譯得到foo.o 並連線進核心.

obj-m: 則表示該檔案作為模組編譯.

除了y、m以外的obj-x 形式的目標都不會被編譯。

2.核心編譯 (make menuconfig)

make   menuconfig

*標識編譯到核心,

M標識作為核心模組編譯.

空格,表示該功能不編譯到核心中,即新的核心將不支援該功能.

3.模組靜態編譯到核心和編譯成模組例項

【實驗目的】
     配置編譯支援目標板的Linux-2.6.22.6的核心,熟悉Linux核心的配置選項和編譯過程。
熟悉模組靜態編譯到核心和編譯成模組,動態載入的方法和過程。

【實驗環境】
1、主  機:Ubuntu 10.10 發行版 [首先得配置好開發環境]
2、目標機:FS2410開發板以及移植好的u-boot-2010.03、核心原始碼包:linux-2.6.22.6.tar.bz2(打補丁後便支援FS2410)
4、交叉編譯器 arm-linux-gnu-gcc-3.4.5

【實驗步驟】

一、模組靜態編譯到核心
(1) 解壓核心
$tar xvfz linux-2.6.22.6.tar.bz2

進入解壓後的linux-2.6.22.6目錄打補丁

$patch -p1 < ../linux-2.6.22.6_jz2440.patch

進入核心目錄
$cd linux-2.6.22.6

(2)修改Makefile檔案
修改核心目錄樹根下的的Makefile,指明交叉編譯器:
$vim Makefile
找到ARCHCROSS_COMPILE,修改
ARCH = arm
CROSS_COMPILE = arm-linux-gnu-

儲存退出

(3)新增程式檔案
2410GPIO_TEST_drv.c 檔案拷貝到核心程式碼目錄 drivers/char
(4)修改MakefileKconfig

檔案
進入核心的 drivers/char 目錄
$vim Makefile
找到在 obj-$(CONFIG_HANGCHECK_TIMER) += hangcheck-timer.o ,在其下一行新增:
obj-$(CONFIG_2410GPIO_TEST_DRV) += 2410GPIO_TEST_drv.o
儲存退出vim
     (5)修改Kconfig檔案
$vim Kconfig
在以下程式碼段下面
menu "Character devices"
加入以下資訊:
config 2410GPIO_TEST_DRV
   tristate "S3C2410 test drv Device Support"
   depends on ARCH_S3C2410
    ---help---
   support led test device driver on FS2410 develop board

(6)配置核心將 2410GPIO_TEST_drv.c 靜態編譯金核心

$cp config_ok   .config (使用提供的配置檔案 make s3c2410_defconfig 使用預設的配置檔案)
$make menuconfig
 
選擇 “Character devices” 選單項,進入後出現如下:
 
在第一項“S3C2410 test drv Device Support (NEW)”按“空格”鍵使其前面括號中的出現“*”,<*>
 
選“exit”退出,繼續選“exit”退出,出現提示:
 
選擇 Yes,退出。

(7)編譯核心產生uImage檔案, 並將uImage拷貝到/tftpboot目錄中,復位開發板,重新啟動。編譯命令:
 $   make uImage
 $ sudo cp -f uImage /tftpboot//uImage
 $ sudo chmod 777 -R /tftpboot

 (8)交叉編譯 2410GPIO_TEST_APP.c
     arm-linux-gnu-gcc 2410GPIO_TEST_APP.c –o test

(9)複製 test /opt/filesystem(NFS檔案系統)目錄下
 $ sudo cp test /opt/filesystem/root
  重新給目標板上電,讓它使用新的核心
[注意,以下10,11步驟在目標板的終端視窗中執行]
(10)建立  GPIO_TEST 裝置節點,在開發板上執行如下命令:
# mknod -m 666 /dev/GPIO_TEST c 252 0
(11) 執行 test 測試,在開發板上執行如下命令:(此時進入的為/root目錄下)
   # ./test

此時,D12LED燈在閃爍。

二、編譯成模組

(1) 重新配置編譯核心,將GPIO_TESt編譯成模組,動態載入
進入到 linux-2.6.22.6目錄執行
$make menuconfig
選擇 “Character devices” 選單項,進入後出現如下:
 在第一項“S3C2410 test drv Device Support (NEW)”按“空格”鍵使其前面括號中的出現“M”,<M> ,如下圖:
 
選“exit”退出,繼續選“exit”退出,出現提示:
 
選擇 Yes,退出。
(2)編譯核心產生uImage檔案, 並將arch/arm/boot/uImge拷貝到/tftpboot目錄中,復位開發板,重新啟動:
 $ make uImage modules
 $sudo cp -f uImage /tftpboot/uImage

(3)複製 linux-2.6.22.6/drivers/char/2410GPIO_TEST_drv.ko/opt/filesystem/lib
  $ sudo cp drivers/char/2410GPIO_TEST_drv.ko /opt/filesystem/lib
 
  重新給目標板上電,讓它使用新的核心

[注意,以下4, 5, 6步驟在目標板的終端視窗中執行]
(4)載入模組 2410GPIO_TEST_drv,在開發板上執行如下命令:
    #insmod /lib/2410GPIO_TEST_drv.ko
(5)建立  GPIO_TEST 裝置節點,在開發板上執行如下命令:
  # mknod -m 666 /dev/GPIO_TEST c 252 0
(6) 在/root/目錄下執行 test 測試,在開發板上執行如下命令:
  # ./test
此時,D12LED燈在閃爍。