基础环境
虚拟机环境
- VMware® Workstation 16 Pro 16.2.4 build-20089737
- Ubuntu14.04 amd64
真机环境
- Intel(R) Core(TM) i7-7700HQ CPU (AMD64)
- Windows 10 专业版 22H2
- Visual Studio 1.79.2
- Visual Studio 插件配置
- C/C++ v.1.15.4
- C/C++ Extension Pack v1.3.0
- Remote SSH v0.102.0
- Remote SSH: Editing Configuration v0.86.0
- Remote Explorer: v.0.4.0
Ubuntu14.04 设置
- root 设置
1
2
|
//设置root密码
sudo passwd
|
- 软件更新
1
2
|
sudo apt-get update
sudo apt-get upgrade
|
- 开机root 登录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# 修改50-ubuntu.conf
gedit /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf
# 修改内容
[SeatDefaults]
user-session=ubuntu
autologin-user=root
greeter-session=unity-greete
greeter-show-manual-login=true
allow-guest=false
# 修改.profile
gedit /root/.profile
# 修改内容
# mesg n
tty -s && mesg n
|
- 禁止提示ubuntu更新
参考配置方案[3]
相关软件安装
ssh安装与vscode远程连接设置
- 安装ssh
1
2
3
4
5
6
7
8
9
10
|
# 1. 安装
sudo apt-get install openssh-server -y
# 2. 修改配置文件
sudo gedit /etc/ssh/sshd_config
# 3. 修改选项
# Authentication:
LoginGraceTime 120
#PermitRootLogin prohibit-password
PermitRootLogin yes
StrictModes yes
|
- Vscode 远程连接
参考配置方法[2]
Linux Source Code
下载地址:
Index of /pub/linux/kernel/
1
2
|
# 解压
tar -zxvf linux-2.6.32.20.tar.gz
|
qemu
1
2
3
4
5
|
# 安装
apt-get install qemu -y
# 检测安装结果
qemu-i386 -version
# qemu-i386 version 2.0.0 (Debian 2.0.0+dfsg-2ubuntu1.46), Copyright (c) 2003-2008 Fabrice Bellard
|
gcc
要求安装gcc 4.4
1
2
3
4
5
6
7
8
9
10
|
# 安装
apt-get install gcc-4.4
ls /usr/bin -l | grep gcc #可以看到gcc是一个链接文件,连接到gcc-4.8版本;可以把本链接删除,重新链接gcc到gcc-4.4版本;
# 删除4.8版本的gcc软连接
sudo rm -rf /usr/bin/gcc
sudo ln /usr/bin/gcc-4.4 /usr/bin/gcc
# 检查安装结果
sudo gcc -v # 查看最终链接好的版本。
|
安装必要的编译环境
1
2
3
|
apt-get install aptitude -y
aptitude install libncurses5-dev -y
apt-get install libssl-dev -y
|
gdb
- 卸载原有gdb,并下载gdb源码
1
2
|
sudo apt-get autoremove gdb
wget http://ftp.gnu.org/gnu/gdb/gdb-7.9.tar.gz
|
- 修改源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
vim gdb-7.9/gdb/remote.c
# 修改内容
if (buf_len > 2 * rsa->sizeof_g_packet)
error (_("Remote 'g' packet reply is too long: %s"), rs->buf);
# 改为
if (buf_len > 2 * rsa->sizeof_g_packet) {
rsa->sizeof_g_packet = buf_len;
for (i = 0; i < gdbarch_num_regs (gdbarch); i++)
{
if (rsa->regs[i].pnum == -1)
continue;
if (rsa->regs[i].offset >= rsa->sizeof_g_packet)
rsa->regs[i].in_g_packet = 0;
else
rsa->regs[i].in_g_packet = 1;
}
}
|
- 编译安装
1
2
3
4
|
cd gdb-7.9
sudo ./configure
sudo make
sudo make install
|
- 检查安装结果
BusyBox 源码安装编译
1
2
3
4
5
6
7
8
9
10
11
|
# 下载源码
wget --no-check-certification https://busybox.net/downloads/busybox-1.25.0.tar.bz2
# 解压
tar -xvjf busybox-1.25.0.tar.bz2
# 编译
make defconfig
make menuconfig
make -j4
|
make menuconfig 在编译选项中需要手动勾选的项
1
2
|
# 检查安装结果,与截图中的内容相同则安装成功
./busybox ls
|
Linux内核编译
1
2
3
4
5
6
|
# 下载
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.20.tar.gz
# 编译
make menuconfig
make -j4
|
检查安装结果
根文件系统制作
- 将busybox安装后生成的_install文件单独拷贝到一个文件夹
1
2
3
|
mkdir ramdisk
cd ramdisk
cp -r ../busy-1.25.0/_install/* .
|
- 设置初始化进程init(建立一个软链接,一定不能直接复制过去)
1
2
|
cd ramdisk
ln -s bin/busybox init
|
- 设置开机启动程序
1
2
|
cd ramdisk
mkdir -pv {bin,sbin,etc,proc,sys,usr/{bin,sbin},dev}
|
- init程序首先会访问etc/inittab文件,因此,我们需要编写inittab,指定开机需要启动的所有程序
1
2
3
|
cd ramdisk
cd etc
vim inittab
|
1
2
3
4
5
6
|
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
|
- 编写系统初始化命令
从inittab文件中可以看出,首先执行的是/etc/init.d/rcS脚本,因此,我们生成初始化脚本
1
2
3
4
|
cd ramdisk
mkdir init.d
cd init.d
vim rcS
|
rcS文件添加如下内容
1
2
3
4
5
6
7
|
#!/bin/sh
mount proc
mount -o remount,rw /
mount -a
clear
echo "My Tiny Linux Starting, press enter to active"
|
- 设置文件系统
在rcS脚本中,mount -a 是自动挂载 /etc/fstab 里面的东西,可以理解为挂在文件系统,因此我们还需要编写 fstab文件来设置我们的文件系统。
1
2
|
cd ramdisk/etc/
vim fstab
|
1
2
3
4
|
#/etc/fstab
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
devtmpfs /dev devtmpfs defaults 0 0
|
- 压缩生成镜像
至此,我们已经完成了RAM Disk中相关文件的配置,可以压缩生成文件镜像了。
1
2
|
cd ramdisk
find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../initramfs.img
|
最后生成的initramfs.img就是我们的根文件系统
qemu+gdb调试linux kernel
直接运行
1
|
qemu-system-x86_64 -kernel ./linux-2.6.32.20/arch/x86_64/boot/bzImage -initrd ./initramfs.img -append "console=ttyS0" -nographic
|
调试运行
1
|
qemu-system-x86_64 -kernel ./linux-2.6.32.20/arch/x86_64/boot/bzImage -initrd ./initramfs.img -append "console=ttyS0" -nographic -S -s
|
1
2
3
4
|
gdb vmlinux # vmlinux为内核根目录下的文件
# 进入gdb后
target remote:1234 # qemu默认端口,可以更改
|
Vscode 远程调试
远程连接后添加配置文件lanuch.json
运行>添加配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "LinuxKernel-Debug",
"type": "cppdbg",
"request": "launch",
"miDebuggerServerAddress": "127.0.0.1:1234",
"program": "${workspaceFolder}/vmlinux",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"logging": {
"engineLogging": false
},
"MIMode": "gdb",
"miDebuggerPath": "/usr/local/bin/gdb"
}
]
}
|
正常调试
[1] QEMU+GDB调试Linux内核总结
[2] VSCode使用Remote SSH连接远程服务器
[3] 怎么禁止/开启Ubuntu自动更新升级
[4] 搭建 Linux 内核网络调试环境