-
-
[原创]穿越了?研究Linux 2.6内核和驱动?
-
发表于: 2天前 230
-
都2026年了,现在研究Linux2.6还有意义吗?除了毛德操老师的书是2.4的,《深入Linux内核架构》,《Linux内核设计与实现》《深入理解LINUX内核》这些经典书都是2.6的,所以研究一下还是很有必要的。
1.
废话不多说,直接开干,本文创建Linux2.6的内核和驱动的GDB调试环境。先安装vmware虚拟机,然后安装Ubuntu24,这一步就不多介绍了。
2.
在Ubuntu24中安装Docker,这步就不多介绍了,很简单。
3.
Docker中启动虚拟机Ubuntu12.04,这是因为Linux2.6太老了,所以我们需要老的编译环境
docker run -it --name kernel_build -v /your/local/share:/shared ubuntu:12.04 /bin/bash
4.以下操作,在Ubuntu12.04中进行.
更新源:
cat << 'EOF' > /etc/apt/sources.list deb b39K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3!0D9k6q4)9J5k6s2u0W2L8r3g2S2M7$3g2K6i4K6u0W2N6h3u0#2L8Y4c8#2i4K6u0W2j5$3!0E0i4K6u0r3N6h3u0#2L8Y4c8#2i4K6t1$3L8X3u0K6M7q4)9K6b7Y4m8J5k6h3y4A6M7$3g2Q4x3U0k6F1j5Y4y4H3i4K6y4n7L8h3q4A6L8W2)9J5y4X3&6T1M7%4m8Q4x3@1u0J5k6i4y4@1M7X3W2U0N6r3g2V1i4K6t1$3L8X3u0K6M7q4)9K6b7Y4g2F1K9i4k6W2M7Y4y4W2i4K6t1$3L8X3u0K6M7q4)9K6b7X3#2#2L8s2c8A6N6X3g2J5M7$3f1`. deb 518K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3!0D9k6q4)9J5k6s2u0W2L8r3g2S2M7$3g2K6i4K6u0W2N6h3u0#2L8Y4c8#2i4K6u0W2j5$3!0E0i4K6u0r3N6h3u0#2L8Y4c8#2i4K6t1$3L8X3u0K6M7q4)9K6b7Y4m8J5k6h3y4A6M7$3g2Q4x3X3c8#2M7r3c8S2N6r3g2K6i4K6t1$3L8X3u0K6M7q4)9K6b7X3#2S2K9h3&6Q4x3U0k6F1j5Y4y4H3i4K6y4n7M7X3g2K6N6s2u0A6j5%4c8W2k6q4)9J5y4X3&6T1M7%4m8Q4x3@1u0#2L8X3W2$3k6i4u0K6k6g2)9J5y4X3&6T1M7%4m8Q4x3@1u0E0N6h3I4@1K9i4k6W2M7Y4y4W2 deb a42K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3!0D9k6q4)9J5k6s2u0W2L8r3g2S2M7$3g2K6i4K6u0W2N6h3u0#2L8Y4c8#2i4K6u0W2j5$3!0E0i4K6u0r3N6h3u0#2L8Y4c8#2i4K6t1$3L8X3u0K6M7q4)9K6b7Y4m8J5k6h3y4A6M7$3g2Q4x3X3c8K6k6h3y4#2M7X3W2@1P5g2)9J5y4X3&6T1M7%4m8Q4x3@1u0E0j5h3W2F1i4K6t1$3L8X3u0K6M7q4)9K6b7Y4u0W2M7%4c8J5K9h3y4@1k6h3c8Q4x3U0k6F1j5Y4y4H3i4K6y4n7N6h3&6A6N6X3g2J5M7$3g2Q4x3U0k6F1j5Y4y4H3i4K6y4n7L8i4g2D9N6r3W2$3k6i4u0K6k6b7`.`. EOF
5.安装依赖文件
apt-get update apt-get install build-essential libncurses5-dev kernel-package fakeroot vim -y
6.进入/root目录,下载Linux2.6源码
curl -O 4abK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2C8k6i4u0F1k6h3I4Q4x3X3g2G2M7X3N6Q4x3V1k6H3N6h3u0Q4x3V1k6D9K9h3&6#2P5q4)9J5c8X3E0W2M7X3&6W2L8q4)9J5c8Y4j5J5i4K6u0W2y4W2)9J5c8X3I4G2L8X3N6@1k6i4u0E0i4K6u0r3N6U0u0Q4x3X3f1$3i4K6u0W2x3K6u0Q4x3V1k6D9K9h3&6#2P5q4)9J5k6o6u0Q4x3X3f1$3i4K6u0W2x3K6u0Q4x3X3f1$3z5g2)9J5k6i4c8S2M7W2)9J5k6i4S2*7 tar -xvf linux-2.6.32.69.tar.xz cd linux-2.6.32.69 make ARCH=i386 i386_defconfig
7.配置内核选项:
make ARCH=i386 menuconfig
保证以下3项为选中状态:
Kernel hacking --->Kernel debugging Compile the kernel with debug info Compile the kernel with frame pointers
去掉勾选这一项:
Optimize for size
8.修改内核根目录下的Makefile文件,保证编译出来的内核好调试
HOSTCFLAGS = -Wall -Wmissing-prototypes -Wstrict-prototypes -O1 -fomit-frame-pointer KBUILD_CFLAGS += -O1
9.编译内核
make mrproper make ARCH=i386 -j$(nproc) bzImage
10.Ubuntu24中安装qemu,这一步是为了在Ubuntu24中GDB调试Ubuntu12中编译的内核。
11.进入/root,编译安装BusyBox:
wget 8c0K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6T1N6i4y4&6j5X3!0^5i4K6u0W2L8X3g2@1i4K6u0r3k6r3!0%4L8X3I4G2j5h3c8K6i4K6u0r3j5Y4g2K6P5h3u0G2P5q4)9J5k6o6q4Q4x3X3f1J5x3q4)9J5k6e0u0Q4x3X3g2@1j5i4u0Q4x3X3g2T1P5U0t1`. tar -xvf busybox-1.20.2.tar.bz2 cd busybox-1.20.2 make defconfig make menuconfig
修改BusyBox配置:
保证这一项被选中:
Busybox Settings --->Build Options --->[*] Build BusyBox as a static binary (no shared libs)
保证inetd这一项没有选中:
Networking Utilities --->往下翻,找到 inetd
执行:
sed -i 's/CONFIG_FEATURE_HAVE_RPC=y/# CONFIG_FEATURE_HAVE_RPC is not set/' .config sed -i 's/CONFIG_FEATURE_INETD_RPC=y/# CONFIG_FEATURE_INETD_RPC is not set/' .config sed -i 's/CONFIG_IFUPDOWN_MAPPING=y/# CONFIG_IFUPDOWN_MAPPING is not set/' .config
保证.config中:
CONFIG_STATIC=y CONFIG_EXTRA_CFLAGS="-m32 -march=i386" CONFIG_EXTRA_LDFLAGS="-m32"
编译BusyBox:
apt-get update apt-get install gcc-multilib g++-multilib -y make clean make ARCH=i386 LDFLAGS="-m32" CFLAGS="-m32" -j$(nproc) install
复制文件:
cp -av /root/busybox-1.20.2/_install/* /root/my_rootfs/ cd /root/my_rootfs mkdir -p dev proc sys mnt etc/init.d
编写init文件:
cat << 'EOF' > /root/my_rootfs/init #!/bin/sh mount -t proc proc /proc mount -t sysfs sysfs /sys mount -t 9p -o trans=virtio,version=9p2000 host_share /mnt echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s mkdir -p /dev/pts mount -t devpts devpts /dev/pts clear exec /sbin/init EOF
编写inittab文件:
cat << 'EOF' > /root/my_rootfs/etc/inittab ::sysinit:/bin/dmesg ttyS0::askfirst:-/bin/sh EOF
编写profile文件:
cat << 'EOF' > /root/my_rootfs/etc/profile export PS1='\w \$ ' cat /etc/issue EOF
编写issue文件:
cat << 'EOF' > /root/my_rootfs/etc/issue ============================================= Welcome to BusyBox Linux 2.6! ============================================= EOF
创建/root/my_rootfs/dev下的两个文件:
mknod -m 666 ttyS0 c 4 64 mknod -m 600 console c 5 1
打包:
cd /root/my_rootfs/ && find . -print0 | cpio --null -ov --format=newc | gzip -9 > /root/initramfs.img
12.查看docker容器的ID:
docker ps -a
假设是:b50720f6ab74
13.将docker编译出的文件拷贝到Ubuntu24的中/root/Desktop/linux26中
docker cp b50720f6ab74:/root/linux-2.6.32.69/arch/x86/boot/bzImage . docker cp b50720f6ab74:/root/linux-2.6.32.69/vmlinux . docker cp b50720f6ab74:/root/initramfs.img .
14.在/root/Desktop/linux26中启动qemu
qemu-system-i386 -m 512M -cpu pentium3 -kernel bzImage -initrd initramfs.img -nographic -vga none -s -S -serial tcp:127.0.0.1:4444,server=on,wait=off,telnet=off -append "nokaslr earlyprintk=serial,ttyS0 console=ttyS0"
15.另一个终端中启动监控控制台
socat -,raw,echo=0 TCP:127.0.0.1:4444
16.在/root/Desktop/linux26中打开另一个终端中启动GDB
gdb ./vmlinux 输入: set architecture i386 target remote localhost:1234 c
当输入c并回车应该就能看见socat终端中输出系统打印内容了,这样就成功了。
17.将Linux的代码保存一份在Ubuntu24的/root/Desktop/linux26/linux-2.6.32.69中,在GDB调试时输入
directory /root/Desktop/linux26/linux-2.6.32.69
这样就能带代码调试了。