搜尋此網誌

中央氣象局:高雄市今明天氣預報

2012年11月5日 星期一

使用ubuntu 編譯核心 玩system call


System Call

學號:49975025


編譯環境:

VirtualBox 3.2.8 r64453

Ubuntu 10.04

原核心版本:   linux 2.6.32

編譯核心版本:linux 2.6.34.13

編譯步驟:

1./linux/arch/x86/kernel/syscall_table_32.S 中加入新的system call 名稱

    .long sys_名稱

2./linux/arch/x86/include/asm/unistd_32.h中,
定義步驟一的system call與呼叫的編號,並且將syscalls 的總數加一  

    define __NR__名稱 338
    NR_syscalls (338 +1) -> 339 

3./linux/arch/x86/include/linux/syscall.h中新增system call 函式定義 

    asmlinkage int sys_名稱(void);

4./linux/kernel/名稱.c  中加入自訂的system call內容
 
5./linux/kernel/Makefile 中加入  名稱.o obj-y  

6.編譯kernel前加入套件 sudo apt-get install libncurses5-dev 

7.重新編譯核心

/linux下執行指令 

#make mrproper            (清除核心功能選擇檔)
#make menuconfig        (挑選核心功能)
#make bzImage             (編譯經壓縮過的核心)
#make modules             (編譯模組)
#make modules_install  (安裝模組)
#make install                (安裝核心)  

8.更新多重核心選單(grub)
 
#sudo gedit /etc/default/grab
 
GRUB_HIDDEN_TIMEOUT=5 

#update-initramfs -c -k 核心版本  (建立initrdimage)

#updata-grub
 
9.寫一個C程式呼叫system call 

10.編譯並執行程式 

#gcc new.c
#./a.out
#dmesg | tail
 
問題與討論: 

起初make menuconfig 過不了,加了套件(apt-get install libncurses5-dev)
後才成功。

編譯核心完成後,碰到沒有辦法切換和新的問題,將/etc/default/grub中的grub時間改長一點,加上updata-grub後解決。

最早用的核心版本與OSlinux 2.6.18 & Ubuntu 11.04 ,但編譯完成後一直無法開機,上網查資料後推測可能是ubuntu版本太新無法相容,之後才改成現在的這個版本。

最後,即使換了版本依然碰到無法開機的問題,加上 指令#update-initramfs -c -k 核心版本 後克服( ubuntu 10 以後的版本不會自動產生該檔案)。
 
附圖:
 
 





沒有留言:

張貼留言