+142
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
// main.cpp
#include <stdio.h>
#include <stdlib.h>
//...
#include "tcp.h"
//...
#include "tcp.c"
//...
int main(int argc, char ** argv)
{
//...
receive_tcp_message(sock, &tcp_msg);
switch(tcp_msg.type)
{
#include "cases.h"
default:
break;
}
//...
}
Имелась небольшая утилита, написанная матёрым сишником. Имелся еще меньший шаблонный проект для таких утилит, написанный на плюсах с простым makefile. Таким вот нехитрым способом этот сишник влил первое во второе. Он не пользуется makefile, т.к. обычно пишет шелл-скрипт, собирающий весь проект. А еще он знает кучу анекдотов и историй, выпить не дурак и вообще отличный дядька.
Запостил: Xom94ok,
24 Июля 2013
bormand 24.07.2013 20:12 # +4
Старые Сишники они походу все такие ;)
> Он не пользуется makefile, т.к. обычно пишет шелл-скрипт, собирающий весь проект.
Писать мейкфайл руками - занятие неблагодарное, муторное и довольно бесполезное. Я тоже пишу шелл-скрипт для фигни из одного-двух файликов (а иногда просто вбиваю в консоли gcc -O2 some.c other.c и жму стрелку вверх, когда надо собрать ;). Ну а для более серьезных случаев есть qmake и cmake.
Xom94ok 24.07.2013 21:18 # 0
В четвертом QNX нет ни того, ни другого, так что магия универсальных makefile рулит :)
bormand 24.07.2013 23:26 # +1
Xom94ok 25.07.2013 05:30 # −1
bormand 25.07.2013 06:30 # +5
Странное какое-то оборудование... Ведь, имхо, проще и дешевле запаять rs-232 или 485 чем ставить какой-никакой видеоадаптер и контроллер клавы...
> кроме монитора и клавиатуры
Т.е. весь код перебивается руками? :)
j123123 14.05.2020 08:51 # 0
А может там делается особая железка, подключаемая в PS/2 порт и имитирующая клавиатуру, и через нее код набивается автоматически? Так можно и бинарники передавать сразу.
Web_Monkey 14.05.2020 09:57 # 0
j123123 14.05.2020 20:29 # 0
guest8 14.05.2020 20:37 # −999
ropuJIJIa 14.05.2020 20:46 # 0
↓↓↓↓↓↓↓↓↓↓↓↓↓
Krutsiatus 25.07.2013 07:58 # +2
anonimb84a2f6fd141 25.07.2013 08:00 # +4
bormand 25.07.2013 08:06 # +3
Для каких устройств, если не секрет?
MAKAKA 14.05.2020 21:33 # 0
ropuJIJIa 14.05.2020 21:34 # 0
bormand 14.05.2020 21:35 # 0
ropuJIJIa 14.05.2020 21:39 # 0
Однако, есть подозрение, что люди, далёкие от лоулевела, любую прошивку могут назвать «биосом».
guest8 14.05.2020 21:36 # −999
ropuJIJIa 14.05.2020 21:44 # 0
Есть гипотеза, что он всё-таки разрабатывал не биосы, а прошивки.
Ты видел, как в «популярных» журналах называли системный блок процессором?
bormand 14.05.2020 21:46 # 0
guest8 14.05.2020 21:47 # −999
guest8 14.05.2020 21:48 # −999
bormand 14.05.2020 21:51 # +1
guest8 14.05.2020 22:21 # −999
guest8 14.05.2020 22:33 # −999
bormand 15.05.2020 00:45 # 0
guest8 15.05.2020 01:30 # −999
bormand 15.05.2020 09:03 # 0
Не знаю как с дисками, но универсальный драйвер древних видюх переключается в 16 бит, запускает там option rom видюхи и дёргает int 10h для перечисления и переключения режимов. Обработчики прерываний во время этих вызовов, в принципе, будут работать. В остальное время - нет.
Ну и потом 16-битный загрузчик операционки в этом же окружении будет запущен.
ropuJIJIa 15.05.2020 12:42 # 0
Он переключается из «длинного» режима или запускает мумулятор процессора, находящегося в реальном режиме?
guest8 15.05.2020 12:51 # −999
ropuJIJIa 15.05.2020 12:56 # 0
А в 16-битном сегменте защищённого режима в регистрах CS, DS, SS, ES, FS, GS должен лежать валидный селектор сегмента.
guest8 15.05.2020 13:02 # −999
ropuJIJIa 15.05.2020 13:15 # 0
2. Размер GDT — 8192 дескриптора. Максимальный номер дескриптора 0x1FFF. Положение дескриптора совпадает со значением селектора. Значит, мы не сможем поместить программу в сегмент выше 0x1FFF. А это не вариант: BIOS обычно в сегменте 0xF000, а его option ROM — в предыдущих сегментах (начиная с 0xC000, потому что ниже располагается окно в видеопамять текстового режима).
3. Программа из option ROM может лазить в BDA (см. ниже) и в BIOS, чтобы подглядеть настройки.
4. В программе могут быть хакерские приёмы, основанные на том, что в реальном режиме адрес — это seg*16+ofs, поэтому в сегментном регистре может оказаться невалидная питушня.
ropuJIJIa 15.05.2020 13:07 # 0
Программа реального режима может это сделать, обратившись к ячейке как к 0:0x417 или как к 0x40:0x17 (теоретически может даже как к 0x41:7, вообще возможно несколько вариантов). В защищённом программа сломает зубы. Чтобы ей помочь, нужно создать селектор 0 с базой 0, селектор 0x40 с базой 0x400 и так далее.
В GDT есть место для 8192 дескрипторов. Чтобы любая программа реального режима гарантированно работала, дескрипторов должно быть 65536.
bormand 15.05.2020 13:23 # +1
ropuJIJIa 15.05.2020 13:41 # 0
Два младших бита — номер кольца. Для ring 0 это будет 0, для ring 3 будет 3 (где-то тут пробегал кэп). Бит перед ними — выбор между LDT и GDT.
Т. е. для доступа на уровне нулевого кольца можно использовать только селекторы, оканчивающиеся на 16-ричную цифру 0, 8 (будут взяты из GDT) либо 4, C (будут взяты из LDT).
А упомянутые мной числа 0..1FFF нужно сдвинуть на три бита. Т. е. можно использовать диапазон (0..FFFF), но на младшие биты будут ограничения (иначе доступ будет из другого кольца).
Короче, работать не будет. Дизассемблировать и переписать и то проще, чем создать костыльное окружение.
bormand 15.05.2020 13:43 # 0
Ну собственно виртуалки так и делали пока интел хуи пинал.
guest8 15.05.2020 13:44 # −999
ropuJIJIa 15.05.2020 13:47 # 0
Итак, есть три режима:
• Реальный.
• «Короткий» защищённый. Доступны сегменты v86, 16-битные, 32-битные.
• «Длинный» защищённый. Доступны сегменты 16-битные, 32-битные, 64-битные.
guest8 15.05.2020 14:05 # −999
ropuJIJIa 15.05.2020 14:18 # 0
3oJIoTou_xyu 15.05.2020 14:19 # 0
MAKAKA 15.05.2020 15:07 # −1
bormand 15.05.2020 13:20 # +1
ropuJIJIa 15.05.2020 13:22 # 0
bormand 15.05.2020 13:26 # 0
Скорее винда боится, что этот код ей что-нибудь навернёт. А с эмулятором у неё всё под контролем.
nABuAH 15.05.2020 17:34 # 0
Буквы через int 10h выводят, но в крайне редких случаях: когда режим графический (в таком режиме выводить текст через видеопамять нельзя), но при этом заморачиваться с рендерингом шрифта лень.
В серьёзных программах такой способ вывода применяют редко, потому что портится фон, BIOS может какой-то из размеров шрифта не поддерживать... В общем, надёжнее самому шрифт отрендерить.
Тем не менее, в «наколеночных» программах этот способ встречается хотя бы ради возможности вводить текст через scanf/std::cin/readln/input.
bormand 15.05.2020 17:37 # +1
А команды 0Ch и 0Dh в int 10h тогда что делают? Просто это медленно и нахуй никому не нужно.
nABuAH 15.05.2020 17:40 # 0
Почему же эти функции никто не использовал?
bormand 15.05.2020 17:45 # +1
Из-за скорости, я думаю. Вывод пикселя - это же самая "горячая" операция, её инлайнить надо по-хорошему. А тут целый сисколл на каждый пиксель.
Я и вывод текста через int 10h то юзал только для того, чтобы шрифты у прошивки спиздить...
nABuAH 15.05.2020 17:47 # 0
guest8 15.05.2020 18:09 # −999
nABuAH 15.05.2020 18:16 # 0
А чем INT 10h, INT 13h хуже?
P.S. А в Линуксе сисколлы были через INT 80h.
А в Windows 3.x, 95, 98, Me сисколлы из нулевого кольца (из vxd-драйверов) были через INT 20h.
guest8 15.05.2020 18:22 # −999
nABuAH 15.05.2020 17:44 # +1
В режимах plane map (640×480, 640×350) эти функции совершают по четыре переключения плоскости каждый вызов, что приводит к диким тормозам. Программа же может эти переключения делать реже, упорядочивая вывод изображения по цветовым плоскостям.
А в режиме pixel map (320×200) эти функции и даром не нужны, потому что можно срать в видеопамять и течь.
nABuAH 15.05.2020 18:29 # 0
Допустим, нам нужно залить каким-нибудь цветом прямоугольник размером 500×400 пикселей (итого 200 тыс. пикселей) в режиме «plane map».
Если программа будет делать это напрямую, она сначала выберет красную плоскость, выведет красные компоненты пикселей, потом выберет зелёную плоскость, потом синюю, потом плоскость яркости... Итого будет 4 переключения на всю заливку.
Если же мы будем заливать этот прямоугольник через BIOS, то плоскости будут переключаться для каждого пикселя, итого переключение плоскостей отнимет времени в 200 тысяч раз больше, чем если бы мы обращались к железу напрямую.
А в режимах SVGA/VESA (1024×768 и выше) разница уже будет в миллион раз и больше.
Какие тормоза )))
bormand 15.05.2020 18:37 # +1
Иди в отдел маркетинга работать с такими расчётами. Само рисование пикселя у нас уже за 0 тактов идёт? Да и в SVGA на плоскости уже забили.
nABuAH 15.05.2020 18:46 # 0
>> Да и в SVGA на плоскости уже забили.
Точно. В SVGA видеопамять уже не отображается на первый мегабайт, поэтому там окно в видеопамять разработано настолько, что может вместить це́лую страницу за раз.
bormand 15.05.2020 18:51 # 0
Ну в этом и суть. Вроде и не наёб, а звучит как ускорение в 200к раз. На самом деле там разница всего раз в 20-30 скорее всего.
guest8 15.05.2020 13:32 # −999
bormand 14.05.2020 22:00 # 0
guest8 14.05.2020 22:11 # −999
ropuJIJIa 14.05.2020 22:30 # 0
guest8 14.05.2020 22:38 # −999
ropuJIJIa 14.05.2020 22:42 # 0
guest8 14.05.2020 22:45 # −999
bormand 15.05.2020 00:49 # 0
В отличие от х86, где немножко асма всё-таки требуется.
А всякие мелочи типа запрета прерываний - интринсики.
guest8 15.05.2020 00:52 # −999
Needless 15.05.2020 00:59 # 0
А на x86 выдумали какие-то иопорты и кот вперемешку с даннымы который запускался в анальном режиме в какой-то жопе.
guest8 15.05.2020 01:06 # −999
ropuJIJIa 15.05.2020 01:15 # 0
guest8 15.05.2020 01:22 # −999
bormand 15.05.2020 13:30 # 0
guest8 15.05.2020 13:34 # −999
bormand 15.05.2020 13:36 # 0
guest8 14.05.2020 21:16 # −999
MAKAKA 14.05.2020 21:34 # 0
Остановите борманда, но в шаге от изобретения аутолулз
inkanus-gray 24.07.2013 20:29 # +4
Но где?
Xom94ok 24.07.2013 21:08 # −2
inkanus-gray 25.07.2013 01:11 # +2
bormand 25.07.2013 05:34 # +3
Эх не умеете читать внутри строчек... Вот тут:
> Имелся еще меньший шаблонный проект для таких утилит, написанный на плюсах с простым makefile.
inkanus-gray 25.07.2013 17:06 # 0
Любопытно, как выглядит этот самый "cases.h", который якобы на плюсах, но который неплохо смотрится в чисто сишном коде.
Xom94ok 25.07.2013 18:49 # +2
Обвинения "где main.cpp" вполне справедливы: это сишный код, всунутый в крестовый по самые гланды
>>как выглядит этот самый "cases.h"
Как обычно выглядит содержимое свитча? case value: do_shit(); break; и таких кейсов строк на 100.
У него (сишника) я когда-то увидел аналогичный "трюк", но примененный к enum: В общем, без грамма иронии, я от всей души желаю ему крепкого здоровья и долгих лет.
Xom94ok 25.07.2013 06:00 # 0
Krutsiatus 25.07.2013 07:56 # 0
guest8 14.05.2020 22:20 # −999
guest8 15.05.2020 01:29 # −999
guest8 01.10.2020 19:36 # −999
bootcamp_dropout 01.10.2020 19:39 # 0
Вроде в элитных американских униках принято студенческие клубы называть тремя греческими буквами
MAPTbIwKA 01.10.2020 19:41 # 0
bootcamp_dropout 01.10.2020 19:43 # 0