{"id":25219354,"url":"https://github.com/kiselkovd/bootstrapping_linux_on_cpu","last_synced_at":"2025-04-05T10:16:05.038Z","repository":{"id":266545028,"uuid":"898645499","full_name":"KiselkovD/bootstrapping_Linux_on_CPU","owner":"KiselkovD","description":"bootstrapping gnu/linux on verilog cpu with assembler \u0026 c","archived":false,"fork":false,"pushed_at":"2024-12-04T19:59:09.000Z","size":11,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-17T21:28:12.024Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/KiselkovD.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-12-04T19:09:31.000Z","updated_at":"2024-12-04T19:59:13.000Z","dependencies_parsed_at":"2024-12-04T20:41:03.755Z","dependency_job_id":null,"html_url":"https://github.com/KiselkovD/bootstrapping_Linux_on_CPU","commit_stats":null,"previous_names":["kiselkovd/bootstrapping_linux_on_cpu"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KiselkovD%2Fbootstrapping_Linux_on_CPU","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KiselkovD%2Fbootstrapping_Linux_on_CPU/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KiselkovD%2Fbootstrapping_Linux_on_CPU/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KiselkovD%2Fbootstrapping_Linux_on_CPU/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/KiselkovD","download_url":"https://codeload.github.com/KiselkovD/bootstrapping_Linux_on_CPU/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247318749,"owners_count":20919483,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-02-10T21:08:36.440Z","updated_at":"2025-04-05T10:16:04.994Z","avatar_url":"https://github.com/KiselkovD.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# bootstrapping_Linux_on_CPU\n\n## Текущий план\n\n### Упрощенно\n\n| **Verilog_CPU_32**  | on Verilog               |\n| ------------------- | ------------------------ |\n| **assemble (base)** | (working on) Verilog_CPU |\n\n| compile ...           | writen on ...     | формат       |\n| --------------------- | ----------------- | ------------ |\n| **assemble (RISC-V)** | assemble (base)   | .hex автокод |\n| **Forth**             | assemble (RISC-V) | .hex автокод |\n| **TCC**               | Forth             |              |\n| **GCC**               | TCC               |              |\n| **GNU/Linux**         | C                 |              |\n\n### Полноценно\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth colspan=\"3\"\u003e план действий \u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd colspan=\"2\"\u003eзапустить что-то на верилог\u003c/td\u003e\n    \u003ctd\u003e + \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd colspan=\"2\"\u003eвывести .hex используя блок памяти, счетчик и часы\u003c/td\u003e\n    \u003ctd\u003e - \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd colspan=\"2\"\u003eреализовать LMC\u003c/td\u003e\n    \u003ctd\u003e - \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd colspan=\"2\"\u003eреализовать автокодер (а лучше assembler)\u003c/td\u003e\n    \u003ctd\u003e - \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd colspan=\"2\"\u003eнаписать assemble_RISC-V.asm\u003c/td\u003e\n    \u003ctd\u003e - \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd colspan=\"2\"\u003eRISC.hex скормить LMC\u003c/td\u003e\n    \u003ctd\u003e - \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eфорт.с в форт.asm\u003c/td\u003e\n    \u003ctd rowspan=\"3\"\u003eTCC.c в TCC.asm\u003c/td\u003e\n    \u003ctd\u003e - \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eскормить форт.asm\u003c/td\u003e\n    \u003ctd\u003e - \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eTCC.c в TCC.fth\u003c/td\u003e\n    \u003ctd\u003e - \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eскормить TCC.fth\u003c/td\u003e\n    \u003ctd\u003eскормить TCC.asm\u003c/td\u003e\n    \u003ctd\u003e - \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd colspan=\"2\"\u003eскормить gcc.c\u003c/td\u003e\n    \u003ctd\u003e - \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd colspan=\"2\"\u003eскормить tiny core linux\u003c/td\u003e\n    \u003ctd\u003e - \u003c/td\u003e\n  \u003c/tr\u003e \n\u003c/table\u003e\n\n## Вариации середины:\n\n### Tiny C Compiler (TCC)\n\nбольшинство стандартных функций C, может использоваться как интерпретатор.\n\n### Минималистичные интерпретаторы и компиляторы\n\n- **TinyCC**: Компактный компилятор C, известный своей высокой скоростью.\n- **LCC**: Легкий компилятор C, оптимизированный для простоты.\n- **Picol**: Минималистичный интерпретатор Tcl.\n- **Forth**: Язык программирования с компактными реализациями.\n- **The Super Tiny Interpreter**: Интерпретатор для подмножества JavaScript.\n\n## Разбор шагов:\n\n### Verilog_CPU\n\nможно сделать на основе [Little Man Computer](https://habr.com/ru/articles/412057/)\n\n### Assemble (base)\n\n[ Минимальный набор команд ](##Основные-команды-RISC-V)\nдля создания остального ассемблера:\n\n- Арифметические операции: ADD, SUB, MUL, DIV.\n- Логические операции: AND, OR, XOR, NOT.\n- Перемещение данных: MOV (реализуется через ADD с нулевым регистром).\n- Загрузка и сохранение: LW (load word), SW (store word).\n- Управляющие команды: BEQ (branch if equal), BNE (branch if not equal), J (jump).\n\n### Assemble (RISC-V)\n\n- [ RISC-V wiki ](https://en.wikipedia.org/wiki/RISC-V)\n\n### TCC\n\n- [ исходный код TCC ](https://www.iro.umontreal.ca/~felipe/IFT2030-Automne2002/Complements/tinyc.c)\n- [ инструмент для перевода в assemble и оценки насколько все плохо ](https://godbolt.org/)\n\n### GNU/Linux\n\n- компактный дистрибутив [ Tiny core linux ](http://tinycorelinux.net/12.x/x86/release/src/)\n  - **tinycore-12.x.tar.gz** - основной архив с исходным кодом Tiny Core Linux.\n  - **tce-12.x.tar.gz** - архив, содержащий необходимые библиотеки и компоненты для работы системы.\n  - **build-tools.tar.gz** - инструменты для сборки, которые могут понадобиться для компиляции пакетов.\n- Micro Core Linux еще меньше Tiny core\n- простая сборка из оптимальных версий\n  - [ Linux 2.6.32 ](https://cdn.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.tar.xz)\n  - [ BusyBox 1.30.x ](https://busybox.net/downloads/busybox-1.30.1.tar.bz2)\n    - [ BusyBox набор утилит ](##BusyBox)\n- первый исторический [Linux](https://github.com/zavg/linux-0.01)\n\n## Шаги для сборки минимального дистрибутива Linux (при обычной установке из Linux)\n\n### 1. инструменты для сборки\n\n```bash\nsudo apt update\nsudo apt install --yes make build-essential bc bison flex libssl-dev libelf-dev wget cpio fdisk extlinux dosfstools qemu-system-x86\n```\n\n### 2.структура каталогов\n\n```bash\nmkdir -p ~/simple-linux/build/sources\nmkdir -p ~/simple-linux/build/downloads\nmkdir -p ~/simple-linux/build/out\n```\n\n### 3. исходный код\n\nLinux 2.6.32 и BusyBox 1.30.x:\n\n```bash\ncd ~/simple-linux/build/downloads\nwget https://cdn.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.tar.xz\nwget https://busybox.net/downloads/busybox-1.30.1.tar.bz2\n```\n\n### 4. Распаковка\n\n```bash\ntar -xvf linux-2.6.32.tar.xz -C ../sources\ntar -xjvf busybox-1.30.1.tar.bz2 -C ../sources\n```\n\n### 5. Сборка BusyBox\n\n```bash\ncd ../sources/busybox-1.30.1\nmake defconfig\nmake LDFLAGS=-static\ncp busybox ../../out/\n```\n\n### 6. Сборка ядра Linux\n\n```bash\ncd ../linux-2.6.32\nmake defconfig\nmake -j8 || exit\ncp arch/x86/boot/bzImage ~/simple-linux/build/out/vmlinuz-2.6.32\n```\n\n### 7. Создание начального образа (initramfs)\n\n#### Создание файла init:\n\n```bash\ncd ~/simple-linux/build/out/\necho '#!/bin/sh' \u003e init\necho 'mount -t proc proc /proc' \u003e\u003e init\necho 'mount -t sysfs sys /sys' \u003e\u003e init\necho 'exec /bin/busybox sh' \u003e\u003e init\nchmod +x init\n```\n\n#### Подготовка корневой файловой системы:\n\n```bash\nmkdir rootfs\ncp busybox rootfs/\ncp init rootfs/\n```\n\n#### Создание образа файловой системы:\n\n```bash\ncd rootfs\nfind . | cpio -o --format=newc | gzip \u003e ../initramfs.gz\n```\n\n### 8. Настройка загрузчика\n\n`extlinux` или другой загрузчик.\n\nИнструменты сборки, такие как `make`, `build-essential`, `bc`, `bison`, `flex`, `libssl-dev`, `libelf-dev`, `wget`, `cpio`, `fdisk`, `extlinux`, `dosfstools` и `qemu-system-x86`, играют важную роль в процессе создания дистрибутива Linux. Давайте рассмотрим каждый из этих инструментов и их необходимость.\n\n### Инструменты сборки\n\n1. **make**:\n\n   - Это утилита для автоматизации сборки программ. Она читает файлы Makefile, чтобы определить, какие части программы нужно компилировать и в каком порядке.\n\n2. **build-essential**:\n\n   - Это метапакет, который включает в себя основные инструменты для разработки, такие как компиляторы (например, gcc) и другие необходимые утилиты. Он необходим для сборки большинства программ.\n\n3. **wget**:\n\n   - Это утилита для загрузки файлов из интернета. Она необходима для скачивания исходного кода и других ресурсов.\n\n4. **cpio**:\n   - Это утилита для создания и извлечения архивов. Она может использоваться для создания начальных образов файловой системы (initramfs).\n\n### Необходимость инструментов\n\n- минимум для базовой сборки `make`, `build-essential`, `wget` и для архивов (`cpio`).\n- шифрование или сетевые протоколы - библиотеки OpenSSL (`libssl-dev`).\n- генерация парсеров `bison` и `flex`\n- загрузочные образы или работать с разделами диска: `extlinux` и `fdisk`\n\n### другие\n\n1. **libelf-dev**:\n\n   - Это библиотеки для работы с ELF (Executable and Linkable Format) файлами. Они могут быть полезны при работе с ядром Linux и другими низкоуровневыми компонентами.\n\n2. **dosfstools**:\n\n   - Набор инструментов для работы с файловыми системами FAT, которые могут понадобиться при создании загрузочных USB-накопителей или образов.\n\n3. **qemu-system-x86**:\n\n   - Эмулятор и виртуализатор, который позволяет запускать операционные системы на виртуальных машинах. Он полезен для тестирования вашего дистрибутива без необходимости установки его на физическое оборудование.\n\n4. **bc**:\n\n   - Это калькулятор с плавающей запятой, который иногда используется в скриптах сборки для выполнения математических операций\n\n   ***\n\n   ***\n\n# Доп информация\n\n### mount\n\nLinux действительно имеет доступ к памяти через различные файловые системы, включая FAT. Система управляет этим доступом с помощью механизма монтирования и внутренней таблицы монтирования, что позволяет эффективно управлять данными на разных устройствах и разделах без необходимости изменять сами ссылки или структуру данных в файловых системах.\n\n## BusyBox\n\nнабор утилит командной строки\n\n### Командные оболочки\n\n- **ash** – командная оболочка.\n- **bash** – командная оболочка.\n- **sh** – интерпретатор команд.\n\n### Работа с файлами и каталогами\n\n- **cat** – конкатенация файлов.\n- **cp** – копировать.\n- **cut** – выбор заданных полей из файла.\n- **ln** – создать ссылку на файл или каталог.\n- **mkdir** – создание каталога.\n- **more** – постраничный просмотр текстовых файлов.\n- **mv** – переместить файл.\n- **pwd** – вывести рабочий каталог.\n- **rm** – удаление файлов или каталогов.\n- **rmdir** – удаление пустых каталогов.\n- **touch** – обновить дату последнего изменения файла.\n- **ls** – вывести список файлов или каталогов.\n- **tar** – работа с архивами формата tar.\n- **dd** – копирование файла с конвертированием и форматированием.\n\n### Управление правами и владельцами\n\n- **chmod** – смена прав доступа.\n- **chown** – смена владельца.\n\n### Системные утилиты\n\n- **date** – текущее дата/время.\n- **df** – статистика использования файловой системы.\n- **dmesg** – вывод буфера сообщений ядра.\n- **uname** – информация о системе.\n- **mdu** – статистика использования дискового пространства (иногда используется в альтернативных дистрибутивах).\n\n### Процессы и задачи\n\n- **kill** – завершить процесс.\n- **ps** – информация о процессах.\n- **pidof** – вывести список PID всех процессов по имени.\n- **crond** – планировщик заданий.\n- **login** – начать новый сеанс в системе.\n- **sleep** – пауза на N секунд.\n- **usleep** – пауза на N микросекунд.\n\n### Сетевые утилиты\n\n- **ping** – отправить пакеты ICMP ECHO_REQUEST сетевым узлам.\n- **netstat** – информация о сетевых настройках и подключениях.\n- **nc** – утилита для установления TCP и UDP соединений.\n- **ntpc / ntpsync** – клиент синхронизации времени по протоколу NTP.\n\n### Обработка текста\n\n- **awk** – язык обработки строк по шаблонам.\n- **sed** – преобразование текстовых потоков.\n- **grep** – поиск по шаблону в файлах или стандартном вводе.\n  - **egrep** – grep с поддержкой расширенных регулярных выражений.\n  - **fgrep** – grep с оптимизированным поиском фиксированной строки.\n\n### Архивирование и сжатие\n\n- **gzip / gunzip** – упаковать/распаковать в gzip.\n- **zcat** – распаковать в стандартный вывод.\n\n### Другие утилиты\n\n- **wc** – счет строк, слов, символов.\n- **sync** – записать все буферизированные блоки файловой системы на диск.\n- **mount / umount** – монтирование/отмонтирование файловых систем.\n- **watch** – исполнять программу периодически.\n- **tee** – ветвление канала (вывод в несколько мест).\n\n### Утилиты для работы с системными данными\n\n- **diff** – утилита сравнения файлов.\n- **echo** – вывод строки.\n- **crond / atd / anacron (если доступны)**– планировщики задач.\n\n### Дополнительные утилиты\n\n- **tftp** – обмен файлами по протоколу TFTP.\n- **rstats** – авторские права BusyBox.\n- **sort** – сортировка.\n- **vi** – редактировать файл.\n- **wget** – утилита закачки файлов.\n- **nvram** – работа с энергозависимой памятью (если доступно).\n\n## Основные команды RISC-V\n\n1. **Арифметические и логические инструкции**:\n\n   - **R-type**: операции с регистрами, такие как `add`, `sub`, `and`, `or`, `xor`.\n   - Пример: `add rd, rs1, rs2` — складывает значения в регистрах `rs1` и `rs2`, результат записывается в `rd`.\n\n2. **Инструкции загрузки и сохранения**:\n\n   - **I-type**: используются для загрузки данных из памяти в регистры и наоборот.\n   - Примеры:\n     - `lw rd, offset(rs1)` — загружает слово из памяти по адресу, вычисляемому как сумма значения в `rs1` и смещения.\n     - `sw rs2, offset(rs1)` — сохраняет слово из регистра `rs2` в память по адресу, вычисляемому так же.\n\n3. **Управляющие инструкции**:\n\n   - **B-type**: условные переходы, такие как `beq` (branch if equal), `bne` (branch if not equal).\n   - Пример: `beq rs1, rs2, label` — если значения в `rs1` и `rs2` равны, переход к метке.\n\n4. **Инструкции для немедленных значений**:\n\n   - **I-type**: операции с немедленными значениями.\n   - Пример: `li rd, immediate` — загружает немедленное значение в регистр.\n\n5. **Инструкции для установки верхнего значения регистра**:\n\n   - **U-type**: загружают 20-битное значение в верхние 20 бит регистра.\n   - Пример: `lui rd, immediate` — загружает немедленное значение в верхние 20 бит регистра.\n\n6. **Инструкции безусловного перехода**:\n   - **J-type**: используются для безусловных переходов.\n   - Пример: `jal rd, label` — переходит к метке и сохраняет адрес следующей инструкции в регистр `rd`.\n\n## О компонентах компьютера (чипсет)\n\n| Модуль                          | Описание                                                                            | Связи с другими модулями                                              |\n| ------------------------------- | ----------------------------------------------------------------------------------- | --------------------------------------------------------------------- |\n| **Центральный процессор (ЦП)**  | Основной вычислительный элемент, выполняющий инструкции и обрабатывающий данные.    | Связан с северным мостом через высокоскоростную шину (например, QPI). |\n| **Северный мост (GMCH)**        | Обеспечивает связь между ЦП, оперативной памятью и графической картой.              | Связан с ЦП, оперативной памятью и южным мостом.                      |\n| **Оперативная память (RAM)**    | Временное хранилище данных для выполнения программ.                                 | Подключена к северному мосту через контроллер памяти.                 |\n| **Видеокарта**                  | Обрабатывает графику и выводит изображение на экран.                                | Подключена к северному мосту через шину PCI Express.                  |\n| **Южный мост (ICH)**            | Управляет медленными компонентами, такими как HDD и USB-устройства.                 | Связан с северным мостом и различными периферийными устройствами.     |\n| **Жесткий диск (HDD)**          | Постоянное хранилище данных для операционной системы и файлов.                      | Подключен к южному мосту через интерфейс SATA или PATA.               |\n| **Контроллер USB**              | Обеспечивает подключение USB-устройств.                                             | Встроен в южный мост и соединен с внешними USB-портами.               |\n| **Система питания (VRM)**       | Регулирует напряжение для ЦП и других компонентов.                                  | Связана с материнской платой и компонентами, требующими питания.      |\n| **BIOS**                        | Начальная система ввода-вывода, управляющая загрузкой компьютера.                   | Взаимодействует с южным мостом через шину LPC.                        |\n| **Слоты расширения (PCI/PCIe)** | Позволяют подключать дополнительные карты, такие как звуковые или сетевые адаптеры. | Подключены к южному мосту для передачи данных.                        |\n\n## О памяти компьютера (адресное пространство)\n\n| Компонент                   | Описание                                                                                                |\n| --------------------------- | ------------------------------------------------------------------------------------------------------- |\n| Системная память (RAM)      | Оперативная память для хранения данных и выполнения программ.                                           |\n| Видеопамять (совместимость) | Используется графическим контроллером для хранения изобр/графики.                                       |\n| Жесткий диск (HDD/SSD)      | Область для доступа к жесткому диску и хранения данных.                                                 |\n| Стандартная память          | Зарезервированная область для системных нужд.                                                           |\n| Область расширения          | Место для ПЗУ BIOS внешних устройств.                                                                   |\n| Расширенная системная BIOS  | Область для управления режимами работы системы.                                                         |\n| Регистры процессора         | (Не отображаются в адресном пространстве) Внутренние ячейки для данных и управления выполнением команд. |\n\n\u003c!--Разрыв доверенности при интерпретации--\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkiselkovd%2Fbootstrapping_linux_on_cpu","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkiselkovd%2Fbootstrapping_linux_on_cpu","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkiselkovd%2Fbootstrapping_linux_on_cpu/lists"}