วันอังคารที่ 16 ธันวาคม พ.ศ. 2551

การ Compile kernel และ การเพิ่ม System Call ให้กับ Kernel


ทดลองทำใน Ubuntu 8.04

ก่อนอื่นทำการเปลี่ยน source.list ให้ตัว apt ก่อนโดยใช้
Source.list ของ มหาวิทยาลัยเกษตรแทนเนื่องจากเป็น linkภายในประเทศเพื่อความรวดเร็วในการดาวโหลดไฟล์ที่จำเป็นต่างๆ

โดยเริ่มเเรกเเข้าไปที่เวปไซต์

http://mirror1.ku.ac.th
แล้วโหลด source ดังภาพ
หลังจาก โหลด เสร็จเเล้ว จะได้ ไฟล์ source.list ที่อยู่บนหน้าจอ Desktop
ทำการเปลี่ยนระดับสิทธิการใช้งานให้เป็น root โดยใช้คำสั้ง

su แล้วตามด้วย Password

ใช้คำสัง
mv .../Desktop/source.list /etc/apt
[โดย ... นั้นจะเเล้วแต่ว่า Path ของแต่ละคนจะตั้งว่าอย่างไร ]
สั้ง ให้ ทำการ Update ดวยคำสั้ง
apt-get update

หลังจากนั้นทำการ ดาวโหลด ซอสโค็ดของลินุกมาทำการติดตั้งด้วยคำสั้ง

apt-get install linux-source

ติดตั้ง package ที่จำเป็นสำหรับการ คอมไพล์ kernel ด้วยคำสั้ง

aptitude install kernel-package libncurses5-dev fakeroot wget bzip2

ทำการ แตกไฟล์ไปไว้ที่ /usr/src ด้วยคำสั่ง

cd /usr/src
tar xjf linux-2.6.20.15.tar.bz2 // ขึ้นอยู่กับ เวอชั้นของ kernel ที่ ดาวโหลดมา
ln –s linux-2.6.20.15 linux
cd /usr/src/linux

ทำการ Config kernel โดยคำสั้ง

make menuconfig

เริ่มทำการ build kernel ใหมาโดยใช้คำสั้ง

make-kpkg clean

fakeroot make-kpkg --initrd –-append-to-version=-custom kernel_image kernel_headers


จากนั้นติดตั้ง kernel ที่ได้จากการ build ข้างต้นด้วยคำสั้ง

dpkg –i linux-image-2.6.20.15-custom_2.6.20.15-custom-10.00.Custom_i386.deb
dpkg –i linux-headers-2.6.20.15-custom_2.6.20.15-custom-10.00.Custom_i386.deb

จากนั้น Reboot ระบบใหม่
แล้วเลือก ใช้ kernel อันใหม่ จาก boot menu



--------------------------------------------
ส่วนการจะเพิ่ม System Call ให้กับ kernel นั้นสามารถทำได้โดยก่อนที่จะ build kernel นั้น
ให้ เขียน System call ที่ต้องการก่อน ขอยกตัวอย่างง่ายๆดังต่อไปนี้

#include
asmlinkage long sys_mycall(int i, int j) {
return(i+j);
}

Source ภาษา C ข้างต้นนั้นเป็น ตัวอย่างของ System call อย่างง่ายที่
สามารถ รับค่าจำนวนเต็มสองจำนวนแล้ว ส่งผลลัพธ์ที่ได้จากการ + ไปให้กับโปรแกรมที่เรียกใช้มัน
หลังจากนั้น save เป็น file ที่ชื่อว่า mycall.c

เพิ่ม “.long sys_mycall” ต่อท้าย ไฟล์
usr/src/linux/arch/i386/kernel/syscall_table.S


และจากไฟล์
/usr/src/linux/include/asm-i386/unistd.h
เพิ่ม
#define __NR_mycall
โดย Last_System_Call_Num นั้นเป็นหมายเลขของ System Call สุดท้ายที่อยู่ในไฟล์ unistd.h

เพิ่ม "asmlinkage long sys_mycall(int i, int j);" ต่อท้ายไฟล์/usr/src/linux/include/linux/syscalls.h

เพิ่ม /usr/src/linux/Makefile ที่ข้อความว่า core-y += ต่อท้ายในบันทัดเดียวกัน ว่า /mycall
ได้ผลลัพธ์ ประมาณ
core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ mycall/

สร้าง directoryใหม่ชื่อว่า mycall ที่ /usr/src/linux/
แล้วนำไฟล์ mycall.c เข้ามาใส่ไว้



แล้วสร้างไฟล์ที่ชื่อว่า
makefile
ไว้ที่/usr/src/linux/mycall
โดยเนื้อหาใน ไฟล์นี้คือ

########## Start of Makefile ##########
obj-y := mycall.o
########## End of Makefile ##########

แล้วก็ทำการ build kernel ตามปกติ
โดยสามารถลอง ทดสอบ System call อันใหม่ได้โดยใช้ โค๊ดโปรแกรมด่านล่าง

#include
#include
#define __NR_mycall
long mycall(int i, int j) {
return syscall(__NR_mycall, i, j);
};
int main() {
printf(“%d\n”, mycall(10, 20));
return 0;
}

1 ความคิดเห็น: