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 内核代码中于架构无关的部分,也是一种方法