ОС осень 2016 — различия между версиями
Krinkin.m (обсуждение | вклад) |
Krinkin.m (обсуждение | вклад) |
||
(не показано 47 промежуточных версий этого же участника) | |||
Строка 3: | Строка 3: | ||
Лектор — Кринкин Михаил (<b>[mailto:krinkin.m.u@gmail.com krinkin.m.u@gmail.com]</b>) | Лектор — Кринкин Михаил (<b>[mailto:krinkin.m.u@gmail.com krinkin.m.u@gmail.com]</b>) | ||
− | Практики — Кринкин Михаил (<b>[mailto:krinkin.m.u@gmail.com krinkin.m.u@gmail.com]</b>), | + | Практики — Кринкин Михаил (<b>[mailto:krinkin.m.u@gmail.com krinkin.m.u@gmail.com]</b>) |
+ | |||
+ | * Если у вас появляются вопросы по материалам/содержанию курса, или по каким-то смежным темам, то вы можете задавать их по почте, после лекции или на практике. | ||
+ | * Если у вас возникают проблемы с выполнением домашних заданий, то приходите на практику с компьютером, будем разбираться вместе. | ||
+ | * [https://docs.google.com/spreadsheets/d/1EfpjiE04xEuLyErC-m2zlWpderVzYa9k1CKXD1mMVvQ/edit?usp=sharing Текущие результаты] | ||
+ | |||
+ | === Примеры кода === | ||
+ | |||
+ | * [[Медиа:Src.zip|первая порция кода]] - к лекции/практике 13 сентября его нужно научиться собирать, запускать и отлаживать; | ||
+ | |||
+ | === Слайды с лекций === | ||
+ | |||
+ | * [[Медиа:Lec1.pdf|лекция 6 сентября pdf]], [[Медиа:Lec1.zip|latex исходники и картинки]] | ||
+ | * [[Медиа:Lec2.pdf|лекция 13 сентября pdf]], [[Медиа:Lec2.zip|latex исходники и картинки]] | ||
+ | * [[Медиа:Lec3.pdf|лекция 20 сентября pdf]], [[Медиа:Lec3.zip|latex исходники и картинки]] | ||
+ | * лекция 27 сентября была отменена | ||
+ | * [[Медиа:Lec4.pdf|лекция 4 октября pdf]], [[Медиа:Lec4.zip|latex исходники и картинки]] | ||
+ | * [[Медиа:Lec5.pdf|лекция 11 октября pdf]], [[Медиа:Lec5.zip|latex исходники и картинки]] | ||
+ | * [[Медиа:Lec6.pdf|лекция 18 октября pdf]], [[Медиа:Lec6.zip|latex исходники и картинки]] | ||
+ | * [[Медиа:Lec7.pdf|лекция 25 октября pdf]], [[Медиа:Lec7.zip|latex исходники и картинки]] | ||
+ | * [[Медиа:Lec8.pdf|лекция 8 ноября pdf]], [[Медиа:Lec8.zip|latex исходники и картинки]] | ||
+ | * [[Медиа:Lec9.pdf|лекция 15 ноября pdf]], [[Медиа:Lec9.zip|latex исходники и картинки]] | ||
+ | * [[Медиа:Lec10.pdf|лекция 22 ноября pdf]], [[Медиа:Lec10.zip|latex исходники и картинки]] | ||
+ | * [[Медиа:Lec11.pdf|лекция 29 ноября pdf]], [[Медиа:Lec11.zip|latex исходники и картинки]] | ||
+ | * [[Медиа:Lec12.pdf|лекция 6 декабря pdf]], [[Медиа:Lec12.zip|latex исходники и картинки]] | ||
+ | * [[Медиа:Lec13.pdf|лекция 13 декабря pdf]], [[Медиа:Lec13.zip|latex исходники и картинки]] | ||
+ | |||
+ | === Домашние задания === | ||
+ | |||
+ | * [[Медиа:OShw1.pdf|домашнее задание pdf]], [[Медиа:OShw1.zip|latex исходники]] - последний день сдачи 4 октября, [[Медиа:OShw1s.zip|решение]] | ||
+ | * [[Медиа:OShw2.pdf|домашнее задание pdf]], [[Медиа:OShw2.zip|latex исходники]] - последний день сдачи 25 октября (<b>продлено: последний день сдачи | ||
+ | 1 ноября</b>) (<b>ВНИМАНИЕ: в файле bootstrap.S была найдена ошибка, если вы столкнулись с page fault-ами замените файл bootstrap.S на файл по ссылке | ||
+ | [[Медиа:bootstrap.S.zip|bootstrap.S]]</b>) [[Медиа:OShw2s.zip|решение]] | ||
+ | * [[Медиа:OShw3.pdf|домашнее задание pdf]], [[Медиа:OShw3.zip|latex исходники]] - последний день сдачи 29 ноября [[Медиа:OShw3s.zip|решение]] | ||
+ | * [[Медиа:OShw4.pdf|домашнее задание pdf]], [[Медиа:OShw4.zip|latex исходники]] - до конца семестра ([[Медиа:make_initramfs.zip|make_initramfs.sh]]) | ||
+ | |||
+ | === Как пользоваться QEMU и gdb === | ||
+ | |||
+ | Чтобы запустить ОС (пусть файл ОС называется kernel) в QEMU нужно выполнить следующую команду: | ||
+ | |||
+ | qemu-system-x86_64 -kernel kernel | ||
+ | |||
+ | Чтобы перенаправить вывод последовательного порта в консоль используйте опцию -serial stdio: | ||
+ | |||
+ | qemu-system-x86_64 -kernel kernel -serial stdio | ||
+ | |||
+ | Чтобы подключать gdb к QEMU используйте опцию -s: | ||
+ | |||
+ | qemu-system-x86_64 -kernel kernel -serial stdio -s | ||
+ | |||
+ | Чтобы подключиться gdb к QEMU запущенному с опцией -s сделайте следующее: | ||
+ | |||
+ | gdb kernel | ||
+ | |||
+ | Из файла kernel gdb возьмет отладочную информацию. Например, какие строки кода каким процессорным | ||
+ | командам соответсвуют, из каких файлов собрано приложение, какие имена у переменных и каким адресам | ||
+ | в памяти они соответсвуют. | ||
+ | |||
+ | Далее внутри gdb: | ||
+ | |||
+ | set architecture i386:x86-64 | ||
+ | target remote localhost:1234 | ||
+ | |||
+ | если все прошло успешно, вы должны подключиться к QEMU, и он должен оставновить выполнение на текущей | ||
+ | исполняемой инструкции. | ||
+ | |||
+ | Чтобы вы могли оставновиться в самом начале функции main и не проскачить мимо кода, который вы хотите | ||
+ | отлаживать, соберите исходники с ключем DEBUG=1: | ||
+ | |||
+ | make clean && make DEBUG=1 | ||
+ | |||
+ | Этот ключик активирует бесконечный цикл: | ||
+ | |||
+ | static volatile int wait = 1; | ||
+ | while (wait); | ||
+ | |||
+ | После запуска приложение остановится в этом цикле. Чтобы продолжить выполнение нужно изменить значение | ||
+ | переменной wait с помощью gdb следующим образом: | ||
+ | |||
+ | set var wait=0 | ||
+ | |||
+ | Вообще, в QEMU есть также ключик -S, который останавливает QEMU сразу после старта приложения, но в | ||
+ | связи с тем, что перед вызовом main процессор переводится из 32-битного защищенного режима в 64-битный | ||
+ | Long Mode, а у gdb такой переход вызывает шок, то этим ключиком мне воспользоваться по назначению не | ||
+ | удалось (если вы найдете способ это сделать, то поделитесь со мной за 1 доп балл). | ||
+ | |||
+ | О том как исследовать память, расставлять точки останова, выполнять код по шагам вы можете найти во | ||
+ | [https://www.recurse.com/blog/5-learning-c-with-gdb введении в gdb]. | ||
+ | |||
=== Полезные материалы === | === Полезные материалы === | ||
− | * [[ | + | * [[Медиа:Asm64-handout.pdf|введение в ассемблер для x86]] |
+ | * [[Медиа:Abi_sysV_amd64.pdf|x86-64 ABI]] | ||
+ | * [[Медиа:64-ia-32-architectures-software-developer-manual-325462.pdf|Intel Manual]] | ||
+ | * [[Медиа:Intel-8259a.pdf|спецификация Intel 8259]] | ||
+ | * [[Медиа:8254.pdf|спецификация Intel 8254]] | ||
+ | * [https://www.recurse.com/blog/5-learning-c-with-gdb введение в gdb] | ||
+ | * [http://pages.cs.wisc.edu/~remzi/OSTEP/ довольно компактный и довольно содержательный учебник по ОС] | ||
+ | * [[Медиа:Pic.pdf|справка про преывания в x86]], [[Медиа:Pic.zip|исходники latex]] | ||
+ | * [[Медиа:Pit.pdf|справка про PIT]], [[Медиа:Pit.zip|исходники latex]] | ||
+ | * [[Медиа:Serial.pdf|справка про последовательный интерфейс]], [[Медиа:Serial.zip|исходники latex]] | ||
+ | * [https://www.gnu.org/software/grub/manual/multiboot/multiboot.html спецификация multiboot] |
Текущая версия на 14:36, 13 декабря 2016
Содержание
Общая информация
Лектор — Кринкин Михаил (krinkin.m.u@gmail.com)
Практики — Кринкин Михаил (krinkin.m.u@gmail.com)
- Если у вас появляются вопросы по материалам/содержанию курса, или по каким-то смежным темам, то вы можете задавать их по почте, после лекции или на практике.
- Если у вас возникают проблемы с выполнением домашних заданий, то приходите на практику с компьютером, будем разбираться вместе.
- Текущие результаты
Примеры кода
- первая порция кода - к лекции/практике 13 сентября его нужно научиться собирать, запускать и отлаживать;
Слайды с лекций
- лекция 6 сентября pdf, latex исходники и картинки
- лекция 13 сентября pdf, latex исходники и картинки
- лекция 20 сентября pdf, latex исходники и картинки
- лекция 27 сентября была отменена
- лекция 4 октября pdf, latex исходники и картинки
- лекция 11 октября pdf, latex исходники и картинки
- лекция 18 октября pdf, latex исходники и картинки
- лекция 25 октября pdf, latex исходники и картинки
- лекция 8 ноября pdf, latex исходники и картинки
- лекция 15 ноября pdf, latex исходники и картинки
- лекция 22 ноября pdf, latex исходники и картинки
- лекция 29 ноября pdf, latex исходники и картинки
- лекция 6 декабря pdf, latex исходники и картинки
- лекция 13 декабря pdf, latex исходники и картинки
Домашние задания
- домашнее задание pdf, latex исходники - последний день сдачи 4 октября, решение
- домашнее задание pdf, latex исходники - последний день сдачи 25 октября (продлено: последний день сдачи
1 ноября) (ВНИМАНИЕ: в файле bootstrap.S была найдена ошибка, если вы столкнулись с page fault-ами замените файл bootstrap.S на файл по ссылке bootstrap.S) решение
- домашнее задание pdf, latex исходники - последний день сдачи 29 ноября решение
- домашнее задание pdf, latex исходники - до конца семестра (make_initramfs.sh)
Как пользоваться QEMU и gdb
Чтобы запустить ОС (пусть файл ОС называется kernel) в QEMU нужно выполнить следующую команду:
qemu-system-x86_64 -kernel kernel
Чтобы перенаправить вывод последовательного порта в консоль используйте опцию -serial stdio:
qemu-system-x86_64 -kernel kernel -serial stdio
Чтобы подключать gdb к QEMU используйте опцию -s:
qemu-system-x86_64 -kernel kernel -serial stdio -s
Чтобы подключиться gdb к QEMU запущенному с опцией -s сделайте следующее:
gdb kernel
Из файла kernel gdb возьмет отладочную информацию. Например, какие строки кода каким процессорным командам соответсвуют, из каких файлов собрано приложение, какие имена у переменных и каким адресам в памяти они соответсвуют.
Далее внутри gdb:
set architecture i386:x86-64 target remote localhost:1234
если все прошло успешно, вы должны подключиться к QEMU, и он должен оставновить выполнение на текущей исполняемой инструкции.
Чтобы вы могли оставновиться в самом начале функции main и не проскачить мимо кода, который вы хотите отлаживать, соберите исходники с ключем DEBUG=1:
make clean && make DEBUG=1
Этот ключик активирует бесконечный цикл:
static volatile int wait = 1; while (wait);
После запуска приложение остановится в этом цикле. Чтобы продолжить выполнение нужно изменить значение переменной wait с помощью gdb следующим образом:
set var wait=0
Вообще, в QEMU есть также ключик -S, который останавливает QEMU сразу после старта приложения, но в связи с тем, что перед вызовом main процессор переводится из 32-битного защищенного режима в 64-битный Long Mode, а у gdb такой переход вызывает шок, то этим ключиком мне воспользоваться по назначению не удалось (если вы найдете способ это сделать, то поделитесь со мной за 1 доп балл).
О том как исследовать память, расставлять точки останова, выполнять код по шагам вы можете найти во введении в gdb.
Полезные материалы
- введение в ассемблер для x86
- x86-64 ABI
- Intel Manual
- спецификация Intel 8259
- спецификация Intel 8254
- введение в gdb
- довольно компактный и довольно содержательный учебник по ОС
- справка про преывания в x86, исходники latex
- справка про PIT, исходники latex
- справка про последовательный интерфейс, исходники latex
- спецификация multiboot