OS 5SE осень 2017 — различия между версиями
(Новая страница: « == Лекции == Преподаватель: Кринкин К. В.») |
Xamgore (обсуждение | вклад) м |
||
(не показана 31 промежуточная версия 5 участников) | |||
Строка 1: | Строка 1: | ||
+ | Преподаватель: Кринкин Кирилл Владимирович | ||
− | == | + | Контакты: <code>[mailto:os-au@osll.ru os-au@osll.ru]</code> |
− | + | ||
+ | Live: https://slides.com/kirillkrinkin/deck/live | ||
+ | |||
+ | |||
+ | * '''[https://github.com/OSLL/os-au-2017 Репозиторий курса на гитхабе]''' | ||
+ | ** [https://github.com/OSLL/os-au-2017/tree/master/docs Презентации] | ||
+ | ** [https://docs.google.com/spreadsheets/d/1dERdQc56nA9FXQKO6xW11bQ6osA41NofZSQbmU_i86o/edit Успеваемость] | ||
+ | |||
+ | * '''[https://stepik.org/course/3636/syllabus Лабораторные работы]''' | ||
+ | ** [http://mit.spbau.ru/sewiki/images/d/da/Os-dev-jos.pdf Русскоязыяное описание лабораторных работ] | ||
+ | ** [https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-828-operating-system-engineering-fall-2012/lecture-notes-and-readings/ Задания лабораторных работ]: | ||
+ | **# [https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-828-operating-system-engineering-fall-2012/labs/MIT6_828F12_lab1.pdf C, Assembly, Tools, and Bootstrapping] | ||
+ | **# [https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-828-operating-system-engineering-fall-2012/labs/MIT6_828F12_lab2.pdf Memory Management] | ||
+ | **# [https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-828-operating-system-engineering-fall-2012/labs/MIT6_828F12_lab3.pdf User Environments] | ||
+ | **# [https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-828-operating-system-engineering-fall-2012/labs/MIT6_828F12_lab4.pdf Preemptive Multitasking] | ||
+ | **# [https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-828-operating-system-engineering-fall-2012/labs/MIT6_828F12_lab5.pdf Spawn and Shell] | ||
+ | |||
+ | * '''Учебные материалы''' (дополнительные модули содержат хорошие источники): | ||
+ | ** [https://stepik.org/course/1780/syllabus «Операционные системы»] | ||
+ | ** [https://stepik.org/course/253/syllabus «Введение в архитектуру ЭВМ. Элементы операционных систем»] | ||
+ | ** [https://stepik.org/course/548/syllabus «Основы программирования для Linux»] | ||
+ | |||
+ | |||
+ | ---- | ||
+ | <div class="mw-collapsible mw-collapsed"> | ||
+ | |||
+ | <h5>Как запустить vagrant, qemu, и запатчить решение</h5> | ||
+ | |||
+ | ---- | ||
+ | <div class="mw-collapsible-content"> | ||
+ | |||
+ | sudo vagrant up --provider=docker | ||
+ | sudo vagrant ssh default | ||
+ | |||
+ | Содержимое <code>conf/env.mk</code> | ||
+ | |||
+ | QEMU=/usr/bin/qemu-system-i386 | ||
+ | QEMUEXTRA=-curses | ||
+ | |||
+ | Параметр <code>QEMUEXTRA</code> можно не ставить (и так даже лучше); вместо этого нужно запускать <code>QEMU</code> с помощью <code>make qemu-nox</code> - тогда <code>QEMU</code> запустится прямо в вашей консоли и вы не будете страдать. | ||
+ | |||
+ | ---- | ||
+ | Если вам не хочется потом каждый раз удалять переменную <code>QEMUEXTRA</code> из гит-диффа, можете создать линку на исполняемый файл под именем <code>qemu</code>: | ||
+ | |||
+ | sudo ln /usr/bin/qemu-system-i386 /usr/bin/qemu | ||
+ | |||
+ | После этого все будет находиться. | ||
+ | |||
+ | ---- | ||
+ | |||
+ | При проблемах с gdb (типа <code>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".</code>) действовать так, как он укажет: добавить в файл <code>/home/vargant/.gdbinit</code> одну из двух строк: | ||
+ | |||
+ | add-auto-load-safe-path /home/vagrant/lab/.gdbinit | ||
+ | set auto-load safe-path / | ||
+ | |||
+ | И так, и так работает. | ||
+ | |||
+ | ---- | ||
+ | |||
+ | Если у вас проблемы с дублированием букв внутри <code>QEMU</code>, не паникуйте - просто проверьте команды <code>help</code> и <code>kerninfo</code> - скорее всего удваивание букв будет проигнорировано, и команды выполнятся. | ||
+ | |||
+ | Для выхода из <code>QEMU</code> используюйте сочетание клавиш <code>ctrl-a x</code>. | ||
+ | |||
+ | ---- | ||
+ | |||
+ | Для создания файла с патчем работает следующая схема: | ||
+ | |||
+ | 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 | ||
+ | |||
+ | ---- | ||
+ | |||
+ | Если вам лень вручную переносить изменения из виртуальной машины в файлы в вашем форкнутом репозитории, можете воспользоваться утилитой <code>patch</code>: | ||
+ | |||
+ | cd solutions/${вставь_свою_фамилию}/lab1 | ||
+ | patch < your_patch_file | ||
+ | |||
+ | Скорее всего, программа не поймет, где именно лежат ваши измененные файлы, и попросит указать пути к ним. Но это всяко лучше, чем руками копировать все это. | ||
+ | </div> | ||
+ | </div> | ||
+ | |||
+ | <div class="mw-collapsible mw-collapsed"> | ||
+ | |||
+ | <h5>Как припилить CLion и дебаггер</h5> | ||
+ | |||
+ | ---- | ||
+ | <div class="mw-collapsible-content"> | ||
+ | |||
+ | Потребуется немного модифицировать Vagrantfile: нужно прокинуть порты (можно и директорию между хостовой и гостевой системами, но необязательно). Порт должен совпадать с тем, что указано в файле <code>lab/.gdbinit</code>, в строке <code>target remote localhost:26000</code>. | ||
+ | |||
+ | <syntaxhighlight lang="ruby"> | ||
+ | # -*- 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 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Также следует уничтожить существующий образ с помощью команды <code>vagrant destroy <id></code> (id можно подсмотреть в <code>vagrant global-status</code>) и создать заново как обычно. Убедитесь, что вы не оставили в контейнере ничего супер-важного (напрмер почти сделанной лабы или домашки по плюсам). | ||
+ | |||
+ | [[Файл:Clion debug os.png|300px|thumb|caption|Run → Edit configuration → «+»]] | ||
+ | |||
+ | Далее нужно настроить сам Clion как на картинке справа + добавить CMakeLists.txt со следующим содержимым (список файлов придётся изменять с каждой новой лабой): | ||
+ | |||
+ | <syntaxhighlight lang="cmake"> | ||
+ | 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}) | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Папку <code>obj</code> можно пометить как "Excluded", чтобы она не мешала анализатору кода. | ||
+ | |||
+ | Дальше нужно запускать <code>make qemu-nox-gdb</code>, ставить точку останова в clion и запускать debug. Если нет подключения к GDB, то неправильно настроены порты или неверно указан <code>Symbol file</code> (он указывает на скомпилированный образ ядра). Если GDB запускается, но ничего не выводит, то можно приостновить дебаггер (pause), во вкладке "GDB" запустить <code>list cprintf</code>, и GDB покажет, какой файл он ищет и не может найти; в соответствии с этим нужно настроить маппинг. | ||
+ | |||
+ | </div> | ||
+ | </div> |
Текущая версия на 05:11, 10 декабря 2017
Преподаватель: Кринкин Кирилл Владимирович
Контакты: os-au@osll.ru
Live: https://slides.com/kirillkrinkin/deck/live
- Учебные материалы (дополнительные модули содержат хорошие источники):
Как запустить 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
) и создать заново как обычно. Убедитесь, что вы не оставили в контейнере ничего супер-важного (напрмер почти сделанной лабы или домашки по плюсам).
Далее нужно настроить сам 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 покажет, какой файл он ищет и не может найти; в соответствии с этим нужно настроить маппинг.