(blog นี้ assume ว่าสามารถ compile kernel เป็นแล้ว)
สมมติว่าจะเพิ่ม system call ที่ชื่อ hellokernel ซึ่งทำหน้าที่ print คำว่า "hello kernel!" ออกมาเก็บใน log ไฟล์
1. สร้างไฟล์ hellokernel.c ไว้ใน /usr/src/linux-2.6.34.1/kernel
#include <linux/linkage.h>
#include <linux/kernel.h>
asmlinkage int sys_hellokernel() {
printk(KERN_EMERG "hello kernel!");
return 1;
}
2. เพิ่มเลขของ system call ใหม่ในไฟล์ /usr/src/linux-2.6.34.1/include/asm-generic/unistd.h
- ให้ค้นหาคำว่า "#undef __NR_syscalls" แล้วบรรทัดก่อนบรรทัดนี้ให้เติม
#define __NR_hellokernel 244
__SYSCALL(__NR_hellokernel, sys_hellokernel)
โดยตัวเลข 244 นั้นให้ดูว่า system call ตัวก่อนหน้านั้นเป็นเบอร์อะไร (ของผมเป็น __NR_recvmmsg 243) ก็ให้เอาเลขนั้นบวก 1
- และบรรทัดต่อจากนั้น #define __NR_syscalls นั้นให้บวก 1 เข้าไป (ของเดิมของผมเป็น 244 ก็เปลี่ยนเป็น 245)
3. แก้ไขไฟล์ /usr/src/linux-2.6.34.1/arch/x86/kernel/syscall_table_32.S (สำหรับกรณีเครื่อง x86 ถ้าเป็นเครื่องอื่นก็แก้ที่โฟลเดอร์ของ arch นั้นๆ)
- เพิ่ม .long sys_hellokernel ไว้ที่ท้ายสุดของไฟล์ต่อลงมา
4. แก้ไข Makefile ใน /usr/src/linux-2.6.34.1/kernel
- เพิ่ม hellokernel.o ให้กับ obj-y (ต่อท้ายสุดก็ได้)
เรียบร้อยแล้วให้ทำการคอมไพล์ Kernel ใหม่ แล้ว boot เข้า kernel ที่ใหม่นี้ แล้วทดสอบโดยการสร้างไฟล์ test.c ขึ้นมา
#include <linux/unistd.h>
#define __NR_hellokernel 244 // 244 แทนเลขของ system call ที่ประกาศไว้ข้างบน
main() {
syscall(__NR_hellokernel);
}
เสร็จแล้วก็ลอง compile แล้ว run ดู ถ้าสำเร็จจะมีข้อความ "hello kernel!" ปรากฏอยู่ใน log file ของ kernel ที่ /var/log/kernel/warnings
ระบบที่ทดสอบ
OS: Ubuntu 10.04
Kernel: Linux Kernel 2.6.34.1
อ้างอิงหนังสือ Operating System Concepts 8th Edition, A. Silberschatz, P. B. Galvin, and G. Gagne
ไม่มีความคิดเห็น:
แสดงความคิดเห็น