Xây dựng Linux kernel và thêm lời gọi hệ thống vào Linux kernel
1. Xây dựng Linux kernel.
Đầu tiên bạn phải ở chế độ người dùng root bằng cách dùng lệnh:
sudo -s
(Lưu ý: Khi nhập mật khẩu sẽ không hiển thị, nhập xong nhấn enter thì ký hiệu $ sẽ chuyển sang # là bạn đã ở chế độ root user).
Bước 1: Tải tất cả công cụ cần thiết dùng lệnh:
sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison
Bước 2: Xem kernel hiện tại dùng lệnh:
uname-r
Bước 3: Tải kernel 5.15 và giải nén dùng lệnh (tốc độ mạng càng cao thì tải càng nhanh):
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.tar.gz
tar xvzf linux-5.15.tar.gz
Sau khi giải nén bạn di chuyển đến thư mục linux-15.5 bằng lệnh:
cd linux-5.15
Bước 4: Chạy lệnh
make menuconfig
Tại đây bạn không nên thay đổi gì hết, chọn save và exit (hoặc nhấn esc 2 lần) . Nếu gặp lỗi do màn hình terminal của bạn quá nhỏ không thể mở menuconfig thì phải resize, kéo màn hình đủ 80 dòng 19 cột.
Bước 5: Biên dịch kernel, chạy lệnh:
make -j4
Nếu gặp lỗi No rule to make target 'debian/canonical-certs.pem thì chạy hai lệnh sau:
scripts/config --disable SYSTEM_TRUSTED_KEYS
scripts/config --disable SYSTEM_REVOCATION_KEYS
Hai lệnh trên sẽ không có output, khi chạy make -j4 cứ ấn enter để đồng ý và sẽ mất 1 đến 3 tiếng để biên dịch.
Bước 6: Cài đặt kernel modules và cài đặt kernel, dùng lệnh:
make modules_install
make install
Nếu gặp lỗi ở bước này thường là do gặp lỗi khi chạy make -j4, hãy kiểm tra kỹ, sửa lỗi và chạy lại make -j4 lại.
Bước 7: Cập nhật lại cấu hình grub:
sudo update-grub
Bước 8: Reboot lại máy (chạy lệnh reboot
). Sau khi khởi động máy dùng lệnh uname-r
để kiểm tra kernel vừa xây dựng có thành công hay không.
Nếu thất bại hãy xóa thư mục linux-5.15, giải nén và làm lại từ bước 4 hoặc nếu bạn sử dụng máy ảo bạn có thể xóa máy ảo, tạo máy mới và làm lại từ đầu. Đừng nản nhé, làm lại nhiều lần và gặp lỗi sẽ giúp bạn thông thạo, biết thêm nhiều kiến thức trong quá trình sửa lỗi. Chúc bạn thành công nhé!
2. Thêm lời gọi hệ thống vào Linux kernel
Có nhiều công cụ soạn thảo như vim, nano, gedit,... và mình thích sử dụng gedit còn bạn thích sử dụng công cụ nào thì cứ sử dụng công cụ đó nhé.
Đảm bảo bạn đang ở chế độ root user và ở tại thư mục linux-5.15.
Bước 1: Dùng lệnh
gedit kernel/hello.c
Tạo chương trình sau:
#include <linux/kernel.h>
asmlinkage long __x64_sys_hello(void)
{
printk(KERN_INFO "Xin chao\n");
return 0;
}
Bước 2: Dùng lệnh
gedit kernel/Makefile
Thêm hello.o vào như hình sau (nhớ \ xuống dòng, nếu bạn muốn thêm nhiều lời gọi khác thì hello.o name1.o name2.o ….):
Bước 3: Dùng lệnh
gedit include/linux/syscalls.h
Thêm dòng asmlinkage long sys_helloworld(void) vào cuối file trước endif như sau:
Bước 4: Dùng lệnh
gedit arch/x86/entry/syscalls/syscall_64.tbl
Thêm dòng 449 như hình:
Bước 5: Thực hiện biên dịch kernel (kiểm tra kỹ xem có lỗi chính tả ở các bước trên không rồi hẳn biên dịch nhé ): make -j4
, make modules_install
, make install
(như phần 1).
Bước 6: Tạo một chương trình C tên loigoi.c tại thư mục cá nhân (cd ~
) để biết lời gọi thành công hay không. Dùng lệnh:
gedit loigoi.c
Chương trình:
#include <stdio.h>
#include <sys/syscall.h>
#include <unistd.h>
int main()
{
long int call = syscall(449);
if (call == 0 ) printf("Successful\n");
else printf("Unsuccessful\n");
return 0;
}
Bước 7: Biên dịch và chạy chương trình C. Dùng lệnh
gcc hello.c -o hello
./hello
Lúc màn hình sẽ hiện “Successful” là lời gọi đã cài đặt thành công, còn nếu không thì sẽ hiện “Unsuccessful”
Bước 8: Tại thư mục cá nhân, thực hiện gọi lời gọi dùng lệnh:
dmesg
Kéo xuống dưới cùng sẽ hiện ra lời gọi bạn đã cài đặt. Vậy là hoàn thành rồi!
Mình đã trình bày tất cả các bước mình thực hiện với kernel version 5 nếu bạn thực hiện với kernel mới version 6 mình không chắc các bước có giống nhau không. Bên cạnh đó, trong quá trình thực hiện có thể bạn sẽ gặp những lỗi mình không đề cập đến, bạn hãy copy dòng thông báo lỗi đó và tìm kiếm trên google, có nhiều trang web như stackoverflow, askubuntu,... sẽ giúp bạn đưa ra gợi ý giải quyết vấn đề.
Mình chỉ là một noob đang học về linux, mình chỉ chia sẻ cách mình đã thành công xây dựng kernel và cài đặt system call nên mình không hiểu sâu và đủ kiến thức để giải thích cho bạn từng bước.
Mong bài viết này sẽ hữu ích với bạn!
Tài liệu tham khảo:
https://phoenixnap.com/kb/build-linux-kernel
https://dev.to/jasper/adding-a-system-call-to-the-linux-kernel-5-8-1-in-ubuntu-20-04-lts-2ga8
All rights reserved