menuOS实验环境配置

实验来源:https://github.com/mengning/menu

一、环境配置

安装qemu

sudo apt-get install qemu 

sudo ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu

下载内核源代码编译内核

cd ~/LinuxKernel/

wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz

解压

xz-d linux-3.18.6.tar.xz

tar-xvf linux-3.18.6.tar

编译

cd linux-3.18.6

make i386_defconfig

make -j4

制作根文件系统

cd ~/LinuxKernel/

mkdir rootfs

git clone https://github.com/mengning/menu.git

cd menu

gcc -m32 -static linktable.c menu.c test.c -o init -lpthread

cd ../rootfs

cp ../menu/init ./

find . | cpio -o -Hnewc | gzip -9 > ../rootfs.img

启动MenuOS系统

cd ~/LinuxKernel/

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img


二、调试内核

重新配置编译Linux使之携带调试信息

make menuconfig

kernel hacking—>    

Compile-time checks and compiler options --->        

[*]compile the kernel with debug info

使用gdb跟踪调试内核

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S 

# 关于-s和-S选项的说明:

# -S freeze CPU atstartup(use ’c’ to start execution)

# -s shorthandfor-gdb tcp::1234

若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项

gdb连接qemu

另开一个shell窗口,

cd linux-3.18.6/                                #  必须在该目录下执行gdb才能找到源代码

gdb                                                

(gdb)file vmlinux                         # 在gdb界面中targe remote之前加载符号表

(gdb)target remote:1234           # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行

(gdb)break start_kernel             # 断点的设置可以在target remote之前,也可以在之后

(gdb)tui enable                         # 打开源码(同 layout src)

(gdb)tui reg all                         # 运行过程中查看寄存器值

  (gdb)   n                                      # 单步执行

(gdb)s                                      # 单步执行并进入函数

(gdb)finish                                # 结束当前函数

三、问题及解决方案

1. 编译内核

error: linux/compiler-gcc5.h: 没有那个文件或目录

error: linux/compiler-gcc5.h: not such file or directory

gcc版本问题

直接复制源码同目录下的compiler-gcc4.h文件并改名为compiler-gcc5.h

cp include/linux/compiler-gcc4.h include/linux/compiler-gcc5.h 

2. 调试内核

make menuconfig错误

recipe for target 'menuconfig' failed

安装依赖库

sudo apt-get install ncurses-dev

终端显示太小

scripts/kconfig/mconf Kconfig

Your display is too small to run Menuconfig!

It must be at least 19 lines by 80 columns.

scripts/kconfig/Makefile:24: recipe for target 'menuconfig' failed

make[1]: *** [menuconfig] Error 1

Makefile:541: recipe for target 'menuconfig' failed

make: *** [menuconfig] Error 2

直接将终端最大化

3. 编译menu失败

64位deepin环境下执行

gcc -m32 -static linktable.c menu.c test.c -o init -lpthread  失败

In file included from /usr/include/stdio.h:27:0,

from linktable.c:23:

/usr/include/features.h:364:25: fatal error: sys/cdefs.h: 没有那个文件或目录 # include <sys/cdefs.h>

安装32位库

sudo apt-get purge libc6-dev

sudo apt-get install libc6-dev

sudo apt-get install libc6-dev-i386

在其他的教程中编译menu的命令不同,可能会有几种错误

(1)gcc-o init linktable.c menu.c test.c-m32-static–lpthread

gcc: error: –lpthread: 没有那个文件或目录

gcc: error: –lpthread: Not such file or directory

测试将 -m32  -static 放置到 gcc 后面即可

(2)gcc -m32 -static -lpthread linktable.c menu.c test.c -o init

static undefined reference to `pthread_mutex_lock'

测试将 -lpthrread  放到命令最后面即可

(3)gcc -m32 -static-libgfortran -lpthread linktable.c menu.c test.c -o init

用这条指令能够编译过去,但是实际运行起来到不了menuos

显示: panic - not syncing: No working init found.

修改指令,一定要是静态编译,将-lpthread放在最后面

gcc -m32 -static linktable.c menu.c test.c -o init -lpthread

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 7,593评论 0 3
  • 1.Envirment: 1.VM-Envriment:windown 7, vmware(ubuntu-18.0...
    zhuohui阅读 5,208评论 0 49
  • 中国队赢了!77-73击败韩国队。好友微信里引用名言发表感慨:“一场球,有时就是命运的分岭。赢了,你就上去...
    送柳音阅读 1,410评论 0 1
  • 我承诺,一定达成目标,要不然这一年又白白浪费了。我不想在一年又一年的制定目标中度过,尤其是每一年都TM制定相同的目...
    张仲凯阅读 1,566评论 0 0
  • 金秋九月, 我很高兴、幸运地和值月生团队和26班全体战友共同完成了九月的值月.带着我的感激和感恩, 今晚 19:3...
    小宁静致远阅读 3,180评论 0 1