2016.10.18 @NCHU, Taichung
下載內核及相關套件
(1) sudo apt-get update
更新資料。若連不上預設伺服器「tw.archive.ubuntu.com」,可至「系統設定值」→「軟體與更新」→「選擇下載伺服器」更改伺服器
更新資料。若連不上預設伺服器「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權限
切換至root權限
(4) cd /usr/src
進入/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版為例)。
利用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資料夾
解壓縮檔案。也可使用 tar xf 指令
解壓縮完後使用 ls –l 指令可看到解壓縮完產生的linux-4.4.25資料夾
新增system call
(1) cd linux-4.4.25
進入/usr/src/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.tbl、syscall_64.tbl兩個檔案,請依照作業系統位元版本選擇要修改的檔案(可用 getconf LONG_BIT 指令得知當前作業系統位元版本)
(檔案路徑:/usr/src/linux-4.4.25/arch/x86/entry/syscalls/syscall_64.tbl)
新增自定義system call以及編號。注意:在syscalls資料夾內有syscall_32.tbl、syscall_64.tbl兩個檔案,請依照作業系統位元版本選擇要修改的檔案(可用 getconf LONG_BIT 指令得知當前作業系統位元版本)
(3) gedit
include/linux/syscalls.h
(檔案路徑:/usr/src/linux-4.4.25/include/linux/syscalls.h)
宣告systam call。
(檔案路徑:/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」找到這行程式碼)
(檔案路徑:/usr/src/linux-4.4.25/Makefile)
在core-y += kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/這行結尾新增mycall (可搜尋關鍵字「core-y」找到這行程式碼)
撰寫system call
(1) mkdir mycall
(2) gedit mycall/mycall.c
(3) gedit mycall/Makefile
obj-y := mycall.o
obj-y := mycall.o
(4) cp /boot/config-`uname -r`
./.config
製作(編譯)內核、更新內核
(1) make menuconfig
進入menu後,使用方向鍵右鍵切換至<Load>
進入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)
編譯內核會花上一段時間,可於結尾加上指令 -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兩個編譯完成的檔案
返回 /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
安裝Linux image 以及 headers
(7) sudo init 6
重新啟動電腦,從「進階選項」(advanced options for Ubuntu)選擇安裝好新版內核的系統
重新啟動電腦,從「進階選項」(advanced options for Ubuntu)選擇安裝好新版內核的系統
測試自定義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)
執行結果:the result of mycall is 74
(輸入10,回傳10+64)
沒有留言:
張貼留言