Подтвердить что ты не робот

Что такое C - это операционная система?

Имеет смысл, что что-то вроде операционной системы будет написано на C. Но сколько из этого и что такое C? Я имею в виду, в C, если вам нужна куча памяти, вы бы назвали malloc. Но есть ли у ОС даже куча? Насколько мне известно, malloc запрашивает операционную систему для памяти, а затем добавляет ее в связанный список или двоичное дерево или что-то в этом роде. Как насчет стека вызовов? ОС отвечает за настройку всего этого материала, который используются другими приложениями, но как это сделать? Когда вы хотите открыть или создать файл на C, соответствующие функции запрашивают операционную систему для этого файла. так... Что такое С на другой стороне этого звонка? Или на другом конце выделения памяти?

Кроме того, какая часть операционной системы действительно будет записана на C? Все это? Что относительно кода, зависящего от архитектуры? Что относительно более высоких уровней абстракции - делает ли это когда-либо написанным на языках более высокого уровня, например С++?

Я имею в виду, я просто прошу об этом из чистого любопытства. Теперь я загружаю последнее ядро ​​Linux, но оно выполняется навсегда. Я не уверен, смогу ли я следовать коду, или если я попаду в непреодолимую сложность сети, которую я никогда раньше не видел.

4b9b3361

Ответ 1

Что такое C?

В основном ANSI C, с большим количеством времени глядя на машинный код, который он генерирует.

Но есть ли у ОС даже куча?

Malloc запрашивает операционную систему для указателя на некоторую память, которую разрешено использовать. Если программа, работающая в ОС (пользовательский режим), пытается получить доступ к памяти, которой она не принадлежит, она даст ошибку сегментации. OS разрешено напрямую обращаться ко всей физической памяти в системе, malloc не требуется, никаких seg-сбоев по любому адресу, который существует.

Как насчет стека вызовов?

Стек вызовов фактически часто работает на аппаратном уровне со списком ссылок.

Для доступа к файлам ОС необходим доступ к драйверу диска, который должен знать, как читать файловую систему на диске (существует много разных видов). Иногда у ОС есть встроенная встроенная программа, но я думаю чаще всего загрузчик загружает его, и он загружает другой (более крупный). Драйвер диска имеет доступ к аппаратным IO физического диска и строит из него.

Ответ 2

Отличные вопросы, все. Ответ таков: практически ни одна из стандартных библиотек C не доступна в диалекте C, используемом для записи операционной системы. В ядре Linux, например, стандартные функции распределения памяти malloc, nmalloc, free и т.д. Заменяются специальными функциями распределения памяти ядра и интервала kmalloc и kfree с особыми ограничениями на их использование. Операционная система должна предоставить свою собственную "кучу" - в ядре Linux страницы физической памяти, которые были выделены для использования ядра, должны быть нестранимыми и часто физически сложными. См. Эта статья журнала Linux о kmalloc и kfree. Аналогично, ядро ​​операционной системы поддерживает свой собственный специальный стек вызовов, использование которого требует от памяти специальной поддержки от компилятора GCC.

Кроме того, какая часть операционной системы действительно будет записана на C? Все это?

Насколько мне известно, операционные системы в основном написаны на C. Некоторые функции, специфичные для архитектуры, кодируются в ассемблере, но, как правило, очень мало для улучшения переносимости и ремонтопригодности: ядро ​​Linux имеет некоторый ассемблер, но пытается свести к минимуму его как можно больше.

Как насчет зависимости от архитектуры код? Как насчет более высоких уровней абстракция - это когда-либо получается написанные на языках более высокого уровня, как С++?

Обычно ядро ​​будет записано в чистом C, но иногда структуры более высокого уровня и API-интерфейсы написаны на языке более высокого уровня. Например, инфраструктура Cocoa/API на MacOS написана в Objective C, а API более высокого уровня BeOS были написаны на С++. Большая часть платформы Microsoft.NET была написана на С# с "Common Language Runtime", написанной в сочетании С++ и ассемблера. Набор виджета QT, наиболее часто используемый в Linux, написан на С++. Конечно, это вводит философские вопросы о том, что считается "операционной системой".

Ядро Linux, безусловно, стоит посмотреть на это, хотя, надо сказать, это огромная и пугающая для всех, кто читает с нуля.

Ответ 3

C - язык очень низкого уровня, и вы можете делать много вещей напрямую. Любой из методов библиотеки C (например, malloc, printf, crlscr ​​и т.д.) Необходимо сначала реализовать, чтобы вызвать их из C (см., Например, концепции libc). Я приведу пример ниже.

Посмотрим, как реализуются методы библиотеки C под капотом. Мы рассмотрим пример clrscr. Когда вы применяете такие методы, вы будете обращаться к системным устройствам напрямую. Например, для clrscr (очистка экрана) мы знаем, что видеопамять находится на уровне 0xB8000. Следовательно, чтобы писать на экран или очищать его, мы начинаем с назначения указателя на это местоположение.

В video.c

void clrscr()
{

   unsigned char *vidmem = (unsigned char *)0xB8000;
   const long size = 80*25;
   long loop;

   for (loop=0; loop<size; loop++) {
      *vidmem++ = 0;
      *vidmem++ = 0xF;
   }
}

Теперь напишем наше мини-ядро. Это очистит экран, когда управление будет передано нашему "ядру" из загрузчика. В main.c

void main()
{
   clrscr();
   for(;;);
}

Чтобы скомпилировать наше "ядро", вы можете использовать gcc для его компиляции в чистый формат bin.

gcc -ffreestanding -c main.c -o main.o
gcc -c video.c -o video.o
ld -e _main -Ttext 0x1000 -o kernel.o main.o video.o
ld -i -e _main -Ttext 0x1000 -o kernel.o main.o video.o
objcopy -R .note -R .comment -S -O binary kernel.o kernel.bin

Если вы заметили параметры ld выше, вы увидите, что мы указываем местоположение загрузки по умолчанию вашего ядра как 0x1000. Теперь вам нужно создать загрузчик. Из логики загрузчика вы можете передать управление своему ядру, например

jump 08h:01000h

Обычно вы записываете логику загрузчика в Asm. Еще до этого вам, возможно, потребуется посмотреть, как Boot Boots - Щелкните здесь.

Лучше начать с более тонкой операционной системы для изучения. См. Этот ролик своего учебного пособия по ОС

http://www.acm.uiuc.edu/sigops/roll_your_own/

Ответ 4

Но сколько из этого и какой C?

Некоторые детали должны быть записаны в сборке

Я имею в виду, что в C, если вам нужна куча памяти, вы бы назвали malloc. Но есть ли у ОС даже куча? Насколько мне известно, malloc запрашивает операционную систему для памяти, а затем добавляет ее в связанный список или двоичное дерево или что-то в этом роде.

В некоторых ОС есть куча. На самом низком уровне они представляют собой плиты памяти, которые вычеркнуты называемыми страницами. Затем ваша библиотека C разбивается по своей схеме с переменным размером с malloc. Вы должны узнать о виртуальной памяти, которая является общей схемой памяти в современных ОС.

Если вы хотите открыть или создать файл на C, соответствующие функции запрашивают операционную систему для этого файла. поэтому... Что такое C на другой стороне этого вызова?

Вы вызываете процедуры сборки, которые запрашивают аппаратное обеспечение с инструкциями типа IN и OUT. При необработанном доступе к памяти иногда у вас есть области памяти, предназначенные для связи с оборудованием и с него. Это называется DMA.

Я не уверен, смогу ли я следить за кодом, или если я попаду в непреодолимую сложность сети, которую я никогда раньше не видел.

Да. Сначала вы должны забрать книгу об оборудовании и ОС.

Ответ 5

Я имею в виду, что в C, если вам нужна куча памяти, вы бы назвали malloc. Но есть ли у ОС даже куча? Насколько мне известно, malloc запрашивает операционную систему для памяти, а затем добавляет ее в связанный список или двоичное дерево или что-то в этом роде. Как насчет стека вызовов?

Многие из того, что вы говорите в своем вопросе, фактически выполняются библиотекой времени выполнения в пользовательском пространстве.

Все, что требуется ОС, - это загрузить программу в память и перейти к ней, точнее, после того, как она будет выполнена программой пользовательского пространства. Куча и стек - это просто области виртуальной памяти процессов. Стек - это только регистр указателей в процессоре.

Выделение физической памяти - это то, что делается на уровне ОС. OS обычно выделяет страницы фиксированного размера, которые затем отображаются в пользовательский пространственный процесс.

Ответ 7

Я бы не стал читать ядро ​​Linux, это слишком сложно для начинающих.

Osdev - отличное место для начала чтения. Я сделал небольшую книгу с информацией из Осдева о школьном предмете. Он работает на vmware, bochs и qemu, поэтому его легко проверить. Вот исходный код.

Ответ 8

Традиционно C требуется в основном для драйверов ядра и устройства из-за взаимодействия с оборудованием. Однако языки, такие как С++ и Java, могут использоваться для всей операционной системы

Для получения дополнительной информации я нашел, что дизайн и реализация операционных систем Andrew Tannenbaum особенно полезен для LOTS образцов кода.

Ответ 9

Функции управления malloc и управления памятью не являются ключевыми словами в C. Это функции стандартных библиотек ОС. Я не знаю названия этого стандарта (маловероятно, что это стандарт POSIX - я не нашел упоминания), но он существует - вы используете malloc в приложениях C на большинстве платформ.

Если вы хотите знать, как работает ядро ​​Linux, я советую этой книге http://oreilly.com/catalog/9780596005658/. Я думаю, это хорошее объяснение с некоторым вставленным кодом C:).