首页 > 其他 > 详细

深入理解系统调用 -- 课程实验2

时间:2020-05-27 22:14:30      阅读:64      评论:0      收藏:0      [点我收藏+]

一、 搭建Linux内核调试环境

  本次实验的目录架构,一个主目录LinuxK,其包含3个文件夹:linux-5.4.34内核文件夹,busybox文件夹和rootfs文件夹。

  安装开发工具

sudo apt install build-essential
sudo apt install qemu # install QEMU 
sudo apt install libncurses5-dev bison ?ex libssl-dev libelf-dev

  下载内核源码

# 在linuxK目录下
sudo apt install axel
axel -n 20 https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/ linux-5.4.34.tar.xz 
xz -d linux-5.4.34.tar.xz 
tar -xvf linux-5.4.34.tar 
cd linux-5.4.34

  配置内核选项

# 在linux-5.4.34目录下
make defcon?g # Default con?guration is based on x86_64_defcon?g
make menucon?g  
# 打开debug相关选项
Kernel hacking  ---> 
    Compile-time checks and compiler options  ---> 
       [*] Compile the kernel with debug info 
       [*]   Provide GDB scripts for kernel debugging
[*] Kernel debugging 
# 关闭KASLR,否则会导致打断点失败
Processor type and features ----> 
   [] Randomize the address of the kernel image (KASLR)

  技术分享图片

  编译运行内核

#在linux-5.4.34目录下
make -j$(nproc) # nproc gives the number of CPU cores/threads available
# 测试?下内核能不能正常加载运?,因为没有?件系统终会kernel panic 
qemu-system-x86_64 -kernel arch/x86/boot/bzImage  #  此时应该不能正常运行

  技术分享图片

  制作根文件系统

  电脑加电启动?先由bootloader加载内核,内核紧接着需要挂载内存根?件系统,其中包含必要的设备驱动和?具,bootloader加载根?件系统到内存中,内核会将其挂载到根?录/下,然后运?根?件系统中init脚本执??些启动任务,最后才挂载真正的磁盘根?件系统。我们这?为了简化实验环境,仅制作内存根?件系统。这?借助BusyBox 构建极简内存根?件系统,提供基本的?户态可执?程序。

# 在busybox目录下
axel -n 20 https://busybox.net/downloads/busybox-1.31.1.tar.bz2
tar -jxvf busybox-1.31.1.tar.bz2
cd busybox-1.31.1

  注意:由于与gcc兼容性问题,不要去官网下载busybox,可用在https://github.com/mirror/busybox 下载 busybox。

make menuconfig
#记得要编译成静态链接,不?动态链接库。
Settings --->
     [*] Build static binary (no shared libs)
#然后编译安装,默认会安装到源码?录下的 _install ?录中
make -j$(nproc) 
make install
#制作内存根文件系统镜像
# 在linuxK目录下
mkdir rootfs
cd rootfs
cp ../busybox-1.31.1/_install/* ./ -rf
mkdir dev proc sys home
sudo cp -a /dev/{null,console,tty,tty1,tty2,tty3,tty4} dev/

  准备init脚本?件,放在根?件系统跟?录下(rootfs/init),添加如下内容到init?件中

 #!/bin/sh
 mount -t proc none /proc 
 mount -t sysfs none /sys
 echo "Wellcome MyOS!"
 echo "--------------------" 
 cd home
 /bin/sh 
#在 rootfs 目录下 给init脚本添加可执?权限
chome +x init
# 在 rootfs目录下,打包成内存根?件系统镜像
find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../rootfs.cpio.gz
# 测试挂载根?件系统,看内核启动完成后是否执?init脚本
qemu-system-x86_64 -kernel linux-5.4.34/arch/x86/boot/bzImage -initrd rootfs.cpio.gz  

  技术分享图片

  此时,完成内核调试环境的搭建。

二、跟踪调试Linux内核

  

深入理解系统调用 -- 课程实验2

原文:https://www.cnblogs.com/LiScott/p/12976202.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!