2016年10月20日 星期四

在Linux kernel 4.4.25上新增system call


2016.10.18 @NCHU, Taichung
  1. 下載內核及相關套件

(1)  sudo apt-get update
更新資料。若連不上預設伺服器「tw.archive.ubuntu.com」,可至「系統設定值」「軟體與更新」「選擇下載伺服器」更改伺服器
(2)  sudo apt-get install kernel-package fakeroot libncurses5-dev libncursesw5-dev libssl-dev build-essential xz-utils
下載製作內核所需要的套件
(3)  sudo su
切換至root權限
(4)  cd /usr/src
進入/usr/src資料夾
(5)  wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.4.25.tar.xz
利用wget指令下載Linux內核(在此以4.4.25版為例)

也可直接到www.kernel.org網站上下載


(6)  tar xpvf linux-4.4.25.tar.xz.1
解壓縮檔案。也可使用 tar xf 指令
解壓縮完後使用 ls –l 指令可看到解壓縮完產生的linux-4.4.25資料夾

  1. 新增system call

(1)  cd linux-4.4.25
進入/usr/src/linux-4.4.25 資料夾
(2)  gedit arch/x86/entry/syscalls/syscall_64.tbl
(
檔案路徑:/usr/src/linux-4.4.25/arch/x86/entry/syscalls/syscall_64.tbl)
新增自定義system call以及編號。注意:在syscalls資料夾內有syscall_32.tblsyscall_64.tbl兩個檔案,請依照作業系統位元版本選擇要修改的檔案(可用 getconf LONG_BIT 指令得知當前作業系統位元版本)


(3)  gedit include/linux/syscalls.h
(
檔案路徑:/usr/src/linux-4.4.25/include/linux/syscalls.h)
宣告systam call


(4)  gedit Makefile
(
檔案路徑:/usr/src/linux-4.4.25/Makefile)
core-y +=  kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/這行結尾新增mycall (可搜尋關鍵字「core-y」找到這行程式碼)

  1. 撰寫system call

(1)  mkdir mycall
(2)  gedit mycall/mycall.c
(3)  gedit mycall/Makefile
obj-y := mycall.o
(4)  cp /boot/config-`uname -r` ./.config

  1. 製作(編譯)內核、更新內核

(1)  make menuconfig
進入menu後,使用方向鍵右鍵切換至<Load>



(2)  make-kpkg clean


(3)  fakeroot make-kpkg --initrd kernel_image kernel_headers
編譯內核會花上一段時間可於結尾加上指令 -j 加速編譯
(-j 16 means using all 16 cores to compile the kernel)
 
(4)  cd ..; ls -l
返回 /usr/src
可以看到linux-headers-4.4.25_4.4.25-10.00.Custom_amd64.deb
linux-image-4.4.25_4.4.25-10.00.Custom_amd64.deb
兩個編譯完成的檔案
 
(5)  dpkg -i linux-image-4.4.25_4.4.25-10.00.Custom_amd64.deb
(6)  dpkg -i linux-headers-4.4.25_4.4.25-10.00.Custom_amd64.deb
安裝Linux image 以及 headers
(7)  sudo init 6
重新啟動電腦,從「進階選項」(advanced options for Ubuntu)選擇安裝好新版內核的系統


  1. 測試自定義system call

(1)  uname -r
察看當前內核版本

(2)  gedit testmycall.h
 

(3)  gedit testmycall.c
 
(4)  gcc testmycall.c -o testmycall
(5)  ./testmycall
執行結果:the result of mycall is 74
(
輸入10,回傳10+64)



參考資料

http://www.cyberciti.biz/faq/debian-ubuntu-building-installing-a-custom-linux-kernel/

沒有留言:

張貼留言