OS 5SE осень 2018

Материал из CSC Wiki
Перейти к:навигация, поиск

Преподаватель: Кринкин Кирилл Владимирович

Контакты: class-os@osll.ru

Live: https://slides.com/kirillkrinkin/deck/live

Связанный курс на MIT


Как запустить vagrant, qemu, и запатчить решение


   sudo vagrant up --provider=docker
   sudo vagrant ssh default

Содержимое conf/env.mk

   QEMU=/usr/bin/qemu-system-i386
   QEMUEXTRA=-curses

Параметр QEMUEXTRA можно не ставить (и так даже лучше); вместо этого нужно запускать QEMU с помощью make qemu-nox - тогда QEMU запустится прямо в вашей консоли и вы не будете страдать.


Если вам не хочется потом каждый раз удалять переменную QEMUEXTRA из гит-диффа, можете создать линку на исполняемый файл под именем qemu:

   sudo ln /usr/bin/qemu-system-i386 /usr/bin/qemu

После этого все будет находиться.


При проблемах с gdb (типа warning: File "/home/vagrant/lab/.gdbinit" auto-loading has been declined by your `auto-load safe-path' set to "$debugdir:$datadir/auto-load:/vagrant/lab/.gdbinit".) действовать так, как он укажет: добавить в файл /home/vargant/.gdbinit одну из двух строк:

   add-auto-load-safe-path /home/vagrant/lab/.gdbinit  
   set auto-load safe-path / 

И так, и так работает.


Если у вас проблемы с дублированием букв внутри QEMU, не паникуйте - просто проверьте команды help и kerninfo - скорее всего удваивание букв будет проигнорировано, и команды выполнятся.

Для выхода из QEMU используюйте сочетание клавиш ctrl-a x.


Для создания файла с патчем работает следующая схема:

   sudo touch patch
   sudo chmod a+rw patch
   git diff > patch

Совы не то, чем кажутся или The desc field contains the line number and the value contains the code address for the start of that source line: http://www.sourceware.org/gdb/onlinedocs/stabs.html#Line-Numbers


При отправке патчей проверять сначала на своих репозиториях и следить за тем, чтобы концы строк были не ос-специфичными (типа \r\n на винде). С такими различиями патчи не применяются и падают с ошибкой

Можно избежать проблемы с концами строк, если трансферить патч следующим образом:

   vagrant ssh -c  "cat /home/vagrant/lab/patch" | dos2unix > patch

Если вам лень вручную переносить изменения из виртуальной машины в файлы в вашем форкнутом репозитории, можете воспользоваться утилитой patch:

   cd solutions/${вставь_свою_фамилию}/lab1
   patch < your_patch_file

Скорее всего, программа не поймет, где именно лежат ваши измененные файлы, и попросит указать пути к ним. Но это всяко лучше, чем руками копировать все это.

Как припилить CLion и дебаггер


Потребуется немного модифицировать Vagrantfile: нужно прокинуть порты (можно и директорию между хостовой и гостевой системами, но необязательно). Порт должен совпадать с тем, что указано в файле lab/.gdbinit, в строке target remote localhost:26000.

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|
  config.vm.network :forwarded_port, guest: 26000, host: 26000, host_ip: "127.0.0.1", protocol: "tcp", auto_correct: true
  config.vm.synced_folder "lab", "/home/vagrant/lab"
  config.vm.provider "docker" do |d|
   d.has_ssh = true
   d.image = "osll/os_mooc:v1"
  end

end

Также следует уничтожить существующий образ с помощью команды vagrant destroy <id> (id можно подсмотреть в vagrant global-status) и создать заново как обычно. Убедитесь, что вы не оставили в контейнере ничего супер-важного (напрмер почти сделанной лабы или домашки по плюсам).

Run → Edit configuration → «+»

Далее нужно настроить сам Clion как на картинке справа + добавить CMakeLists.txt со следующим содержимым (список файлов придётся изменять с каждой новой лабой):

cmake_minimum_required(VERSION 3.9)
project(kernel)

set(CMAKE_C_STANDARD 11)

set(SOURCE_FILES
        boot/main.c
        inc
        kern
        lib
        fs
        )

include_directories(.)
add_executable(kernel ${SOURCE_FILES})
target_include_directories(kernel PRIVATE ${CMAKE_SOURCE_DIR})

Папку obj можно пометить как "Excluded", чтобы она не мешала анализатору кода.

Дальше нужно запускать make qemu-nox-gdb, ставить точку останова в clion и запускать debug. Если нет подключения к GDB, то неправильно настроены порты или неверно указан Symbol file (он указывает на скомпилированный образ ядра). Если GDB запускается, но ничего не выводит, то можно приостновить дебаггер (pause), во вкладке "GDB" запустить list cprintf, и GDB покажет, какой файл он ищет и не может найти; в соответствии с этим нужно настроить маппинг.

Дополнительная информация по практике


Полезные ссылки

Дополнительное условие к заданию #1

Функцию mon_backtrace нужно реализовать так, чтобы она в случае испорченного стека

  • завершалась,
  • не читала что-либо за границами стека.

Т.е. так, чтобы эта функция не доверяла корректности входных данных.

Корректный стек получается некоторой последовательностью вызовов функций, заканчивающейся mon_backtrace и не выполняющей какие-либо действия, портящие этот стек. (действия, портящие стек - затирание frame pointer / return address / etc)

Под испорченностью стека понимается то, что все данные, которые находятся на стеке могут быть некорректными (например, затертые случайными значениями frame pointer / return address / etc).

Во всех случаях существования последовательности вызовов функций, создающей такой стек, ваше решение должно его корректно распечатывать. В остальных случаях требуется только чтобы ваша функция завершалась и не читала что-либо за границами стека.

Слишком быстрая разрядка ноутбука

hlt

Компилятор, под которым не зависает QEMU

Опыт показывает, что современные компиляторы чего-то вставляют, что для операционной системы плохо. Например, опыт проявился в том, что сначала собралось хорошим компилятором, а потом собиралось системным, и засчёт make файлы пересобирались по частям, и операционка глючила, а после make clean / make all, когда было пересобрано системным компилятором, совсем зависло, как у других. А после make clean / make all на хорошем компиляторе, наоборот, совсем заработало.

Проверенно работающий компилятор брать здесь: https://www.adacore.com/download/more

Это для Ады, но там в одном комплекте и C, и C++, и gprbuild, который умеет собирать смешанные проекты. Для Linux 32битного последняя версия была в 2014. И на ней работает.

Как ообирать, запускать и проверять:

Предполагая, что хороший транслятор установлен в /opt/adacore/gnat/2014, команды выглядят так:

PATH="/opt/adacore/gnat/2014/bin:$PATH" make && make qemu-nox QEMU=qemu-system-i386

Оно запустится в консоли. Выход из эмуляции: Ctrl+A, X.

Запуск grade (проверочный скрипт):

PATH="/opt/adacore/gnat/2014/bin:$PATH" make grade QEMU=qemu-system-i386