[Linux]시스템 호출 제작

ywwwon01·2022년 6월 18일
2

Linux

목록 보기
3/3
post-thumbnail

1. Vmware와 같은 가상머신 환경을 사용하여 컴파일된 운영체제를 설치

https://releases.ubuntu.com/
20.04


2. 커널 설치

패키지 설치

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install build-essential libncurses5 libncurses5-dev bin86 libssl-dev bison flex libelf-dev

kernel-package 설치가 안돼서

그냥 kernel-package 빼고 설치했습니다..

커널 설치

🔗 https://www.kernel.org/

# 커널 설치
# /usr/src 위치에서
sudo wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.17.8.tar.xz

# 압축 해제
sudo xz -d linux-5.17.8.tar.xz
sudo tar xvf linux-5.17.8.tar

cd linux-5.17.8
sudo cp /boot/config-5.15.0-30-generic ./.config
sudo make menuconfig

Your display is too small to run Menuconfig 라는 오류 떠도 당황하지 마세요

터미널 창이 작아서 그런거라네요

터미널 창을 잡고 쭉 늘려보세요!!

이런 창이 뜨면

LoadOK

SaveOK

Exit

하면 된다..

sudo vim .config

.config에서 문제가 되는 라인은 다음과 같습니다

각 라인을 주석처리 합니다.

--disable로 처리하는 방법도 있습니다..

CONFIG_MODULE_SIG_ALL
CONFIG_MODULE_SIG_KEY
CONFIG_SYSTEM_TRUSTED_KEYS

가용 코어 갯수 확인
(+) 가상머신의 설정 창에서 가용 코어 갯수를 늘리거나 줄이는 설정을 할 수 있는 것으로 알고 있었습니다.

grep -c processor /proc/cpuinfo

저는 빨리 해보고 싶으니까,12개로 돌리고 컴파일 시작했습니다.

sudo make -j 12
sudo make modules_install
sudo make install

Linux kernel version 변경

sudo vim /etc/default/grub

sudo update-grub
reboot # 재부팅 후, 부팅 화면에서 +Advanced options for Ubuntu에 들어가 커널 버전 선택

# 현재 커널 버전 확인
uname -r

성공


3. 시스템 호출 추가

  • /usr/src/linux-5.17.8/kernel 위치에 mySysCall_ywkim.c 생성

추가된 시스템 호출 함수 설명 및 코드

  • 매개변수로 정수 값 하나를 받습니다.

  • 추가된 시스템 호출 함수는 입력으로 받은 정수 값이 자신의 생일 날짜(day)가 맞으면 자신의 이름과 생일을 출력하며 그렇지 않으면 'Incorrect Input!'이라는 메시지를 출력합니다.

  • mySysCall_ywkim.c 작성

#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/syscalls.h>

SYSCALL_DEFINE1(mySysCall_ywkim, int, inputDay) {
    int myBirthDay = 4;

    struct tm my_time;

    if (inputDay == myBirthDay) {
        printk("Yewon Kim\n");
        printk("2001. 8. 4.\n");
    }
    else {
        printk("Incorrect Input!\n");
    }
    return 0;
}
  • /kernel/Makefile에 mySysCall_ywkim.o 추가

  • 시스템 콜 테이블 syscall_64.tbl 에 등록

  • syscalls.h 수정


4. system call 추가 후 커널 컴파일

  • 컴파일 중에 나오는 오류 메시지 보면서, 오류 있는 부분은 전부 --disable 처리 해버렸습니다.
sudo cp /boot/config-5.15.0-30-generic ./.config
sudo make menuconfig
# LOAD -> OK, SAVE -> OK, EXIT

sudo scripts/config --disable SYSTEM_TRUSTED_KEYS
sudo scripts/config --disable SYSTEM_REVOCATION_KEYS
sudo scripts/config --disable MODULE_SIG_ALL
sudo scripts/config --disable MODULE_SIG_KEY
sudo scripts/config --disable CONFIG_DEBUG_INFO_BTF
# sudo scripts/config --disable SYSTEM_TRUSTED_KEYS && sudo scripts/config --disable SYSTEM_REVOCATION_KEYS && sudo scripts/config --disable MODULE_SIG_ALL && sudo scripts/config --disable MODULE_SIG_KEY && sudo scripts/config --disable CONFIG_DEBUG_INFO_BTF

sudo make -j 12
sudo make modules_install
sudo make install

컴파일 시간 기록

make시작 시간종료 시간결과
try118일 12:4618일 1:25코드가 바보
try420일 14:58(오류 발견, 강제 종료) 3:04
try520일 17:13밥먹고왓더니 오류로 멈춰있었음
18:8(이어서)18:58성공?

sed: can’t read modules.order: No such file or directory

  • reboot

5. system call test

vim test.c
#include <unistd.h>
#include <stdio.h>

int main() {
    int test;
    test = syscall(548, 4);
    printf("%d\n", test);
    test = syscall(548, 12);
    printf("%d\n", test);
}
sudo dmesg
# sudo dmesg -c --> clear

gcc test.c
./a.out
sudo dmesg

  • 여기서 생년월일이나 'Incorrect Input!' 메시지 밑에 출력되는 0. 0. 0. 0:0:0은 현재 시간을 출력해보려고 했다가 실패한 흔적입니다 🥲 (무시해주세요!!)

이상입니다. 감사합니다!

profile
생각의 전개를 공유합니다.

1개의 댓글

comment-user-thumbnail
2022년 6월 23일

과제의 해답이 이곳에 있군요! 😏

답글 달기