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
#update-initramfs -c -k 核心版本 (建立initrd的image檔)
#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後解決。
最早用的核心版本與OS是linux 2.6.18 & Ubuntu 11.04 ,但編譯完成後一直無法開機,上網查資料後推測可能是ubuntu版本太新無法相容,之後才改成現在的這個版本。
最後,即使換了版本依然碰到無法開機的問題,加上 指令#update-initramfs -c -k 核心版本 後克服( ubuntu 10 以後的版本不會自動產生該檔案)。
附圖:
沒有留言:
張貼留言