どうも、27歳からひたすら低レイヤーを触りまくっている白井です。
コンピュータアーキテクチャやCPU周りを勉強していると、
どうやってOSまで繋がるんや?というところがわからないと
自分が今何をしているのかがだんだんわからなくなってきまして。
じゃあOSの勉強も始めなければということで、
あの有名なゼロからの自作OS入門に触れてみることにしました
Mac bookしかもっていないので
なんとかこの環境でもできないかと色々やってみたらエラーを吐きまくったので
これだったらうまくいったという環境を共有します。
簡単にいうとMac自体の環境で行うのは諦めてUbuntuの推奨されているバージョンでやりましょうという話です。
特にday03aからloaderとkernelの接続が、バージョンでうまくいかないことがあり
clangとld.lldのバージョンも合わせる必要があり
Macだとそれに合わせるだけでも時間を浪費するだけだということがわかりました。
大人しくdockerを使うことにしました。
結論からいうと、これをそのままDockerfileに入れて
docker composeすれば大体行けます。
FROM ubuntu:18.04
ENV DEBIAN_FRONTEND=noninteractive
SHELL ["/bin/bash", "-euxo", "pipefail", "-c"]
# --- base tools ---
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates curl wget gnupg software-properties-common \
git make cmake ninja-build \
build-essential pkg-config \
python3 python3-pip python3-distutils \
nasm uuid-dev \
qemu-system-x86 qemu-utils \
mtools dosfstools gdisk \
acpica-tools \
vim less file unzip xz-utils \
sudo \
&& rm -rf /var/lib/apt/lists/*
# --- LLVM/Clang 7 + LLD 7 ---
RUN apt-get update && apt-get install -y --no-install-recommends \
llvm-7 llvm-7-dev \
clang-7 \
lld-7 \
&& rm -rf /var/lib/apt/lists/*
# --- set defaults: clang=7, lld=7 ---
RUN update-alternatives --install /usr/bin/clang clang /usr/bin/clang-7 100 \
&& update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-7 100 \
&& update-alternatives --install /usr/bin/clang-cpp clang-cpp /usr/bin/clang-cpp-7 100 \
&& update-alternatives --install /usr/bin/ld.lld ld.lld /usr/bin/ld.lld-7 100 \
&& update-alternatives --install /usr/bin/lld lld /usr/bin/lld-7 100
# llvm-ar が /usr/bin/llvm-ar-7 しか無い環境があるので、名前を揃える
RUN ln -sf /usr/bin/llvm-ar-7 /usr/bin/llvm-ar
# --- user + workspace ---
ARG USERNAME=dev
ARG UID=1000
ARG GID=1000
RUN mkdir -p /etc/sudoers.d \
&& (getent group ${GID} || groupadd -g ${GID} ${USERNAME}) \
&& (id -u ${USERNAME} >/dev/null 2>&1 || useradd -m -u ${UID} -g ${GID} -s /bin/bash ${USERNAME}) \
&& usermod -aG sudo ${USERNAME} \
&& echo "${USERNAME} ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/${USERNAME} \
&& chmod 0440 /etc/sudoers.d/${USERNAME}
USER ${USERNAME}
WORKDIR /home/${USERNAME}
# コンテナ内の作業場所(ホストの ~/os をここにマウントする想定)
RUN mkdir -p /home/${USERNAME}/os
WORKDIR /home/${USERNAME}/os
CMD ["/bin/bash"]
このコードは、osというディレクトリの下から作っていますが、
WORKDIRはできるだけhomeで作ることをお勧めします。(ansibleなど環境構築の部分で設定ファイルちょっと弄ったりする必要があるので、、、)
このコードがいつか自分と同じ迷い人に伝わることを願います。