一、下载linux并编译linux内核源码

#安装编译相关依赖

apt-get install libncurses5-dev libssl-dev bison flex libelf-dev gcc make openssl libc6-dev

#这里选择清华源,国内速度会快很多

wget https://mirrors.tuna.tsinghua.edu.cn/kernel/v4.x/linux-4.5.tar.gz

下载到本地,解压:

#解压
tar -xvf linux-4.5.tar.gzcd  linux-4.5
#配置编译选项,这里可以进行内核编译的各种配置,由于默认已经勾选了调试相关的配置,可直接esc退出保存
make menuconfig
#开始多线程编译,首次此步会等待较长时间,后续由于已经生成了中间文件,速度会变快
make -j8

报错debian/certs/debian-uefi-certs.pem...certs/x509_certificate_list
解决:vim ./linux4.5/.config
将CONFIG_SYSTEM_TRUSTED_KEYS=“debian/certs/debian-uefi-certs.pem"改为CONFIG_SYSTEM_TRUSTED_KEYS=”"

二 Qemu配置

#安装qemu

apt-get install qemu

制作helloworld的rootfs用于测试

touch main.c
键入以下代码

#include <stdio>
int main()
{printf("hello world!");printf("hello world!");printf("hello world!");printf("hello world!");fflush(stdout);while(1);return 0;
}

编译

gcc --static -o helloworld main.c
echo helloworld | cpio -o --format=newc > rootfs

Qemu直接运行测试(非必须)

qemu-system-x86_64 \-kernel ./arch/x86/boot/bzImage \-initrd ./rootfs \-append "root=/dev/ram rdinit=/helloworld"

Qemu 开启GDB调试

qemu-system-x86_64  \-kernel ./arch/x86/boot/bzImage  \-initrd ./rootfs  \-append "root=/dev/ram rdinit=/helloworld" \-smp 2  \-s -S

进行以上会打开Qemu并进入等待调试状态,此时可以直接gdb调试,如下,打开一个新tab,输入以下命令:
gdb ./vmLinux
#以下进行调试
target remote:1234
b start_kernel
c
可以发现内核被断点在start_kernel函数上

qemu实际运行的时候,出现unable to mount root fs on unknown-block(1,0)

发现之前编译内核的时候Block devices 那里没有设置对。

三 really work recently

上一种方法似乎不能工作。

linux download 地址:
https://mirrors.edge.kernel.org/pub/linux/kernel/v2.6/
编译器gcc4.9解压后进入linux2.6-32
$ export ARCH=x86
$ make  x86_64_defconfig    //选择"菜单"
//"点菜"
make menuconfig,选择 kernel hacking—>
[*] compile the kernel with debug info //让其携带调试信息make  //编译

编译过程遇到的错误:

错误1:gcc: error: elf_i386: No such file or directory
make[1]: *** [arch/x86/vdso/vdso32-int80.so.dbg] Error 1
make: *** [arch/x86/vdso] Error 2需要修改arch/x86/vdso/Makefile,大约在28,29行 找到 VDSO_LDFLAGS_vdso.lds = -m elf_x86_64 -Wl,
-soname=linux-vdso.so.1 \ -Wl,-z,max-page-size=4096 -Wl,-z,common-page-size=4096
把"-m elf_x86_64" 替换为 "-m64"2然后再继续找,大约在72行左右,找到VDSO_LDFLAGS_vdso32.lds = -m elf_i386 -Wl,
-soname=linux-gate.so.1中的 "-m elf_i386" 替换为 "-m32"错误2:"drivers/ner/igbvf/igbvf.h:129:15: error: duplicate member ‘page’"
struct {
/*144*/  struct page *page; <---------------page No 1
u64 page_dma;
unsigned int page_offset;
};
};
/*149*/ struct page *page; <------------page No 2   //将该行注释掉,解决冲突
};
旧的gcc认为“page“名称冲突了,建议把第149行的第二个page指针注释掉。

3.2.接着使用busybox制作文件镜像

1)在这里我们把busybox配置为静态编译,这样busybox在运行的时候就不需要额外的动态链接库了。

# make menuconfig
Busybox Settings  --->Build Options  --->[*] Build BusyBox as a static binary (no shared libs)

编译和安装

make && make install

编译完成后的busybox就安装在源码根目录下的_install目录了,我们进入_install目录

cd _install

2)建立目标根目录映像

dd if=/dev/zero of=myinitrd4M.img bs=4096 count=1024
mke2fs myinitrd4M.img
mkdir rootfs
sudo mount -o loop myinitrd4M.img rootfs

3)准备dev目录

sudo mkdir rootfs/dev
#linux启动过程中会启用 console设备
sudo mknod rootfs/dev/console c 5 1
#另外需要提供一个linux根设备,我们使用 ram
sudo mknod rootfs/dev/ram b 1 0sudo umount rootfs
qemu-system-x86_64 -kernel  \
../../linux-2.6.32/arch/x86/boot/bzImage -initrd myinitrd4M.img     \
-append "root=/dev/ram init=/bin/ash"  -s -S

看到在新打开的qemu虚拟机上,整个是一个黑屏,此时qemu在等待gdb的链接。接着开启另外一个终端,执行gdb

gdb ./vmlinux
target remote: 1234
hc start_kernel
c

参考@技术简说

https://zhuanlan.zhihu.com/p/105069730?utm_source=wechat_session

https://www.toutiao.com/i6845914458108199436

https://zhuanlan.zhihu.com/p/35180950

linux内核下载编译相关推荐

  1. linux内核下载 编译

    linux内核下载网址 今天去看了一场电影"疯狂的原始人"----回来的车上看到一个老奶奶传教士,我想对自己多,加油,加油学习,深思深思 我们现在用的安霸系统,每搞一次我都会进行一 ...

  2. Ubuntu下Android 4.0源码及内核下载编译注意点

    Android源码编译再source.android.com上有完整的教程,在这里只说一下自己在下载和编译时遇到的一些问题 一.Android4.0源码下载注意事项: 1.使用64位的ubuntu比较 ...

  3. 玩转mini2440开发板之【linux内核的编译和下载】

    今天首先来玩一玩linux内核的编译和下载. 1.背景交代 开发环境:64位的Ubuntu 14.04: 编译工具:arm-linux-gcc 4.4.3: 下载工具:SuperViVi USB Tr ...

  4. linux内核安装编译

    Linux内核下载及编译 下载Linux内核 可以从官网下载linux内核,也可以通过第三方网站进行下载. 官网网址:https://www.kernel.org/. 由于官网可能存在被墙的原因,所以 ...

  5. 【Linux 内核】编译 Linux 内核 ⑤ ( 查看 .config 编译配置文件 | 正式编译内核 )

    文章目录 一.查看 .config 编译配置文件 二.正式编译内核 一.查看 .config 编译配置文件 在上一篇博客 [Linux 内核]编译 Linux 内核 ④ ( 打开 Linux 内核编译 ...

  6. 编译 linux 3,linux内核的编译(3)

    linux内核的编译(3) 2008-02-23 07:17:46来源:互联网 阅读 () 无论什麽档名),然後将你做的 zImage 拷贝进去,(例如,如果你用" /vmlinuz ″ 的 ...

  7. Linux内核的编译方法及如何往内核中增加程序

    2019独角兽企业重金招聘Python工程师标准>>> ARM Linux的系统调用实现原理是采用swi软中断从用户(usr)模式陷入管理模式(svc). 内核空间和用户空间这两个名 ...

  8. 【Linux 内核】编译 Linux 内核 ⑦ ( 安装内核模块 | 安装内核 | 重启系统 | 查看当前内核版本 )

    文章目录 一.安装内核模块 二.安装内核 三.重启系统 四.查看当前内核版本 一.安装内核模块 确保 Linux 内核编译完成 , 没有任何报错之后 ; 参考 [Linux 内核]编译 Linux 内 ...

  9. rock64linux,RockPI 4A Linux内核下载与编译

    本文介绍RockPI 4A单板Debian系统Linux内核的下载和编译方法,为后续介绍RockPI 4A单板Linux内核调试进行抛砖引玉. 一.代码下载 Rockpi 4A Debian版本SDK ...

最新文章

  1. 用电脑发短信_重磅!一个软件实现电脑上接打手机电话、收发短信、传文件、屏幕镜像!...
  2. linux c++ 获取时间,详解Linux下的C++时间类型:time_t
  3. java起源英文_Abbreviation 英文词组缩写(来源:南阳理工大学ACM)java
  4. C语言 #include <> 与 #include “” 区别 - C语言零基础入门教程
  5. 90后互联网打工人:为了买小两居,爸妈打零工帮我凑首付
  6. P1425 小鱼的游泳时间【入门题】
  7. Android开发笔记(一百零一)滑出式菜单
  8. 【leetcode】在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据。
  9. java实现https请求单向认证、双向认证
  10. 【谷粒学院】项目总结
  11. 【Android】小米开发应用App上线注册
  12. Windows 10 DJL 安装 部署 Java机器学习 Pytorch
  13. 寻找AR中的Big Difference - v4.0 #AR指南
  14. bzoj3332: 旧试题
  15. ai怎么渐变颜色_AI的渐变工具为什么如此难用?
  16. 针式打印机保养方法汇总
  17. R语言与机器学习学习笔记(分类算法)(1)K-近邻算法
  18. linux dir大全,Linux常用命令大全
  19. sorted()排序详解
  20. Unity Tilemap动态生成2d地图

热门文章

  1. FPGA学习思考过程记录:一
  2. Linux服务器安装matlab
  3. C语言API函数大全(转载)
  4. C语言 - 制作一个可以容纳一千人的本地通讯录
  5. C程序设计基础(一)
  6. 《算法第四版》官方jar包中In的readStrings()方法不建议使用的解决办法
  7. 代码审计之PHP常用函数总结
  8. 计算机毕业设计 基于JavaWbe的校友录管理系统(源码+论文)
  9. 【建议背诵】软考高项考试案例简答题汇总~(6)
  10. DB2错误信息SQLCODE SQLSTATE (按sqlcode排序)