专栏首页Linux内核及编程语言底层相关技术研究编译一个默认输出hello world的linux内核

编译一个默认输出hello world的linux内核

本文主要讲述,如何编译一个linux内核,使其默认执行我们提供的一个hello world程序。

基本思路是,linux内核在启动完毕后,会执行一个用户态的名叫init的程序,作为其1号进程(当前大部分linux发行版的init程序都是systemd),那我们只要把我们写的hello world程序,设置成内核默认使用的init程序,应该就可以了。

下面我们来具体操作试下:

1. 下载内核代码。

$ git clone https://github.com/gregkh/linux.git

2. 为确保内核代码是干净的,执行如下命令。

$ cd linux
$ make mrproper

3. 在当前linux目录写个c语言版的hello world程序,并将其编译以备后续使用。

$ git status -s
?? hello.c
$ cat hello.c
#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
        printf("hello world!\n");
        sleep(1000);
        return 0;
}
$ gcc -static hello.c
$ git status -s
?? a.out
?? hello.c

4. 修改以下文件,告知内核在编译时,将我们的程序作为init程序一起打包到内核中。

$ git status -s
 M usr/default_cpio_list
?? a.out
?? hello.c

$ git -P diff usr/default_cpio_list
diff --git a/usr/default_cpio_list b/usr/default_cpio_list
index 37b3864066e8..9c6b452d4c44 100644
--- a/usr/default_cpio_list
+++ b/usr/default_cpio_list
@@ -4,3 +4,4 @@
 dir /dev 0755 0 0
 nod /dev/console 0600 0 0 c 5 1
 dir /root 0700 0 0
+file /init ./a.out 755 0 0

5. 为了方便,我们直接使用以下命令生成默认的内核配置。

$ make defconfig
省略部分输出
*** Default configuration is based on 'x86_64_defconfig'
#
# configuration written to .config
#

6. 现在一切都准备好了,我们可以开始编译内核了。

$ make -j4
省略部分输出
Kernel: arch/x86/boot/bzImage is ready  (#1)

7. 内核编译好后,我们用qemu测试下。

$ qemu-system-x86_64 -kernel arch/x86_64/boot/bzImage -nographic -append "console=ttyS0"
省略部分输出
[    2.122598] Run /init as init process
hello world!
[    2.478037] tsc: Refined TSC clocksource calibration: 2903.981 MHz
[    2.480449] clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x29dbf3edc72, max_idle_ns: 440795319519 ns
[    2.483100] clocksource: Switched to clocksource tsc
[    2.643255] input: ImExPS/2 Generic Explorer Mouse as /devices/platform/i8042/serio1/input/input3

由上可见,hello world正确输出,搞定!


以上步骤中有很多知识点我没有讲,如果对此有兴趣,可以留言讨论,或者看下以下代码或文档:

usr/目录下的所有

init/main.c

init/initramfs.c

Documentation/filesystems/ramfs-rootfs-initramfs.rst

本文分享自微信公众号 - Linux内核及JVM底层相关技术研究(ytcode),作者:wangyuntao

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • linux内核断点调试入门

    上篇文章 编译一个默认输出hello world的linux内核 中,我们已经知道如何编译一个可以自运行的linux内核,这篇文章我们来看下如何对内核进行断点调...

    KINGYT
  • 如何在Linux操作系统上安装GCC开发工具

    GNU编译器集合(GCC)是C,C ++,Objective-C,Fortran,Ada, Go 和D编程语言的编译器和库的集合。 许多开源项目,包括Linux...

    用户5005176
  • linux设备驱动第二篇:如何写一个简单内核驱动?

    上一篇介绍了linux驱动的概念,以及linux下设备驱动的基本分类情况及其各个分类的依据和差异,这一篇我们来描述如何写一个类似hello world的简单测试...

    程序员互动联盟
  • 如何在CentOS 8上安装GCC开发工具

    GNU编译器集合(GCC)是C,C ++,Objective-C,Fortran,Ada, Go 和D编程语言的编译器和库的集合。 许多开源项目,包括Linux...

    用户5005176
  • Shell基础 -- 入门篇

    shell 英文含义是“壳”,这是相对于内核来说的,shell 也确实就像是内核的壳,通常来说,所有对内核的访问都要经由 shell 。同时,shell 还是一...

    知忆
  • 嵌入式Linux系列第2篇:运行Hello World

    今天给大家介绍的是在一个嵌入式Linux板子上运行Hello World,软硬件入门学习的经典操作。依稀记得两年前,我第一次在飞思卡尔(现NXP)I.MX6上运...

    用户2366192
  • 为 a.out 举行一个特殊的告别仪式

    在 “Linux 发布 5.1, Linux Lab 同步支持” 一文中,首次得知了 Linux 移除 a.out 格式的消息,这个消息着实令人感叹,因为 a....

    Linux阅码场
  • ebpf 学习梳理和测试使用

    周五下午在公司的服务网格月度讨论会上,一位同事为大家分享了在服务网格中使用 ebpf 来优化提升服务网格 istio 中 sidecar 和 RS 间的通信效率...

    黑光技术
  • 【玩转腾讯云】ebpf 学习梳理和测试使用

    周五下午在公司的服务网格月度讨论会上,一位同事为大家分享了在服务网格中使用 ebpf 来优化提升 istio 中 sidecar 和 RS 间的通信效率。听过之...

    黑光技术
  • linux之shell

    相信很多同学都不陌生这个脚本,尤其是运维的同学,少不了吧。公司的运维系统就靠你了。shell是一种解释型的语言,我们写好了代码后,不需要编译,直接运行即可。平时...

    用户7657330
  • 浅谈内核的Makefile、Kconfig和.config文件

    Linux内核源码文件繁多,搞不清Makefile、Kconfig、.config间的关系,不了解内核编译体系,编译修改内核有问题无从下手,自己写的驱动不知道怎...

    韦东山
  • 内核必须懂(一): 用系统调用打印Hello, world!

    sean_yang
  • 内核必须懂(一): 用系统调用打印Hello, world!

    sean_yang
  • 如何在 CentOS 7 上安装 GCC 编译器

    The GNU Compiler Collection (GCC) 是一系列编译器的集合,它包括 C,C++,Objective-C, Fortran, Ada...

    雪梦科技
  • linux 下 nginx 安装echo扩展模块

    echo 模块可以将nginx 变量的信息输出到网页中。echo 模块对学习nginx 配置文件有很大帮助,对应调试nginx 配置文件中变量特步方便。想要深...

    地球流浪猫
  • 基于NXP i.MX28 MPU的疫情监控平台2-Qt环境搭建

    Qt 是一个跨平台的应用程序开发框架。使用Qt开发的应用程序,只需要编写一套代码,然后把这套代码放在不同平台的Qt环境去编译,就会生成可以运行在对应平台的应用程...

    单片机点灯小能手
  • 简述Go以及搭建Go环境

    Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。

    新人小试
  • 我用STM32MP1做了个疫情监控平台2—Qt环境搭建

    Qt 是一个跨平台的应用程序开发框架。使用Qt开发的应用程序,只需要编写一套代码,然后把这套代码放在不同平台的Qt环境去编译,就会生成可以运行在对应平台的应用程...

    单片机点灯小能手
  • Go基本安装

    用户1203875

扫码关注云+社区

领取腾讯云代金券