首页 > 其他分享 >0171-创建内核可执行文件

0171-创建内核可执行文件

时间:2024-07-13 09:11:30浏览次数:11  
标签:可执行文件 git 0171 boot game 内核 text root jiangbo12490

环境

  • Time 2022-11-11
  • WSL-Ubuntu 22.04
  • QEMU 6.2.0
  • NASM 2.15.05

前言

说明

参考:https://os.phil-opp.com/multiboot-kernel/

目标

编写一个可以加载执行的文件。

启动代码

global start

section .text
bits 32
start:
    ; print `OK` to screen
    mov dword [0xb8000], 0x2f4b2f4f
    hlt

start 是启动入口,.text 表示是代码段。
bits 32 指定了编译成 32 位的机器码,因为需要在 32 位保护模式下执行。
0xb8000 是显存地址,输出使用。
hlt 是 CPU 停机指令。

编译和反编译

root@jiangbo12490:~/git/game# nasm boot.asm
root@jiangbo12490:~/git/game# hexdump -x boot
0000000    05c7    8000    000b    2f4f    2f4b    00f4
000000b
root@jiangbo12490:~/git/game# ndisasm -b 32 boot
00000000  C70500800B004F2F  mov dword [dword 0xb8000],0x2f4b2f4f
         -4B2F
0000000A  F4                hlt

创建 ELF 文件

ELF 主要是 linux 系统下的一种文件格式。
nasm 默认输出二进制文件,需要 ELF 文件,需要增加参数 -f 指定,得到两个 .o 文件(对象文件)。

root@jiangbo12490:~/git/game# nasm -f elf64 main.asm
root@jiangbo12490:~/git/game# nasm -f elf64 boot.asm
root@jiangbo12490:~/git/game#

链接对象文件

自定义链接脚本

ENTRY(start)

SECTIONS {
    . = 1M;

    .boot :
    {
        /* ensure that the multiboot header is at the beginning */
        *(.multiboot_header)
    }

    .text :
    {
        *(.text)
    }
}
  • start 指定的程序入口。
  • . = 1M 指定了程序需要被加载到哪个地址上。
  • .boot 放到最开始,后面是 .text 段。
  • multiboot_header 放到最前面。

链接

root@jiangbo12490:~/git/game# ld -n -o kernel.bin -T linker.ld main.o boot.o
root@jiangbo12490:~/git/game# ld -v
GNU ld (GNU Binutils for Ubuntu) 2.38

-n 不可以省略,关闭对齐。

查看 section 信息

root@jiangbo12490:~/git/game# objdump -h kernel.bin

kernel.bin:     file format elf64-x86-64

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .boot         00000018  0000000000100000  0000000000100000  00000080  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  1 .text         0000000b  0000000000100020  0000000000100020  000000a0  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE

总结

创建了一个内核可执行程序 kernel.bin。

附录

标签:可执行文件,git,0171,boot,game,内核,text,root,jiangbo12490
From: https://www.cnblogs.com/jiangbo4444/p/18299661

相关文章

  • 0172-执行内核文件
    环境Time2022-11-11WSL-Ubuntu22.04QEMU6.2.0NASM2.15.05前言说明参考:https://os.phil-opp.com/multiboot-kernel/目标将编写好的内核可执行文件,制作成ISO镜像,然后从QEMU启动。建立文件目录isofiles└──boot├──grub│└──grub.cfg......
  • eBPF 用户态和内核态基于ringbuf交互
    相比于perf_event_array,ringbuf优势在于1.读取数据是有序的,即提交顺序和消费顺序保持一致。2.避免数据复制,即提交数据到map和传递到用户态都不需要拷贝。内核态ringbuf/ringbuf.c#include"../headers/vmlinux.h"#include"../headers/bpf_endian.h"#include"../headers/b......
  • Liunx内核的作用
    liunx内核的作用主要包含了五大作用管理进程:内核负责创建和销毁进程,并处理它们与外部世界的联系(输入和输出),不同进程间通讯(通过信号,管道,或者进程间通讯原语)对整个系统功能来说是基本的,也由内核处理。另外,调度器,控制进程如何共享CPU,是进程管理的一部分。更通常地,内核的......
  • CentOS 7升级内核的三种方式(yum/rpm/源码)
    原文作者: NesteaLin 文章链接: https://nestealin.com/8bab8c2c/背景在CentOS使用过程中,难免需要升级内核,但有时候因为源码编译依赖问题,不一定所有程序都支持最新内核版本,所以以下将介绍两种升级内核方式。注意事项关于内核种类:kernel-mlkernel-ml中的ml......
  • 09 为内核支持函数调用
    在[[08内核第一条指令|上一节]]我们使用了编写entry.asm函数中编写了内核的第一条指令,但是我们使用的汇编.这里注意我们仍然是嵌入了这段asm代码到我们的rust代码之中,然后进行编译.但是即使连使用fnmain都不被允许,因此我们如果希望使用rust来编写内核代码,因此我们最好为内核......
  • 08 内核第一条指令
    了解QEMU启动指令qemu-system-riscv64\-machinevirt\-nographic\-bios../bootloader/rustsbi-qemu.bin\-deviceloader,file=target/riscv64gc-unknown-none-elf/release/os.bin,addr=0x80200000-machine virt 表示将模拟的64位RISC-V计算机......
  • 内核参数优化
    linux内核参数优化(网络模块)在Linux下调整内核参数,可以直接编辑配置文件/etc/sysctl.conf,然后执行sysctl-p命令生效文件内容如下:net.ipv4.ip_forward=1net.ipv4.conf.default.rp_filter=1net.ipv4.conf.default.accept_source_route=0kernel.sysrq=0kernel.core_......
  • 应用程序会不会导致linux内核崩溃?
    应用程序有可能导致Linux内核崩溃,但这种情况并不是绝对的,它取决于多种因素。应用程序或Linux内核本身都可能存在bug。当应用程序的某部分逻辑与内核的某部分逻辑发生冲突时,有可能导致内核崩溃。例如,应用程序可能尝试访问非法的内存地址,或者触发内核中的某个未修复的错误。这......
  • which命令、可执行文件
    用途:查找可执行文件并显示所在的位置 which会到哪里去找可执行权限?which——搜索范围由PATH环境变量指定;PATH环境变量定义了which去哪里查找命令(shell解析器会去哪里查找命令)可执行文件:可以运行的文件 、执行execute 、可执行的executable二进制是可以直接运......
  • Franka Linux 设置实时内核 PREEMPT_RT
    为了使用控制您的机器人libfranka,工作站PC上的控制器程序必须在内核下以实时优先级PREEMPT_RT运行。本节介绍了修补内核以支持 PREEMPT_RT并创建安装包的过程。内核不支持NVIDIA二进制驱动程序PREEMPT_RT。 sudoapt-getinstallbuild-essentialbccurlca-certific......