找回密码
 立即注册
configincludeLinuxreboot | 软件设计/软件工程 2022-05-06 222 0star收藏 版权: . 保留作者信息 . 禁止商业使用 . 禁止修改作品
问题
我使用自定义 initrd 在用户模式下编译了 Linux 内核 5.6,使用以下命令创建:
  1. mkdir initrd
  2. cd initrd
  3. mkdir bin dev etc home mnt proc sys usr
  4. mknod dev/console c 5 1
复制代码

使用初始化文件

初始化/初始化.c
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/mount.h>
  4. #include <unistd.h>

  5. int main(int argc, char *argv[]) {
  6.     printf("init\n");

  7.     mount("none", "/proc", "proc", MS_MGC_VAL, "");
  8.     mount("none", "/sys", "sysfs", MS_MGC_VAL, "");
  9.     mount("none", "/dev", "devtmpfs", MS_MGC_VAL, "");

  10.     if (access("/dev/ubda", F_OK) != -1) {
  11.         printf("/dev/ubda exists\n");
  12.     } else {
  13.         printf("/dev/ubda not exists\n");
  14.     }

  15.     return EXIT_SUCCESS;
  16. }
复制代码

该程序通过选项检查磁盘。

使用 ubd0=... 编译。

毕竟我编译了内核

gcc -static -o init init.c
  1. make mrproper
  2. make mrproper ARCH=um
  3. make defconfig ARCH=um
  4. make menuconfig ARCH=um
  5. make linux ARCH=um
复制代码

我更改了文件中的以下选项(使用 menuconfig)

.config
  1. CONFIG_BLK_DEV_INITRD=y
  2. CONFIG_INITRAMFS_SOURCE="initrd"
  3. CONFIG_RD_GZIP=y
  4. CONFIG_RD_BZIP2=y
  5. CONFIG_RD_LZMA=y
  6. CONFIG_RD_XZ=y
  7. CONFIG_RD_LZO=y
  8. CONFIG_RD_LZ4=y
复制代码

毕竟我试过跑步,一切看起来都很好,除了退出

./linux 内存=32M

如何优雅地退出?

回答
init 进程绝不能退出。退出init的正确方法是关闭。
  1. #include <linux/reboot.h>

  2. int main(int argc, char *argv[]) {
  3.   // ...
  4.   // return EXIT_SUCCESS;

  5.   sync();
  6.   reboot(LINUX_REBOOT_MAGIC1,
  7.      LINUX_REBOOT_MAGIC2,
  8.      LINUX_REBOOT_CMD_POWER_OFF, 0);
  9. }
复制代码

在 glibc 和大多数可选 libcs?? ??(包括 uclibc、dietlibc、musl 和其他一些)下,所涉及的一些常量已被赋予符号名称 RBú*,并且库调用是系统调用的单参数包装器:
  1. #include <sys/reboot.h>

  2. int main(int argc, char *argv[]) {
  3.   // ...
  4.   // return EXIT_SUCCESS;

  5.   sync();
  6.   reboot(RB_POWER_OFF);
  7. }
复制代码

对于停止或重新启动系统的 cmd 值,将不会返回对 reboot() 的成功调用。





上一篇:更新到 Spyder 4.0.0 时出错
下一篇:线程和 Tkinter/Python3