В каком C операционная система записана?

>>> import ast
>>> x = u'[ "A","B","C" , " D"]'
>>> x = ast.literal_eval(x)
>>> x
['A', 'B', 'C', ' D']
>>> x = [n.strip() for n in x]
>>> x
['A', 'B', 'C', 'D']

ast.literal_eval :

С помощью ast.literal_eval можно безопасно оценить узел выражения или строку, содержащую выражение Python. Предоставленная строка или узел могут состоять только из следующих литеральных структур Python: строк, чисел, кортежей, списков, диктов, логических значений и None.

47
задан Carson Myers 8 July 2009 в 07:53
поделиться

9 ответов

Что за C?

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

Но есть ли в ОС вообще куча?

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

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

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

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

33
ответ дан 26 November 2019 в 19:26
поделиться

Excellent questions, all. The answer is: little to none of the standard C library is available in the "dialect" of C used to write an operating system. In the Linux kernel, for example, the standard memory allocation functions malloc, nmalloc, free etc. are replaced with special kernel-internel memory allocation functions kmalloc and kfree, with special restrictions on their use. The operating system must provide its own "heap" -- in the Linux kernel, physical memory pages that have been allocated for kernel use must be non-pageable and often physically continguous. See This linux journal article on kmalloc and kfree. Similarly, the operating system kernel maintains its own special call stack, the use of which requires, from memory, special support from the GCC compiler.

Also, how much of an operating system would actually be written in C? All of это?

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

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

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

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

47
ответ дан 26 November 2019 в 19:26
поделиться

Но сколько ее и какой тип C?

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

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

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

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

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

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

]Да, вы будете. Вам следует сначала взять книгу по аппаратному обеспечению и ОС.

я никогда раньше не видел.

Да, увидишь. Вам следует сначала взять книгу по аппаратному обеспечению и ОС.

я никогда раньше не видел.

Да, увидишь. Вам следует сначала взять книгу по аппаратному обеспечению и ОС.

5
ответ дан 26 November 2019 в 19:26
поделиться

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

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

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

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

2
ответ дан 26 November 2019 в 19:26
поделиться

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(;;);
}

Для компиляции нашего ' kernel ', вы можете использовать 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. Еще до этого вам может потребоваться посмотреть, как загружается компьютер - Щелкните здесь .

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

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

24
ответ дан 26 November 2019 в 19:26
поделиться

Вам следует прочитать Драйверы устройств Linux 3 . Он довольно хорошо объясняет внутреннее устройство ядра Linux.

2
ответ дан 26 November 2019 в 19:26
поделиться

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

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

1
ответ дан 26 November 2019 в 19:26
поделиться

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

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

0
ответ дан 26 November 2019 в 19:26
поделиться

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

. Для получения дополнительной информации я нашел, что разработка и реализация операционных систем, разработанная Эндрю Танненбаумом, особенно полезна с МНОЖЕСТВОМ примеров кода.

0
ответ дан 26 November 2019 в 19:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: