当前位置: 首页 > news >正文

Linux内核编译与调试menuos-linux-3.18.6-在ubuntu20.04环境

1 具体操作

  1. 下载 linux-3.18.6内核
wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz
  1. 解压进入linux-3.18.6文件夹
tar -xvf linux-3.18.6.tar.xz 
cd linux-3.18.6/
  1. 编译
#make x86_64_defconfig   # 为x86_64生成配置
#make alldefconfig  
make i386_defconfig   
make

可能会遇到无compiler-gcc9.h文件的问题,可以在/include/linux目录直接复制一份文件

cp compiler-gcc5.h compiler-gcc9.h
  1. ubuntu可以直接使用apt-get来安装32位的编译环境和库
sudo dpkg --add-architecture i386  
sudo apt-get update
sudo apt-get install libc6:i386 libgcc1:i386 g++-multilib gcc-multilib
  1. 通过rootfs/menu生成镜像(一个最简单的根文件系统镜像)
cd /rootfs/menu
gcc -pthread -o init linktable.c menu.c test.c -m32 -static  # m32编译
cp init ../
cd ..
find . | cpio -o -Hnewc |gzip -9 > ../rootfs.img   # 将当前menu目录下所有文件打包为一个镜像文件,
  1. 启动
# 在linux-3.18.6目录下启动linux内核与menos
qemu-system-i386 -kernel arch/x86/boot/bzImage -initrd rootfs.img

2 menuos调试

2.1 make menuconfig

make menuconfig的作用是提供一个图形化界面,让用户能够选择和配置内核的各种功能和模块,这些配置信息最终会被保存在.config文件中。
具体来说,make menuconfig的工作流程大致如下:

  • 读取Kconfig文件:make menuconfig会读取内核源代码中各个目录下的Kconfig文件,这些文件定义了内核的配置选项及其依赖关系。
  • 生成配置界面:基于Kconfig文件中的信息,make menuconfig会生成一个图形化的配置界面,让用户能够通过菜单和选项来选择和配置内核的功能和模块。
  • 保存配置结果:用户在配置界面中完成配置后,可以将配置结果保存到.config文件中。这个文件包含了所有内核编译时需要的配置信息。
  • 影响编译过程:在后续的编译过程中(如执行make命令时),Makefile文件会读取.config文件中的配置信息,并根据这些信息来决定哪些代码需要被编译、哪些模块需要被包含在内核中,以及如何进行编译和链接等操作。
    因此,虽然make menuconfig不会直接生成Makefile文件,但它通过生成和更新.config文件来间接影响Makefile的编译过程。用户通过make menuconfig配置的选项最终会被Makefile用来指导内核的编译和链接。

2.2 编译携带调试信息

  1. 重新编译,携带调试信息
make menuconfig
# 选择compile-time checks and compiler options的debug_info选项即可

如果不行,直接修改MakeFile

# 在第一个CONFIG_DEBUG_INFO之前加入
CONFIG_DEBUG_INFO=y

然后直接编译

make

运行

# 启动内核
qemu-system-i386 -kernel arch/x86/boot/bzImage -initrd rootfs.img -S -s
# 启动gdb vmlinuxgdb vmlinux
#在gdb中执行,调试连接target remote:1234
# 在gdb中执行命令c, 此时内核会正常运行c

2.3 gdb 调试

# 在程序的start_kernel()处设置断点
break init/main.c:510
http://www.lryc.cn/news/398443.html

相关文章:

  • java-mysql 三层架构
  • 打工人如何应对AI对工作岗位的风险
  • C++:从C语言过渡到C++
  • 在安卓中使用FFmpeg录制摄像头的视频并保存到本地MP4文件
  • Vue从零到实战第一天
  • BUUCTF - Basic
  • 如何理解Node.js?NPM?Yarn?Vue?React?
  • 苹果入局,AI手机或将实现“真智能”?
  • AI网络爬虫019:搜狗图片的时间戳反爬虫应对策略
  • Windows 网络重置及重置网络可能出现的问题( WIFI 没有了 / WLAN 图标消失)
  • 100 个网络基础知识普及,看完成半个网络高手!
  • 高盛开源的量化金融 Python 库
  • 【Linux】docker和docker-compose 区别是什么
  • Qt图片缩放显示
  • 47、lvs之DR
  • 分布式技术栈、微服务架构 区分
  • 【JavaEE精炼宝库】文件操作(2)——文件内容读写 | IO流
  • C++ 指针变量做参数传递时的情况分析
  • Linux环境下Oracle 11g的离线安装与配置历程
  • 上位机图像处理和嵌入式模块部署(mcu项目2:串口日志记录器)
  • 容器是线程不安全的,如果多线程下不加锁直接使用容器会发什么
  • 配置光源——笔记
  • Java---SpringBoot详解一
  • MFC扩展库BCGControlBar Pro v35.0 - 可视化管理主题等全新升级
  • Springboot 配置 log4j2 时的注意事项
  • 微服务-初级篇
  • 批量制作word表格
  • 代码随想录算法训练营:27/60
  • Redis 中String类型操作命令(命令演示,时间复杂度,返回值,注意事项)
  • 2024亚太杯中文赛B题洪水灾害的数据分析与预测原创论文分享