首页
社区
课程
招聘
[原创]穿越了?研究Linux 2.6内核和驱动?
发表于: 2天前 230

[原创]穿越了?研究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

这样就能带代码调试了。


传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!!

收藏
免费 0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回