ОС осень 2016 — различия между версиями
Krinkin.m (обсуждение | вклад) |
Krinkin.m (обсуждение | вклад) |
||
Строка 7: | Строка 7: | ||
=== Примеры кода === | === Примеры кода === | ||
− | * [[Медиа:Src.zip|первая | + | * [[Медиа:Src.zip|первая порция кода]] - к лекции/практике 13 сентября его нужно научиться собирать, запускать и отлаживать; |
=== Слайды с лекций === | === Слайды с лекций === | ||
Строка 13: | Строка 13: | ||
=== Как пользоваться QEMU и gdb === | === Как пользоваться QEMU и gdb === | ||
− | Чтобы запустить ОС (пусть файл ОС называется kernel) в | + | Чтобы запустить ОС (пусть файл ОС называется kernel) в QEMU нужно выполнить следующую команду: |
qemu-system-x86_64 -kernel kernel | 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: | ||
+ | |||
+ | make clean && make -DEBUG | ||
+ | |||
+ | Этот ключик активирует бесконечный цикл: | ||
+ | |||
+ | static volatile int wait = 1; | ||
+ | while (wait); | ||
+ | |||
+ | После запуска приложение остановится в этом цикле. Чтобы продолжить выполнение нужно изменить значение | ||
+ | переменной wait с помощью gdb следующим образом: | ||
+ | |||
+ | set var wait=0 | ||
+ | |||
=== Полезные материалы === | === Полезные материалы === | ||
Строка 24: | Строка 64: | ||
* [[Медиа:Intel-8259a.pdf|спецификация Intel 8259]] | * [[Медиа:Intel-8259a.pdf|спецификация Intel 8259]] | ||
* [[Медиа:8254.pdf|спецификация Intel 8254]] | * [[Медиа:8254.pdf|спецификация Intel 8254]] | ||
+ | * [https://www.recurse.com/blog/5-learning-c-with-gdb введение в gdb] |
Версия 15:30, 6 сентября 2016
Содержание
Общая информация
Лектор — Кринкин Михаил (krinkin.m.u@gmail.com)
Практики — Кринкин Михаил (krinkin.m.u@gmail.com), Новокрещенов Константин (k.novokreshchenov@gmail.com )
Примеры кода
- первая порция кода - к лекции/практике 13 сентября его нужно научиться собирать, запускать и отлаживать;
Слайды с лекций
Как пользоваться 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:
make clean && make -DEBUG
Этот ключик активирует бесконечный цикл:
static volatile int wait = 1; while (wait);
После запуска приложение остановится в этом цикле. Чтобы продолжить выполнение нужно изменить значение переменной wait с помощью gdb следующим образом:
set var wait=0