Linux 内核支持很多种cpu架构,架构相关的代码放在内核 arch 子目录中,如下图:
以上众多架构中有一个 um 架构,全名叫user mode,它不是一种实体的cpu架构,这个架构的linux内核可以像 helloworld程序一样运行,运行于linux之上用户空间中,取名User Mode Linux,简写UM
AMD 和 英特尔 的电脑上都可以运行UM linux 内核:
使用前准备:
下载解压linux内核源码本文使用 linux-5.4.24,其他版本的使用方法可能有细微区别
模块" class="reference-link">配置编译内核和模块
cd linux-5.4.24make ARCH=um x86_64_defconfigmake ARCH=um linux -j6make ARCH=um modules -j6
编译完成,生成 linux 文件,这个就是要运行的内核程序
试运行
./linux
内核已经运行,下面会出错,是因为没有根文件系统
下载根文件系统
下载链接:https://pan.baidu.com/s/1lhIXpeyN-zRCAej-zOahLg 提取码:l34s下载解压,得到 root_fs,把root_fs放到linux-5.4.24 目录中
运行User Mode Linux
./linux
可以正常启动 ubuntu 18.04 LTS 系统
Minicom 连接 User Mode Linux
打开 minicom 配置:
sudo minicom -s
详细配置如下图
输入用户名密码:root/root,登录系统使用
查看 uml 系统信息:
Uml 内核版本是 5.4.24,就是刚刚编译的内核版本Cpuinfo 信息显示:vendor_id 是 User Mode LinuxUml 根目录大小1.5G,和 root_fs 文件大小一样Uml 内存一共26MB,很小Host 主机内核版本5.3.0,是电脑的版本:
UML 系统中运行用户程序
随便写个程序,先在主机编译运行成功。比如app_x86_64 运行
uml 系统关机:因为 uml linux 当作用户程序运行的,所以直接给进程发信号终止就可以
复制程序到 root_fs 硬盘:
sudo mount -o loop root_fs /mntsudo cp ../../project_mys_y6ulx/application/app_x86_64 /mntls /mntsudo umount /mnt
uml 重新开机,minicom 登录,查看并运行根目录中的app_x86_64,可以成功运行,并输出ROBE=9.,和电脑主机运行的结果一样
笔者已经把 uml 的 linux 程序也复制到 uml linux 跟文件系统中了,运行 ./linux 也可以。
也就是在 linux 电脑上运行了一个 uml linux 系统,uml linux 系统中又运行了一个 uml linux 系统,这个系统没有root_fs 文件,最后报错,panic 退出了,又回到上面小标题中那个问题了
UML 可以在电脑上测试 linux 内核代码中于架构无关的部分,也是一种方法