Pintos ์„ค์น˜ํ•˜๊ธฐ

ํ•€ํ† ์Šค ๊ณต์‹ ๋ฌธ์„œ

๊ฐœ๋ฐœํ™˜๊ฒฝ ์„ค์ •

๋งฅ๋ถ์—์„œ ํ•€ํ† ์Šค๋ฅผ ์„ค์น˜ํ•ด๋ณด์ž. ๋งฅ๋ถ์€ Arm์•„ํ‚คํ…์ณ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•€ํ† ์Šค๋ฅผ ๋ฐ”๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋„์ปค๋ฅผ ์ด์šฉํ•œ๋‹ค.

brew install --casks docker

๋„์ปค์—์„œ ์šฐ๋ถ„ํˆฌ bionic ๋ฒ„์ „ ์ด๋ฏธ์ง€๋ฅผ ์„ค์น˜ํ•˜์ž

docker pull --platform linux/amd64 ubuntu:bionic # ubuntu ์ด๋ฏธ์ง€๋ฅผ ๋„์ปค๋กœ ๊ฐ€์ ธ์˜จ๋‹ค.
docker run --platform linux/amd64 -it -d --name pintos ubuntu:bionic # pintos์ด๋ฆ„์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ํ›„ ์‹คํ–‰
docker attach pintos # ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์— ์ ‘์†

Dev Container๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ์—๊ฒŒ ์ต์ˆ™ํ•œ vscode๋ฅผ ์ด์šฉํ•ด ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ์— ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋‹ค. ์„ค์น˜ํ›„ ์œ„์™€ ๊ฐ™์ด ํ˜„์žฌ ํ™œ์„ฑํ™”๋˜์–ด์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋‚˜์˜ค๊ณ , ์ด๋ฅผ ๋”๋ธ”ํด๋ฆญํ•ด ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋‹ค. (์ ‘์†์‹œ ์ง€์›ํ•˜์ง€ ์•Š์€ ๋ฒ„์ „์ด๋ผ๊ณ  ๋‚˜์˜ค๋‚˜ ๊ทธ๋ƒฅ ๋ฌด์‹œํ•˜๊ณ  ํ•ด๋„ ๋œ๋‹ค.) ํ•€ํ† ์Šค๋Š” ๋‹ค์Œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค.

  1. GCC, GNU binutils
  2. Perl
  3. GNU make
  4. QEMU (QEMU๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ํž˜๋“ค๋•Œ Bochs๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค.)
  5. GDB
apt update && apt upgrade -y
apt install build-essential gcc binutils perl gdb qemu -y # ์š”๊ตฌ์‚ฌํ•ญ ์„ค์น˜
apt install vim wget unzip # ํŒŒ์ผ ํŽธ์ง‘, ์••์ถ• ๋ฐ ํ•ด์ œ๋ฅผ ์œ„ํ•ด ์„ค์น˜
apt install git # github์—์„œ pintosํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•จ.

ํ•€ํ† ์Šค ์„ค์น˜

์œ„์˜ ๊ฐœ๋ฐœํ™˜๊ฒฝ์„ค์ •์ด ์™„๋ฃŒ๋˜์—ˆ์œผ๋ฉด, ์ด์ œ Pintos๋ฅผ ๋‹ค์šด๋ฐ›์ž. (ํ•„์ž๋Š” root ๊ฒฝ๋กœ๋‚ด์— ๋‹ค์šด๋ฐ›์•˜๋‹ค.)

git clone https://github.com/WyldeCat/pintos-anon.git pintos

src/utils/pintos ๋ฅผ ํ†ตํ•ด pintos ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ ๋””๋ฒ„๊น…๋“ฑ์„ ์ข€ ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€์ ์ธ ์„ค์ •์„ ํ–ˆ๋‹ค.

cd pintos/src/utils
chmod +x Pintos.pm  backtrace  pintos  pintos-gdb  pintos-mkdisk  pintos-set-cmdline # ํ•ด๋‹น ํŒŒ์ผ์— ์‹คํ–‰๊ถŒํ•œ ๋ถ€์—ฌ
cp Pintos.pm  backtrace  pintos  pintos-gdb  pintos-mkdisk  pintos-set-cmdline /usr/local/bin # /usr/local/bin์œผ๋กœ ๋ณต์‚ฌ, ์ด์ œ ๊ฒฝ๋กœ ์ง€์ • ์—†์ด pintos๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋””๋ฒ„๊น… ๋„๊ตฌ ์„ค์ •

cd pintos/src/misc
cp gdb-macros /usr/local/bin #gdb-macors๋ฅผ /usr/local/bin์— ๋ณต์‚ฌ

์œ„์—์„œ gdb-macrosํŒŒ์ผ์„ usr/local/bin์— ๋ณต์‚ฌํ–ˆ๋‹ค. ์ด์ œ pintos-gdbํŒŒ์ผ์— ํ•ด๋‹น gdb-macrosํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ˆ˜์ •ํ•ด์ค˜์•ผํ•œ๋‹ค. (ํ•„์ž๋Š” vim์„ ์ด์šฉํ•ด ์ˆ˜์ •ํ–ˆ๋‹ค. vim์„ ๋ชจ๋ฅธ๋‹ค๋ฉด ์•Œ์•„๋‘๋„๋ก ํ•˜์ž.)

cd /usr/local/bin
vim pintos-gdb # vim ํŽธ์ง‘๊ธฐ๋กœ ํ•ด๋‹น ํŒŒ์ผ ์ˆ˜์ •

์•„๋ž˜ GDBMACROS๋ณ€์ˆ˜๋ฅผ ํ˜„์žฌ gdb-mcros์˜ ๊ฒฝ๋กœ๋กœ ๋ฐ”๊ฟ”์ฃผ์ž.

#! /bin/sh
# Path to GDB macros file. Customize for your site.
 
GDBMACROS=/usr/local/bin # /usr/local/bin/gdb-macros๋กœ ์ˆ˜์ •
 
# Choose correct GDB.
 
if command -v i386-elf-gdb >/dev/null 2>&1; then
 
GDB=i386-elf-gdb
 
else
 
GDB=gdb
 
fi
 
  
 
# Run GDB.
 
if test -f "$GDBMACROS"; then
 
exec $GDB -x "$GDBMACROS" "$@"
 
else
 
echo "*** $GDBMACROS does not exist ***"
 
echo "*** Pintos GDB macros will not be available ***"
 
exec $GDB "$@"
 
fi

ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ณ  pintos-gdb๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค. ๋งŒ์•ฝ pintos-gdb๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋Š” ๋ฌธ๊ตฌ๊ฐ€ ๋‚˜์˜ค๋ฉด ๊ฒฝ๋กœ๋ฅผ ์ œ๋Œ€๋กœ ์„ค์ •ํ–ˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž.

ํ•€ํ† ์Šค ์‹คํ–‰

cd pintos/src/threads
make # threads ๊ฒฝ๋กœ๋‚ด ์ฝ”๋“œ ์ปดํŒŒ์ผ
cd build # ๋นŒ๋“œ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™
pintos --qemu -- run alarm-multiple # qemu๋ฅผ ์ด์šฉํ•ด ์‹คํ–‰ํ•˜๋„๋ก ์„ค์ •

์‹คํ–‰ํ›„ ๋‹ค์Œ ํ™”๋ฉด์ด ๋‚˜์˜จ๋‹ค.

๊ณ ์ƒ์˜ ๊ธฐ๋ก

๊ณต์‹ ๋ฌธ์„œ์— ๋‚˜์™€์žˆ๋Š”๋ฐ๋กœ ํ•˜๋ คํ–ˆ์œผ๋‚˜โ€ฆ ๋ฌดํ•œ๋ถ€ํŒ…, Pintos ์ฝ”๋“œ ์˜ค๋ฅ˜๋“ฑ๋“ฑ ์ˆ˜๋งŽ์€ ์˜ค๋ฅ˜๋กœ ์ธํ•ด ์‚ฝ์งˆ์„ ๋งŽ์ดํ–ˆ๋‹ค. ์•„๋งˆ ์˜ค๋ž˜๋œ ์ฝ”๋“œ์ด๋‹ค๋ณด๋‹ˆ ํ˜ธํ™˜์„ฑ ์ด์Šˆ์ด์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•œ๋‹ค. ์ด ๊ธ€์„ ๋ณด๋Š” ์—ฌ๋Ÿฌ๋ถ„์€ ์ด๋Ÿฌํ•œ ์‚ฝ์งˆ์„ ํ•˜์ง€ ์•Š์•˜์œผ๋ฉด ํ•œ๋‹ค.