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