操作系统实验二

实验二(题目五)

概要

  • 题目内容:改变主机名称为自定义字符串
  • 思路:通过系统提供的更改文件的系统调用,对/etc/hostname进行更改
  • 平台:华为云ubuntu20.04操作系统
  • 注意:内核编译完成后,服务器重启之后一定要用VCN登录,在VCN上再reboot一下,会出现一个选择界面,选第二个就可以看到你编译的内核了,cloud重启登录内核是加不进去的
  • 命令:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.14.295.tar.xz
    xz -d linux-4.14.295.tar.xz
    tar -xvf linux-4.14.295.tar
    vim arch/x86/entry/syscalls/syscall_64.tbl //添加调用号
    vim include/linux/syscalls.h //函数声明
    vim kernel/sys.c //函数实现
    apt-get install libncurses5-dev
    apt-get install libssl-dev
    apt-get install flex
    apt-get install bison
    make mrproper
    make menuconfig
    make -j128
    make -j128 modules
    make modules_install
    make install
    reboot
    编译过程中好像有个关于debian….的错误,笔者是输入 scripts/config –set-str SYSTEM_TRUSTED_KEYS “” 解决的 ,还有就是哪个bzimg的错误(编译的时候先把服务器配置改成128核的CPU,然后就很快乐)

调用函数代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SYSCALL_DEFINE2(ysethostname, char __user*, name,int, len)
{
int errno;
char tmp[64]={0};
if(len <0 || len>64)
return -1;
errno=0;
mm_segment_t fs;
fs=get_fs();
set_fs(get_ds());
if(!copy_from_user(tmp,name,len)){
int fhost=sys_open("/etc/hostname", O_WRONLY | O_RDONLY,0);
sys_write(fhost,tmp,64);
errno=1;
}
sys_close(fhost);
set_fs(fs);
return errno;
}

测试调用C代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<unistd.h>
#include<sys/syscall.h>
#include<stdio.h>
#include<string.h>
int main()
{
char name[64];
printf("input name:");
scanf("%s",name);
int len=strlen(name);
syscall(334,name,len);
printf("success\n");
return 0;
}

author: YaoGuangMing 2022-HDU

转载请标明出处!