Presentation is loading. Please wait.

Presentation is loading. Please wait.

实验一:编译运行Linux内核并使用gdb进行调试

Similar presentations


Presentation on theme: "实验一:编译运行Linux内核并使用gdb进行调试"— Presentation transcript:

1 实验一:编译运行Linux内核并使用gdb进行调试
助教:吴加禹、李佳伟、唐凯成 田成锦、汪睿、游翎璟

2 实验目的 熟悉Linux系统运行环境 制作根文件系统 掌握Linux内核编译方法 学习如何使用gdb调试内核
2019/5/6

3 实验环境 主机:Ubuntu i386 14.04 调试的Linux内核版本:2.6.26
2019/5/6

4 实验内容——环境准备 准备Linux内核 下载linux-2.6.26.tar.gz,解压缩 编译
wget tar -zvxf linux tar.gz 编译 cd linux make i386_defconfig make 2019/5/6

5 实验内容——环境准备 准备qemu 下载安装 sudo apt-get install qemu 2019/5/6

6 实验内容——1.制作根文件系统 准备一个应用程序,使用静态链接将其编译为可执行文件, 命名为init 建立目标根目录映像
gcc -static -o init xxx.c 建立目标根目录映像 dd if=/dev/zero of=myinitrd4M.img bs=4096 count=1024 mkfs.ext3 myinitrd4M.img mkdir rootfs sudo mount -o loop myinitrd4M.img rootfs 将init拷贝到目标根目录下 sudo cp init rootfs/ 2019/5/6

7 实验内容——1.制作根文件系统 准备dev目录 sudo mkdir rootfs/dev
sudo mknod rootfs/dev/console c 5 1 sudo mknod rootfs/dev/ram b 1 0 sudo umount rootfs 使用qemu启动系统 qemu-system-i386 -kernel PATH-TO-linux /arch/x86/boot/bzImage –initrd myinitrd4M.img -append “root=/dev/ram init=/init” 2019/5/6

8 实验内容——1.制作根文件系统 实验结果 提示 可以在qemu窗口看到init的输出结果 你可能要用以下指令终止qemu进程:
ps -ef | grep qemu | grep -v grep | awk '{print $2}' | xargs sudo kill 2019/5/6

9 实验内容——1.使用busybox制作根文件系统
wget tar -jxvf busybox tar.bz2 cd busybox 编译 make defconfig make menuconfig  #修改配置如下: Settings –> Build Options [*] Build static binary(no share libs) (-m32 -march=i386) Additional CFLAGS (-m32) Additional LDFLAGS What kind of applet links to install –> (X) as soft-links make make install 2019/5/6

10 实验内容——1.使用busybox制作根文件系统
准备根文件系统( 在busybox的_install目录下) sudo mkdir dev sudo mknod dev/console c 5 1 sudo mknod dev/ram b 1 0 创建init文件写入以下内容 #!/bin/sh echo "INIT SCRIPT“ mkdir /proc mkdir /sys mount -t proc none /proc mount -t sysfs none /sys mkdir /tmp mount -t tmpfs none /tmp echo -e "\nThis boot took $(cut -d' ' -f1 /proc/uptime) seconds\n" exec /bin/sh 2019/5/6

11 实验内容——1.使用busybox制作根文件系统
准备根文件系统( 在busybox的_install目录下) find . -print0 | cpio --null -ov --format=newc | gzip -9 > PATH-TO- defined_by_you/initramfs-busybox-x86.cpio.gz 运行 qemu-system-i386 -s -kernel PATH-TO-linux2.6.26/arch/x86/boot/bzImage - initrd PATH-TO-defined_by_you/initramfs-busybox-x86.cpio.gz --append "root=/dev/ram init=/init" 2019/5/6

12 实验内容——1.使用busybox制作根文件系统
在上一步得到的qemu命令行中练习以下Linux命令 ls、touch、cat、echo、mkdir、mv、cd、cp等 ls       # 查看当前目录下的所有文件/文件夹 ls -l    # 查看当前目录下的所有文件/文件夹的详细信息 touch 1.txt # 创建1.txt echo i am 1.txt > 1.txt # 向1.txt写入内容 cat 1.txt  # 查看1.txt内容 mkdir 1   # 创建目录1 mv 1.txt 1 # 将1.txt移动到目录1 cd 1     # 打开目录1 cp 1.txt 2.txt # 将1.txt复制到2.txt 2019/5/6

13 实验内容——2.使用gdb调试内核 gdb是什么? gdb怎么用? gdb是一款终端环境下的调试工具 以调试普通C程序为例
编译程序时加入-g选项,如:gcc -g -o test test.c 运行gdb调试程序:gdb test 2019/5/6

14 实验内容——2.使用gdb调试内核 gdb常用命令如下 r/run # 开始执行程序
b/break <location>   # 在location处添加断点,location:代码行或函 数名 c/continue       # 继续执行到下一个断点或程序结束 n/next      # 运行下一行代码 list           # 显示当前行代码 p/print <expression>  # 查看表达式expression的值 2019/5/6

15 实验内容——2.使用gdb调试内核 在qemu中加入gdb调试选项 建立gdb与gdb server之间的链接 此时窗口会等待gdb连接
qemu-system-i386 -s -S -kernel PATH-TO-linux /arch/x86/boot/bzImage – initrd PATH-TO-defined_by_you/initramfs-busybox-x86.cpio.gz -nographic – append "root=/dev/ram init=/init console=ttyS0“ 此时窗口会等待gdb连接 建立gdb与gdb server之间的链接 gdb target remote: # 建立gdb和gdb server间的连接 c          #继续运行 (由于没有加载符号表,不方便设置断点,下面介绍如何断点调试) 2019/5/6

16 实验内容——2.使用gdb调试内核 加载符号表,并进行断点调试(查看vmlinux的符号用nm命令)
file PATH-TO-linux /vmlinux 设置断点 break start_kernel 执行到断点 c 若要显示断点处的源代码,需在编译内核时提供相关支持 配置Linux编译选项,使之携带调试信息 make menuconfig kernel hacking --> [*] compile the kernel with debug info 2019/5/6

17 验收方式 现场验收 利用gdb在内核中设置1~2个断点,查看断点处源代码 在qemu中运行Linux内核
2019/5/6

18 报告提交方式 将实验报告、源代码打包为压缩包提交 提交至邮箱:ustc_os2019@163.com
邮件主题、文件名称、压缩包名称 均采用以下格式命名 x-学号-姓名(x:代表第x次实验) 例如张三的第1次实验命名为“1-PB 张三” 未按照规范命名的邮件会被忽略、删除 (第一次实验没有修改源代码,只需提交报告即可) 2019/5/6


Download ppt "实验一:编译运行Linux内核并使用gdb进行调试"

Similar presentations


Ads by Google