- vừa được xem lúc

Xây dựng Linux kernel và thêm lời gọi hệ thống vào Linux kernel

0 0 15

Người đăng: Nhi Tran Yen

Theo Viblo Asia

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.

menuconfig

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.

make-j4

make-j4

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.

successful

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 ….):

Makefile

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:

syscalls.h

Bước 4: Dùng lệnh

 gedit arch/x86/entry/syscalls/syscall_64.tbl

Thêm dòng 449 như hình:

syscall_64.tbl

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 

successful

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

Bình luận

Bài viết tương tự

- vừa được xem lúc

Go Concurrency qua các ví dụ (Phần 1): Dining Philosophers

Bài toán Dining Philosophers (Bữa tối của các triết gia) là một trong những bài toán kinh điển thường dùng để mô tả các vấn đề trong việc xử lý concurrent, những vấn đề thường gặp trong quá trình cấp

0 0 247

- vừa được xem lúc

001: Sơ lược về Linux kernel

Bài viết nằm trong series Linux kernel: Hiểu về Operating System để tối ưu Software. Bản chất, Linux kernel cũng là software.

0 0 34

- vừa được xem lúc

Quản lý Process

1. Giới thiệu.

0 0 36

- vừa được xem lúc

Các Tiến Trình Trong Hệ Điều Hành Máy Tính

Trong bài viết này, chúng ta sẽ tìm hiểu cách quản lý tiến trình trong hệ điều hành và các thuật toán liên quan đến nó. Trước khi đi sâu vào tìm hiểu cách quản lý tiến trình thì trước hết ta sẽ xem qu

0 0 31

- vừa được xem lúc

Banker's Algorithms in Operating System

Algorithm Introduction. In a multiprogramming environment, several threads may compete for a finite number of resources.

0 0 9

- vừa được xem lúc

Một chương trình C được chạy như thế nào trên hệ điều hành Unix

Để hiểu được một chương trình C chạy như thế nào trên hệ điều hành Unix (ví dụ như Linux hoặc MacOS), chúng ta sẽ đi qua 3 chủ đề:. .

0 0 7