LINUX.ORG.RU

Hello world без ОС

 


2

3

здрасьте здрасьте люди добрые


 section .text
global main
main:
movq $'1', %rcx
movq $4, %rax
movq $1, %rbx
movq $1,%rdx
int $0x80 

вот это я хочу скомпилировать получить машинные инструкции и записать их в файл f.bin после с помощью dd if=f.bin of=/dev/sdb

записать на флешку и запустить на голом железе. что мне нужно добавить в код на ассемблере, чтобы получить правильный машинный код, который выведет на экран '1'?

что мне нужно добавить в код на ассемблере, чтобы получить правильный машинный код, который выведет на экран ‘1’?

Ubuntu.

А если серьёзно, то сходи на OSDev, там расписано, что, как и куда загружается. Как минимум загрузчик примитивнейший ещё надо.

Korchevatel ★★★★★
()
Ответ на: комментарий от slovazap

да это я набросок сделал.... int автоматом поставил, не обдумав. спасибо за замечание по делу

Assembler
() автор топика
Ответ на: комментарий от Korchevatel

А если серьёзно, то сходи на OSDev, там расписано, что, как и куда загружается. Как минимум загрузчик примитивнейший ещё надо.

Именно так, потому как ТС пока не разработает ядро своей ОС «не успокоится».

ТС, возьми для начала готовый код и разберись с ним.

Владимир

anonymous
()
Ответ на: комментарий от slovazap

Эм, ну если не считать что процессор будет пытаться выполнять 16 битные операнды и работоспособность кода не является конечным результатом, то можно

sparks ★★★★
()

movq $‘1’, %rcx

В 64-битном режиме, если мне память не изменяет, нет прерываний бивиса. И твой main никто вызывать тем более не будет.

У тебя два варианта: либо получать управление из UEFI сразу в 64-битном режиме, либо стартовать в 16-битном режиме как это делает GRUB и дальше самому инициализировать всё.

https://wiki.osdev.org/UEFI#UEFI_vs._legacy_BIOS

Вот тебе ссылка. Да и вообще, osdev.org – это как раз сайт со всеми ответами на твои вопросы.

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от sparks

Что значит «будет пытаться»? Процессоры не пытаются, процессоры выполняют или не выполняют. Я уже давно не опускался до ассемблера, но мне казалось что регистры и набор инструкций от режима адресации никак не зависят. Понятно что к памяти не обратиться, но загрузить 16 бит, посчитать 64 битными инструкциями и положить обратно 16 бит, должно быть можно всегда.

slovazap ★★★★★
()
Последнее исправление: slovazap (всего исправлений: 1)
Ответ на: комментарий от slovazap

Ну ты даешь, это же основы основ. Хотя может ты все путаешь потому что 32-битные регистры действительно можно использовать из real-mode, но вот остальное...

AdonisSexyBoy
()
Ответ на: комментарий от hateyoufeel

А где тут прерывания BIOS? IVT сохраняется, но ее все равно не вызвать, код то там 16-битный.

AdonisSexyBoy
()
Ответ на: комментарий от AdonisSexyBoy

Ну ты даешь, это же основы основ

Это не основы основ, а очень узкая специфика. Человек который это знает с исчезающе малой вероятностью настоящий разработчик новой ОС, гипервизора или bare metal приложения, а не праздный ковыряльщик асма без реальной цели типа ТС.

Хотя может ты все путаешь потому что 32-битные регистры действительно можно использовать из real-mode, но вот остальное…

В отсутствие фактов которые я не должен помнить и не собираюсь тратить время на гуглёж которых, я руководствуюсь логикой, а логики в том что 32-битные регистры использовать можно, а 64-битные нельзя нет. Можешь привести ссылку на документацию где написано обратное, а также что именно произойдёт если в real mode сделать, например, xor rax, rax.

slovazap ★★★★★
()
Ответ на: комментарий от Korchevatel

А если серьёзно, то сходи на OSDev

Можно даже ещё прицельнее послать:

https://wiki.osdev.org/Bare_Bones

ТСу: там есть примеры простейших загрузчиков (но обрати внимание на предупреждение сверху экрана).

Ещё можно сходить в блог gOWNOS, там материала меньше, но всё по-русски. Пролистай вниз и читай прямо с первого урока.

hobbit ★★★★★
()
Вот тебе голубчик, овчинный тулупчик

4.4 References

Andrew Tanenbaum, 2007. Modern operating systems, 3rd edition. Prentice Hall, Inc.,
Dennis M. Ritchie Brian W. Kernighan, 1988. The c programming language, second edition. Prentice Hall, Inc.,

http://www.kth.se                                      The royal institute of technology
http://en.wikipedia.org/wiki/Hexadecimal               Wikipedia, Hexadecimal
http://wiki.osdev.org/Main_Page                        OSDev, OSDev
http://www.jamesmolloy.co.uk/tutorial_html/            James Molloy, James m’s kernel development tutorial
http://www.ubuntu.com/                                 Canonical Ltd, Ubuntu
http://www.virtualbox.org/                             Oracle, Oracle vM virtualBox 
http://en.wikipedia.org/wiki/C_(programming_language)  Wikipedia, C (programming language) 
http://gcc.gnu.org/                                    Free Software Foundation, GCC, the gNU compiler collection
http://www.nasm.us/                                    NASM, NASM: The netwide assembler
http://en.wikipedia.org/wiki/Bash_%28Unix_shell%29     Wikipedia, Bash
http://www.gnu.org/software/make/                      Free Software Foundation, GNU make

Volker Ruppert, bochs: The open souce iA-32 emulation project, http://bochs.sourceforge.net/

QEMU, QEMU, http://wiki.qemu.org/Main_Page,

Wikipedia, BIOS, https://en.wikipedia.org/wiki/BIOS,

Free Software Foundation, GNU gRUB, http://www.gnu.org/software/grub/

Wikipedia, Executable and linkable format, http://en.wikipedia.org/wiki/Executable_and_Linkable_Format,

Free Software Foundation, Multiboot specification version 0.6.96, http://www.gnu.org/software/ grub/manual/multiboot/multiboot.html,

GNU, GNU binutils, http://www.gnu.org/software/binutils/

Lars Nodeen, Bug #426419: configure: error: GRUB requires a working absolute objcopy, https://bugs.launchpad.net/ubuntu/+source/grub/+bug/426419,

Wikipedia, ISO image, http://en.wikipedia.org/wiki/ISO_image,

Bochs, bochsrc, http://bochs.sourceforge.net/doc/docbook/user/bochsrc.html,

NASM, RESB and friends: Declaring uninitialized data, http://www.nasm.us/doc/nasmdoc3.htm,

Wikipedia, x86 calling conventions, http://en.wikipedia.org/wiki/X86_calling_conventions,

Wikipedia, Framebuffer, http://en.wikipedia.org/wiki/Framebuffer,

Wikipedia, VGA-compatible text mode, http://en.wikipedia.org/wiki/VGA-compatible_text_mode,

Wikipedia, ASCII, https://en.wikipedia.org/wiki/Ascii,

OSDev, VGA hardware, http://wiki.osdev.org/VGA_Hardware,

Wikipedia, Serial port, http://en.wikipedia.org/wiki/Serial_port,

OSDev, Serial ports, http://wiki.osdev.org/Serial_ports,

WikiBooks, Serial programming/8250 uART programming, http://en.wikibooks.org/wiki/Serial_Programming/ 8250_UART_Programming,

Intel, Intel 64 and iA-32 architectures software developer’s manual vol. 3A, http://www.intel.com/content/ www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-3a-part-1-manual.html/

NASM, Multi-line macros, http://www.nasm.us/doc/nasmdoc4.html#section-4.3,

SIGOPS, i386 interrupt handling, http://www.acm.uiuc.edu/sigops/roll_your_own/i386/irq.html,

Andries Brouwer, Keyboard scancodes, http://www.win.tue.nl/

Steve Chamberlain, Using ld, the gNU linker, http://www.math.utah.edu/docs/info/ld_toc.html,

OSDev, Page frame allocation, http://wiki.osdev.org/Page_Frame_Allocation,

OSDev, Programmable interval timer, http://wiki.osdev.org/Programmable_Interval_Timer,

bootloader must fit into the master boot record (MBR) boot sector of a hard drive, which is only 512 bytes large.

https://habr.com/post/426525/                              Написание собственной работоспособной ОС за полгода

Владимир

anonymous
()
Ответ на: комментарий от hobbit

Могу ещё добавить, что когда у меня последний раз была чесотка на предмет написания своей ОС, я сделал работающий загрузчик как раз по материалам gOWNOS, прикрутил к нему некоторое подобие рантайма C++ (с неработающим аллокатором) и начал было делать что-то вроде библиотеки для текстового вывода.

Возможно, моей упоротости хватило бы на какую-нибудь «недоядерную недоконсоль» и какое-то подобие tmux для неё, но тут я познакомился с Embox и решил, что это примерно то, что я хотел. На том я и успокоился. Возможно, когда-нибудь чесотка появится снова, но пока тьфу-тьфу, 6 лет и полёт нормальный.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от slovazap

Это не основы основ, а очень узкая специфика.

Смотря чем занимаешься, мне казалось ты по C/C++. Само знание того исполняется ли 16-битный код в long-mode не нужно конечно, но через это знание все равно надо было проходить по идее.

а логики в том что 32-битные регистры использовать можно, а 64-битные нельзя нет

Проиграл, спасибо.

AdonisSexyBoy
()
Ответ на: комментарий от peregrine

ТС же просто «адын» хочет вывести, там все элементарно. 512 байт хватит всем :)

Дело в том, что сейчас уже везде UEFI, и всё указанное уже не нужно. Правда, я сам в нем хотел разобраться, начал на том и закончил. Потом может когда-то…

Stack77
()
Ответ на: комментарий от slovazap

32-битные регистры в реальном режиме можно использовать потому, что для них есть специальный префикс 66/67.

   33 С0  -  xor  ax, ax
66 33 C0  -  xor eax, eax

А вот для 64-битных команд такого префикса нет, так что 64-битные регистры недоступны.

xor rax,rax в реальном режиме будет интерпретирована как «dec ax; xor ax, ax»

bigbit ★★★★★
()

вот это я хочу скомпилировать получить машинные инструкции и записать их в файл f.bin после с помощью dd if=f.bin of=/dev/sdb записать на флешку и запустить на голом железе.

А что ты вообще хочешь сделать, БИОС загрузит в память только нулевой сектор, что составит 512 байт которых едва на первичный загрузчик хватает, который даже в ФС не умееет и может грузить только последовательность секторов накопителя. То есть туда ты поместишь только первичный загрузчик и всё.
Почему тебе к примеру не написать свой машиннный код как загружаемый модуль для Grub или как загружаемое grub самописное ядро?

torvn77 ★★★★★
()
Последнее исправление: torvn77 (всего исправлений: 1)
Ответ на: комментарий от Assembler

так биос же есть

Уже нет. Для UEFI можно писать на обычном C/C++ в 32/64 битном защищённом режиме.

X512 ★★★★★
()
Ответ на: комментарий от slovazap

На x86 64-битные инструкции не работают в 16 и даже 32-битном режиме. 32-битные инструкции из 16-битного режима вызывать можно, а вот 64-битные нельзя даже из 32-битного.

KivApple ★★★★★
()
Ответ на: комментарий от bigbit

То есть меняется набор инструкций. Интересно, но жесть.

slovazap ★★★★★
()
Ответ на: комментарий от torvn77

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

Assembler
() автор топика
Ответ на: комментарий от torvn77

Почему тебе к примеру не написать свой машиннный код как загружаемый модуль для Grub

А чё сразу не для UEFI?

hobbit ★★★★★
()
Ответ на: комментарий от torvn77

С одной стороны да. С другой в современных системах GRUB оказывается надстройкой над UEFI, и тут возникает вопрос «а нафига нам такая цепочка».

Правда, не все UEFI одинаково полезны, есть такие, которые видят и грузят строго одну ОС.

hobbit ★★★★★
()
Ответ на: комментарий от hobbit

и тут возникает вопрос «а нафига нам такая цепочка».

Как я понимаю UEFI не умеет

  • в initrd.
  • в командную строку ядра.
  • в загрузку ядра и inird с сетевых ресурсов.
  • а если и умеет то для этого надо лезть в БИОС.

В принципе UEFI если я правильно понимаю соответствует полуторной стадии загрузки GRUB.

torvn77 ★★★★★
()
Последнее исправление: torvn77 (всего исправлений: 3)
Ответ на: комментарий от torvn77

Ох вау, я и не надеялся. Круто, спасибо!

anonymous
()

без ОС

int $0x80

«не пытайтесь понять, понять - невозможно» (c)

cloun1901
()
Ответ на: удаленный комментарий

Обосновывать «убогость» ты, конечно же, не пойдёшь?

hobbit ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.