羽夏看Linux内核——环境搭建

   2023-02-09 学习力0
核心提示:羽夏看 Linux 内核之环境搭建,详细介绍 Linux 内核学习的带 GUI 的 Bochs 环境的搭建。写在前面  此系列是本人一个字一个字码出来的,包括示例和实验截图。如有好的建议,欢迎反馈。码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作。如

写在前面

  此系列是本人一个字一个字码出来的,包括示例和实验截图。如有好的建议,欢迎反馈。码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作。如想转载,请把我的转载信息附在文章后面,并声明我的个人信息和本人博客地址即可,但必须事先通知我

前言

  在学习与计算机相关的知识时,工欲善其事,必先利其器,搭建一个优秀的学习实验环境是完成学习任务和提高学习热情的推动剂。本来虚拟机想选VirtualBox,不过太难搞了,网上也没有好到成熟的教程,最关键是没有配套的调试功能,这样很不直观。到最后我还是选择了Bochs
  严格的说,Bochs是一个模拟器。它是一个以LGPL许可证发放的开放源代码的x86x86-64IBM PC兼容机模拟器和调试工具。它支持处理器(包括保护模式)、内存、硬盘、显示器、以太网、BIOSIBM PC兼容机的常见硬件外设的仿真,主要用于操作系统开发。
  说了这么有关Bochs一大堆,它有一个十分优秀的地方,它具有配套的调试工具,只要在编译期间开启了对应的开关,就可以实现调试的图形界面化,这在 Linux 上是可遇不可求的,如下图所示:

  这个和我系统主题相关,看起来比较丑一点,但这已经很不错了,在开发与 Linux 相关应用的同志会深有体会。
  下面我们来开始编译Bochs,为 Linux 内核的学习开始新的旅程。

编译 Bochs

  在编译之前,我们需要安装编译所需的依赖,请输入以下指令:

sudo apt install build-essential
sudo apt install libgtk2.0-dev 

  我们解压我们下载的Bochs源码,然后在该文件打开终端,输入如下命令:

./configure --with-x11 --with-wx --enable-disasm --enable-all-optimizations --enable-readline  --enable-debugger-gui --enable-x86-debugger --enable-a20-pin --enable-fast-function-calls --enable-debugger --enable-iodebug

  --后面跟着字母的参数就是我所谓的开关,开启这些开关之后,就支持反汇编、内置调试、io 接口调试以及图形界面。
  该指令执行完之后,就会在该目录下生成MakeFile文件,我们需要编辑一下继续。找到文件的第92行,在最后加一个参数-lpthread,如下所示:

LIBS =  -lm -lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lfontconfig -lfreetype -lpthread

  如果不这么修改,在编译的过程中就会报错。因为pthread库不是Linux系统默认的库,连接时需要使用静态库 libpthread.a,所以在使用pthread_create创建线程,以及调用pthread_atfork函数建立fork处理程序时,需要链接该库。
  然后我们输入make回车,不到一分钟就能编译完。如果编译无报错,我们再输入sudo make install将其安装在系统当中。
  如果以后要卸载,请保留编译过后留下的内容,只需要MakeFile文件夹下,进入终端,输入sudo make uninstall即可卸载。

配置 Bochs

  下面我们需要简单配置一下它以能够使用,我们需要一个配置文件。由于个人习惯起名字为bochsrc.disk,它的内容如下:

#=======================================================================
# MEGS
# Set the number of Megabytes of physical memory you want to emulate. 
# The default is 32MB, most OS's won't need more than that.
# The maximum amount of memory supported is 2048Mb.
# The 'MEGS' option is deprecated. Use 'MEMORY' option instead.
#=======================================================================
megs: 32

#=======================================================================
# DISPLAY_LIBRARY
#
# The display library is the code that displays the Bochs VGA screen.  Bochs 
# has a selection of about 10 different display library implementations for 
# different platforms.  If you run configure with multiple --with-* options, 
# the display_library command lets you choose which one you want to run with.
# If you do not write a display_library line, Bochs will choose a default for
# you.
#=======================================================================
display_library: x, options="gui_debug" # use GTK debugger gui

#=======================================================================
# ROMIMAGE:
# The ROM BIOS controls what the PC does when it first powers on.
# Normally, you can use a precompiled BIOS in the source or binary
# distribution called BIOS-bochs-latest. The ROM BIOS is usually loaded
# starting at address 0xf0000, and it is exactly 64k long. Another option
# is 128k BIOS which is loaded at address 0xe0000.
# You can also use the environment variable $BXSHARE to specify the
# location of the BIOS.
# The usage of external large BIOS images (up to 512k) at memory top is
# now supported, but we still recommend to use the BIOS distributed with
# Bochs. The start address optional, since it can be calculated from image size.
#=======================================================================
romimage: file=/usr/local/share/bochs/BIOS-bochs-latest

#=======================================================================
# VGAROMIMAGE
# You now need to load a VGA ROM BIOS into C0000.
#=======================================================================
vgaromimage: file=/usr/local/share/bochs/VGABIOS-lgpl-latest

#=======================================================================
# BOOT:
# This defines the boot sequence. Now you can specify up to 3 boot drives,
# which can be 'floppy', 'disk', 'cdrom' or 'network' (boot ROM).
# Legacy 'a' and 'c' are also supported.
#=======================================================================
#boot: floppy
boot: disk

#=======================================================================
# LOG:
# Give the path of the log file you'd like Bochs debug and misc. verbiage
# to be written to. If you don't use this option or set the filename to
# '-' the output is written to the console. If you really don't want it,
# make it "/dev/null" (Unix) or "nul" (win32). :^(
#=======================================================================
#log: /dev/null
log: bochsout.txt

#=======================================================================
# MOUSE:
# The Bochs gui creates mouse "events" unless the 'enabled' option is
# set to 0. The hardware emulation itself is not disabled by this.
# Unless you have a particular reason for enabling the mouse by default,
# it is recommended that you leave it off. You can also toggle the mouse
# usage at runtime (control key + middle mouse button on X11, SDL,
# wxWidgets and Win32).
# With the mouse type option you can select the type of mouse to emulate.
# The default value is 'ps2'. The other choices are 'imps2' (wheel mouse
# on PS/2), 'serial', 'serial_wheel' and 'serial_msys' (one com port requires
# setting 'mode=mouse'). To connect a mouse to an USB port, see the 'usb_uhci'
# or 'usb_ohci' option (requires PCI and USB support).
#=======================================================================
mouse: enabled=0

#=======================================================================
# KEYBOARD_MAPPING:
# This enables a remap of a physical localized keyboard to a 
# virtualized us keyboard, as the PC architecture expects.
# If enabled, the keymap file must be specified.
#=======================================================================
keyboard_mapping: enabled=1, map=/usr/local/share/bochs/keymaps/x11-pc-us.map

#=======================================================================
# ATA0, ATA1, ATA2, ATA3
# ATA controller for hard disks and cdroms
#
# ata[0-3]: enabled=[0|1], ioaddr1=addr, ioaddr2=addr, irq=number
# 
# These options enables up to 4 ata channels. For each channel
# the two base io addresses and the irq must be specified.
# 
# ata0 and ata1 are enabled by default with the values shown below
#=======================================================================
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14

  如果啥也不想了解,直接新建文件拷进去就能用。不过我建议你还是得了解一下。
  这个配置文件,它有点类似BIOS。我们在开机时按下的delesc ,或者F2键,各个机型进入BIOS式有所不同,但差不多就那几种方式。BIOS中会显示各种硬件的信息,还有启动顺序等。Bochs既然是模拟硬件的,它就得知道,您需要它模拟的计算机是什么样的,换句话说,在这个虚拟机中有哪些硬件,启动顺序是什么,是从软盘开始,还是从硬盘开始。给Bochs配置硬件的方法,就是写一个配置文件给它,Bochs启动时会找到此文件,根据文件内容创建自己,这样咱们的虚拟机就健全了。
  在安装目录下有样本文件:/usr/local/share/doc/bochs,里面非常全,只不过是英文的,我上面的只是必须使用的部分。下面我们来介绍一下我使用的相关配置含义:

megs

  设置Bochs在运行过程中能够使用的内存,本例为 32MB

display_library

  设置图形界面,这条配置就可以启用我们的图形界面化调试,而不是黑框。

romimage

  设置对应的BIOS

vgaromimage

  设置对应的VGA BIOS。它是显卡BIOS,储存了显示卡的硬件控制程序和相关信息,可以说是显示卡的“神经中枢”。

boot

  选择启动盘符,floppy是软盘的意思,disk是磁盘的意思,指的是从什么地方启动,这里是从磁盘启动。

log

  输出的日志路径。

mouse

  鼠标相关设置,这里被禁用。

keyboard_mapping

  打开键盘,并设置键盘映射。

ata0

  设置硬件相关。

# 开头的行

  表示是注释。

其他

  当然上述部分并不能保证一个内核正常启动,后续还需要进行添加,剩余所需到后面用到再说。

使用 Bochs

  配置完毕后,我们在配置文件位置打开终端,输入以下指令:

bochs -f ./bochsrc.disk

  这行命令就是调用我们的虚拟机使用bochsrc.disk加载。当然,你可以直接输入bochs,然后回车,你会看到如下界面:

  可以看到如下几个选项,默认选项是2,也就是从配置文件进行加载,我们需要输入文件路径,作用和bochs -f ./bochsrc.disk一样。
  但每次学习的时候我们总不能现输入这条指令吧,我们可以利用bash脚本来减轻键盘的负担。我们在配置文件目录下新建一个文件startLearning.sh,输入如下指令:

#!/usr/bin/env bash

bochs -f ./bochsrc.disk

  然后保存,赋予可执行权限。以后我们要使用该环境进行学习的话,只需双击该脚本就可以了。下面我们来双击测试一下:

  可以看到默认选项是开始仿真,直接回车即可:

  你会看到两个窗体,小的是虚拟机的显示窗口,类似屏幕;大的是调试窗体,我们可以在这里进行调试操作。
  如果我们点击调试窗体的Continue按钮,你会看到如下弹窗:

  这个是正常现象,因为还没有对应的镜像,那么我们创建一个。作为一个负责任的模拟器,Bochs给咱们提供了创建虚拟硬盘的工具bximage,这里简单介绍几个参数:

  • -fd:创建软盘
  • -hd:创建硬盘
  • -mode:创建硬盘的类型,有flatsparsegrowing三种
  • -size:指创建多大的硬盘,以MB为单位。
  • -q:以静默模式创建,创建过程中不会和用户交互。

  下面我们来开始操作了,在配置文件所在目录输入以下指令:

bximage -hd -mode="flat" -size=60 -q test.img

  然后我们就成功创建了一个启动镜像,下面我们把它添加到配置文件中。在ata0的下一行,添加一行内容,效果如下:

ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=disk, path="test.img", mode=flat, cylinders=121 ,heads=16 ,spt=63

  保存,执行脚本查看。不出意外的话,还是报错:

  这此报错说是不是一个启动盘,和之前无启动设备不一样了。不要灰心,这个时候说明学习环境已成功搭建完毕,至于什么是启动盘,启动流程是啥将会在下一篇进行介绍。

练习与思考

  俗话说得好,光说不练假把式,如下是本节相关的练习。如果练习没做成功,就不要看下一节教程了。

  1. 搭建Bochs环境并取得成功。

下一篇

  羽夏看Linux内核——启动那些事

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 【强转】QEMU+GDB调试linux内核全过程
    【强转】QEMU+GDB调试linux内核全过程
    昨天更新了一篇名为《QEMU+GDB调试linux内核全过程》[link][https://blog.csdn.net/weixin_37867857/article/details/88138432]的博客,发现排版比较混乱,而且思维也比较混乱。咋一看下来简直是惨不忍睹,而且会给读者在安装过程中一种云里雾里的感觉,加上
    03-08
  • Linux下Bochs,NASM安装和使用 linux bom
    Linux下Bochs,NASM安装和使用 linux bom
    以Ubuntu为例,先更新一下:sudo apt-get updatesudo apt-get upgrade然后安装Bochs环境:sudo apt-get install build-essential xorg-dev libgtk2.0-dev安装NASMNASM官网下载,这以nasm-2.14.02.tar.gz为例:用tar zxvf nasm-2.14.02.tar.gz解压后编译安装cd
    03-08
  • 把玩Alpine linux(一):安装
    把玩Alpine linux(一):安装
    导读Alpine Linux是一个面向安全应用的轻量级Linux发行版。它采用了musl libc和busybox以减小系统的体积和运行时资源消耗,同时还提供了自己的包管理工具apk。Alpine 的内核都打了grsecurity/PaX补丁,并且所有的程序都编译为Position Independent Executabl
    03-08
  • 日志审计与分析实验三(rsyslog服务器端和客户端配置)(Linux日志收集)
    日志审计与分析实验三(rsyslog服务器端和客户
     Linux日志收集一、实验目的:1、掌握rsyslog配置方法2、配置rsyslog服务收集其他Linux服务器日志:C/S架构:客户端将其日志上传到服务器端,通过对服务器端日志的查询,来实现对其他客户端的日志进行集中管理;下面实现就是通过两套机器来实现,(server:19
    03-08
  • Linux学习系列--如何在Linux中进行文件的管理
    Linux学习系列--如何在Linux中进行文件的管理
    文件在常见的Linux的文件系统中,经常使用能了解到的文件管理系统是分为多个文件夹进行管理的。如何查看文件路径 pwd ,在文件目录中,会有一个点(.)代表的是当前目录,两个点(..)代表的是当前目录的上层目录在Linux下,所有以点开始的文件都是“隐藏文件
    03-08
  • [JetBrains] 我想在 Linux 上使用 macOS 键绑定!
    [JetBrains] 我想在 Linux 上使用 macOS 键绑定
    很高兴认识你,我的名字是kitakkun。我最近开始实习,是工程界的新手。顺便说一句,这是我的第一篇文章。你最喜欢的操作系统是什么?视窗?苹果系统?还是Linux?我将它们全部用于不同的目的,但感觉就像 macOS ≒ LinuxWindows。一两个月前,我最喜欢 Linux
    03-08
  • linux 配置Socks51
    linux 配置Socks51
    ***大家耳熟能详,但是socks用到的人比较少,那什么是socks呢?请看第二段或者百度百科,socks分别有4和5两个版本,现在5为主流。工作中经常用***访问国外,但是同时国内的速度又慢了,让人很纠结,实际上这个时候可以考虑使用socks。指定某一个程序使用国外s
    02-10
  • linux下如何单独编译设备树? linux设备树是什
    答: make vendor/device_name.dtb  如: make freescale/fsl-1043a-rdb.dtb
    02-10
  • linux下mysql开启远程访问权限及防火墙开放3306端口
    linux下mysql开启远程访问权限及防火墙开放3306
    开启mysql的远程访问权限默认mysql的用户是没有远程访问的权限的,因此当程序跟数据库不在同一台服务器上时,我们需要开启mysql的远程访问权限。主流的有两种方法,改表法和授权法。相对而言,改表法比较容易一点,个人也是比较倾向于使用这种方法,因此,这
    02-10
  • 移植linux3.7到nuc900系列开发板遇到的问题
    通过移植学习linux新版本内核,大概了解一下内核变化。记录一下移植过程中遇到的问题或值得注意的地方。1,添加一款arm9芯片的支持首先修改\arch\arm\tools\mach-types文件添加一行w90p950evbMACH_W90P950EVBW90P950EVB同目录下的脚本文件在编译内核时会根据
    02-10
点击排行