Забавные новости 0й-Ti :)

Тема в разделе "WASM.HEAP", создана пользователем UbIvItS, 18 июн 2018.

  1. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.430
    Адрес:
    Россия, Нижний Новгород
    Штош, попробуем побоксировать.
    В соседней теме, где падал Qemu, мы учились писать ядра на цэ и плюшках, а тут я нахваливаю ржавого - раст то, раст сё. Ну, давайте посмотрим.
    Нам нужен 32х-битный freestanding ELF, который не зависит ни от чего и который поддерживает Multiboot, чтобы мы могли загрузить его как линуксовое ядро.
    Оооокеей, cargo new kernel, погнали.

    Первое, что мы видим - у раста нет тулчейна для сборки 32х-битных freestanding-бинарников, а 64х-битные, доступные в тулчейне x86_64-unknown-none, не умеет Multiboot. Што делатб?
    Правильно - собирать кастомный тулчейн: How to compile Rust code to bare metal 32 bit x86 (i686) code? What compile target should I use? - Stack Overflow

    Создаём в корне i686-unknown-none.json, в нём пишем:
    Код (Text):
    1. {
    2.     "llvm-target": "i686-unknown-none",
    3.     "data-layout": "e-m:e-i32:32-f80:128-n8:16:32-S128-p:32:32",
    4.     "arch": "x86",
    5.     "target-endian": "little",
    6.     "target-pointer-width": "32",
    7.     "target-c-int-width": "32",
    8.     "os": "none",
    9.     "executables": true,
    10.     "linker-flavor": "ld.lld",
    11.     "linker": "rust-lld",
    12.     "panic-strategy": "abort",
    13.     "disable-redzone": true,
    14.     "features": "+soft-float,-sse"
    15. }
    Затем говорим Cargo, что хотим собрать этот тулчейн на основе параметров из джейсона:
    Создаём папку .cargo, в ней config.toml:
    Код (Text):
    1. [unstable]
    2. build-std = ["core", "compiler_builtins"]
    3. build-std-features = ["compiler-builtins-mem"]
    4.  
    5. [build]
    6. target = "i686-unknown-none.json"
    После этого привязываем наш проект к nightly-версии раста, поскольку stable-версии не поддерживают кастомные тулчейны (и вряд ли когда-то пересборку стабилизируют).
    Создаём в корне rust-toolchain.toml:
    Код ( (Unknown Language)):
    1. [toolchain]
    2. channel = "nightly"
    3. components = ["rust-src", "rust-std", "rustc", "cargo"]
    Теперь, когда мы наберём cargo build, скачается последний nightly-билд раста, который соберёт тулчейн под i686, которым будет собрано наше ядро.

    Так как у нас нет libunwind, отключим развёртывание стека при исключениях, чтобы приложение сразу падало.
    Для этого в Cargo.toml зададим поведением при паниках:
    Код (Text):
    1. [package]
    2. name = "kernel"
    3. version = "0.1.0"
    4. edition = "2021"
    5.  
    6. [profile.dev]
    7. panic = "abort"
    8.  
    9. [profile.release]
    10. panic = "abort"
    Переходим к коду.
    Так как мы запускаемся на голом железе, мы не можем использовать рантайм, поэтому делаем no_std-приложение с кастомным мейном.
    Кроме мейна нам потребуется обработчик паник и Multiboot-заголовок, чтобы Qemu смог его загрузить.
    Пишем заготовку:
    Код (Rust):
    1. #![no_std]
    2. #![no_main]
    3.  
    4. // Multiboot-header with the custom entry point:
    5. core::arch::global_asm!(r#"
    6.    .section .text
    7.        .align 4
    8.        .4byte 0x1BADB002
    9.        .4byte 0x00
    10.        .4byte -0x1BADB002
    11.  
    12.    .global _start
    13.  
    14.    _start:
    15.        call main
    16.        cli
    17.        hlt
    18. "#);
    19.  
    20. #[no_mangle]
    21. extern "stdcall" fn main() {
    22.     // Gotcha!
    23. }
    24.  
    25. #[panic_handler]
    26. fn panic(_info: &core::panic::PanicInfo) -> ! {
    27.     loop {
    28.         unsafe { core::arch::asm!("int 3") };
    29.     }
    30. }
    31.  
    Чтобы было по кайфу, научимся писать текст.
    Напишем простенькую обёртку над VGA по аналогии с той, что мы делали в той теме на плюсах.
    Код (Rust):
    1. #![no_std]
    2. #![no_main]
    3. #![warn(clippy::pedantic)]
    4.  
    5. use core::panic::PanicInfo;
    6.  
    7. core::arch::global_asm!(r#"
    8.    .section .text
    9.        .align 4
    10.        .4byte 0x1BADB002
    11.        .4byte 0x00
    12.        .4byte -0x1BADB002
    13.  
    14.    .global _start
    15.  
    16.    _start:
    17.        call main
    18.        cli
    19.        hlt
    20. "#);
    21.  
    22. mod vga {
    23.     use core::ffi::c_char;
    24.  
    25.     pub const ADDR: usize = 0xB8000;
    26.     pub const WIDTH: usize = 80;
    27.     pub const HEIGHT: usize = 25;
    28.  
    29.     #[repr(C)]
    30.     #[derive(Clone, Copy)]
    31.     pub struct Cell {
    32.         pub char: c_char,
    33.         pub color: u8
    34.     }
    35.  
    36.     type FrameBuffer = [[Cell; self::WIDTH]; self::HEIGHT];
    37.  
    38.     pub fn screen() -> &'static mut FrameBuffer { // '
    39.         unsafe { &mut *(self::ADDR as *mut FrameBuffer) }
    40.     }
    41.  
    42.     #[allow(dead_code)]
    43.     pub enum Color {
    44.         Black,
    45.         Blue,
    46.         Green,
    47.         Cyan,
    48.         Red,
    49.         Magenta,
    50.         Brown,
    51.         White,
    52.         Gray,
    53.         LightBlue,
    54.         LightGreen,
    55.         LightCyan,
    56.         LightRed,
    57.         LightMagenta,
    58.         Yellow,
    59.         BrightYellow
    60.     }
    61.  
    62.     impl Color {
    63.         pub const fn make(background: Color, text: Color) -> u8 {
    64.             (background as u8) << 4 | (text as u8)
    65.         }
    66.     }
    67. }
    68.  
    69. mod con {
    70.     use crate::vga;
    71.  
    72.     struct Pos {
    73.         x: usize,
    74.         y: usize
    75.     }
    76.  
    77.     impl Pos {
    78.         pub const fn new() -> Self {
    79.             Self { x: 0, y: 0 }
    80.         }
    81.     }
    82.  
    83.     static mut POS: Pos = Pos::new();
    84.  
    85.     fn pos() -> &'static mut Pos { // '
    86.         unsafe { &mut POS }
    87.     }
    88.  
    89.     pub fn clear(color: vga::Color) {
    90.         vga::screen().fill([vga::Cell { char: 0, color: vga::Color::make(color, vga::Color::Black) }; vga::WIDTH]);
    91.         unsafe { POS = Pos::new() };
    92.     }
    93.  
    94.     fn new_line() {
    95.         let pos = self::pos();
    96.         let screen = vga::screen();
    97.  
    98.         // Go to the next line:
    99.         pos.x = 0;
    100.         if pos.y == (vga::HEIGHT - 1) {
    101.             // Shift all lines:
    102.             for line_number in 0..(vga::HEIGHT - 1) {
    103.                 screen[line_number] = screen[line_number + 1];
    104.             }
    105.  
    106.             // Clear the last line:
    107.             screen[vga::HEIGHT - 1].fill(vga::Cell { char: 0, color: 0 });
    108.         } else {
    109.             pos.y += 1;
    110.         }
    111.     }
    112.  
    113.     pub fn print(color: u8, string: &str) {
    114.         let pos = self::pos();
    115.         let screen = vga::screen();
    116.  
    117.         for ch in string.as_bytes() {
    118.             match char::from(*ch) {
    119.                 '\r' => {
    120.                     pos.x = 0;
    121.                     continue;
    122.                 }
    123.                 '\n' => {
    124.                     new_line();
    125.                     continue;
    126.                 },
    127.                 _ => ()
    128.             }
    129.  
    130.             screen[pos.y][pos.x] = vga::Cell { char: *ch as core::ffi::c_char, color };
    131.        
    132.             pos.x += 1;
    133.        
    134.             if pos.x == vga::WIDTH {
    135.                 new_line();
    136.             }
    137.         }
    138.     }
    139. }
    140.  
    141. #[no_mangle]
    142. extern "stdcall" fn main() {
    143.     use vga::Color;
    144.  
    145.     con::clear(Color::LightGreen);
    146.     con::print(Color::make(Color::LightGreen, Color::Black), "- Hey, buddy, are you ready for rave?!\n");
    147.     con::print(Color::make(Color::LightGreen, Color::Black), "- Damn son! Where did you find this?!\n");
    148. }
    149.  
    150. #[panic_handler]
    151. fn panic(_info: &PanicInfo) -> ! {
    152.     loop {
    153.         unsafe { core::arch::asm!("int 3") };
    154.     }
    155. }
    156.  
    Запускаем:
    Код (Bash):
    1. qemu-system-x86_64 -kernel .\target\i686-unknown-none\debug\kernel
    Поздравляю! Вы великолепны!

    upload_2024-1-9_17-29-2.png
     
    Последнее редактирование: 9 янв 2024
    Rel, Aoizora и q2e74 нравится это.
  2. Research

    Research Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    88
    Rel, зачем нужно это гавно если не секрет? Чтобы уметь боксировать?
     
  3. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.270
    Чтобы триггерить элитных цэшных адептов с васма, для чего еще другого может быть сделан язык программирования, который не цэ?
     
  4. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.123
    одно слово == отладка: сишка наиболее легка в отладке. куча Одептов изрыгаются ненавистью к goto, молДе код в спагетти превращается, а вот небоскрёб обёрток на один вызов базовой функи их как-то не колышет :)
    Ты куда-то не туда гребёшь - макрос обеспечивает проверку/подготовку входных данных и записывает в сорц вызов целевой функции с этими данными, дальше пашет компиль. рантайм чекеры на макросах, конечно, не напишешь. другими словами, макрос обеспечивает подстановку строк, дабы обеспечить компактность/выразительность сорца :grin:
    то бишь делаем ржаку сишкой и ОНО работает :)

    ну - да, ладно == переходим к более интересным новостям...
    вот ОНЪЪЪ прогресс во всей своей красе :laugh1::laugh2::laugh3::clapping::good2:
     
  5. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.270
    Я о том и говорю, ты никогда не сможешь от Цэ добиться таких же абстракций, как от других языков, тех же Плюсов или Ржавого. Поэтому говорить, что ты можешь сделать тоже самое на Цэ, как минимум не корректно, тк это - далеко не тоже самое.

    Ну и говорить, о том, что абстракции вредны - глупо, а то, что они влияют на производительность тоже неверно, так как есть zero-cost абстракции, а когда ты используешь не бесплатные абстракции, тебе в общем то микросекунд считать и так нет смысла.

    Вопрос в том, зачем страдать и писать, как мы уже выяснили ни один раз, говнокод, если можно использовать инструменты, которые помогут тебе написать хотя бы чуть меньший говнокод?
     
  6. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    861
    Да ему по-видимому пофиг, ему главное продать говнокод, а будут ли там уязвимости и рандомные креши - это его не волнует.
     
  7. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.270
    Вопрос только в том, кто у него этот говнокод готов покупать?
     
  8. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    861
    Кто-то видимо покупает.
     
  9. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    352
    Эх, если бы не хорошее настроение, я бы сейчас поддержал Thetrik'а в "классовой борьбе" с глупостью. :) Воздержусь пока - пусть поживет. :) А причина, ну или повод для хорошего настроения - открыл для себя новую OS имя у которой, (фиг угадаете) - LINUX :) Но это не простой Линукс, а MANJARO (KDE). GUI там, конечно, просто потрясающее. Нужно только немного уделить времени настройкам и у любого пользователя - все получится. И это я еще с Вайландом не разобрался. Что-то у меня такое предчуствие, что если разберусь, то умру от счастья. :) Вот у кого "мелким" нужно бы поучиться. Ну куда там... им не до того... Для них главное - слежка и шпионаж во всем мире.

    В связи с этим вопрос: может кто в курсе, как подключать и отключать Вайланд в MANJARO - KDE? В том смысле, что переключаться между X11 и Вайландом?
     
  10. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.270
    "Я больше не хочу жить на этой планете в этой симуляции" (с)

    По сабжу:
     
  11. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.123
    ну-а, теперь покажи МЕЛОЧЬ == пример преимуществ плюхи в плане отладки.. или Ты абстракциями постоянно любуешься? :)
    и Тебе ровно тот же Вопрос :)
    если уж про что-то интересное в плане осей..

    а линь - это хрень, ставшая рутинной необходимостью. и в плане дЭва убунту лучше манджары :)
    --- Сообщение объединено, 11 янв 2024 ---
    вот ОНЪЪЪ шанс ржака-любам явить свою мощщщУУУУУУУ :laugh1::laugh2::laugh3::grin:
     
  12. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.430
    Адрес:
    Россия, Нижний Новгород
    Чува-а-а-а-к, буквально в соседней теме: https://wasm.in/threads/otobrazheni...razdeljaemaja-v-dll-pamjat.35010/#post-440728
    Вот что бывает, когда пишем без абстракций, как на си - эти бесконечные лесенки:
    Код (C++):
    1.  
    2. lock();
    3. auto res1 = acqureRes1();
    4. if (!res1)
    5. {
    6.     unlock();
    7.     return;
    8. }
    9.  
    10. auto res2 = acquireRes2();
    11. if (!res2)
    12. {
    13.     freeRes(res1);
    14.     unlock();
    15.     return;
    16. }
    17.  
    18. auto res3 = acquireRes3();
    19. {
    20.     freeRes(res2);
    21.     freeRes(res1);
    22.     unlock();
    23.     return;
    24. }
    25.  
    26. // ФРИ ФРИ ФРИ ДА СКОЛЬКО МОЖНО ЧТО Я ТАМ ЕЩЁ ЗАБЫЛ ФРИ АНЛОК ФРИ АНЛОК  АНЛОК ФРИ ФРИ ФРИ!!!
    27.  
    Вот код здорового человека:
    Код (C++):
    1.  
    2. auto locker = sync.lock();
    3.  
    4. auto res1 = acquireRes1();
    5. if (!res1)
    6. {
    7.     return;
    8. }
    9.  
    10. auto res2 = acquireRes2();
    11. if (!res2)
    12. {
    13.     return;
    14. }
    15.  
    16. auto res3 = acquireRes3();
    17. if (!res3)
    18. {
    19.     return;
    20. }
    21.  
    --- Сообщение объединено, 11 янв 2024 ---
    Установи пакет plasma-wayland-session:
    Код (Bash):
    1. sudo pacman -S plasma-wayland-session
    Затем выйди из сессии, и на экране ввода логина и пароля будет кнопка, где сможешь переключиться на X11 или Wayland.
    --- Сообщение объединено, 11 янв 2024 ---
    Знал бы ты, на каких костылях держится линукс…
    Со стороны пользователя это не видно: красивые окошки, анимации, темы, софт ставится в одну команду, но внутри там черти водятся!
     
    GRAFik нравится это.
  13. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    448
    На Си лесенки традиционно решаются goto exit; Это похожим образом выпрямляет код.
    На плюсах это не может являться нормальным решением, т.к. исключения могут обходить goto и таким образом нужны более твёрдые гарантии.
    Но вообще от введения в синтаксис finalize sections Си бы тоже только выиграл. Что нибудь типа:
    Код (C++):
    1.  
    2. auto res1 = acqureRes1();
    3. if (!res1)
    4.     return;
    5. finalize {
    6.    freeRes1(res1);
    7. };
    8. ...
    9.  
    Фактически это явное прописывание в синтаксис подкапотных механизмов RAII.
     
  14. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.270
    В новом стандарте собирались завести полноценный defer, почему этого не сделали 20 лет назад? Потому что Цэ, деды, которым он все еще остается нужон, не желают из зон комфорта выходить и видеть что-то новое.

    Я, конечно, понимаю, что с тем элитным кодом на Цэ, которым ты уже предлагал нам на полюбоваться, нужно справляться только отладчиком и в ассемблеры смотреть, но открою тебе секрет: я уже лет десять не использовал отладчик, а обходился отладочным выводом. Почему? Наверное потому, что умею писать и понимать свой код. Да и потом, куча отладчиков тебе позволит проходить тот же Плюсовый код прямо в исходнике и без необходимости ассемблер читать. Ты, наверное, опять же скажешь, что тебе нужно релизные версии с оптимизациями дебажить, но это от того, что код изначально плохой, дебажат дебажные сборки.
     
  15. Research

    Research Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    88
    Тиньков уже пояснил за погроммирование, не ясно зачем вы спорите

     
  16. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.270
    https://cohost.org/jckarter/post/2955755-the-lost-language-ex - когда читаю о том, как кто-то пытался натянуть на чистую православную Цэшу языковых фич, сразу вспоминаются почему-то вовсе не Плюсы, а https://ec-lang.org/ - но у всех, кроме Страуструпа, результат одинаковый.
    --- Сообщение объединено, 11 янв 2024 ---
    https://blog.nindalf.com/posts/stop-citing-tiobe/ - все, что нужно знать про индекс языков программирования от Тиобе, я раньше не знал, как они такую чушь в индексах получают, теперь я знаю "как", но не могу понять "зачем"...
     
  17. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.123
    define и функи-обёртки помогут Отцу русской демократии. А ежли уж совсем прёт на нечто глобальное - пользуй питоху в качестве препроцессора, тогда функи выглядят примерно так..
    void foo(...){
    // hey, py open_handles
    ....
    // hey, py close_handles
    }
    ++++++++
    питохой можно контролировать были ли закрыты все ресурсы.. дерзай :)
    ох-уж, эти элитто сказочники :laugh1::laugh2::laugh3: пиши есчо :good2::grin:
     
    Research нравится это.
  18. Research

    Research Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    88
    UbIvItS, элита котрая в каждом втором посте бьет себя тапком в грудь, что их кодес покупают по цене красной икры,
    при этом этот кодес никто никогда не видел, кроме самого "хозяина жизни". )
     
    Последнее редактирование: 12 янв 2024
    UbIvItS нравится это.
  19. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.123
    в основном так и есть..
    [​IMG]
    :)
     
  20. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.270
    Ну, кстати, моего кода, как и кода Хошимина в интернете вполне достаточно. С другой стороны, хотелось бы увидеть реальные кодесы Убивца.
    --- Сообщение объединено, 12 янв 2024 ---
    Опять же это говорит человек, который только говорит, но ничего толкового до сих пор не показал. И при этом называет сказочником меня...
     
    Последнее редактирование: 12 янв 2024