ทดลองทำใน 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;
}
who the hell are you ?
ตอบลบ