
Eu estava fazendo um sistema operacional Linux do zero. eu me depareiesseartigo, que cria um sistema operacional Linux mínimo que apenas imprime hello world assim que o kernel do Linux é inicializado.
Então, minha pergunta é: em qual espaço [kernel ou espaço do usuário] esse programa helloworld está sendo executado? Minha consciência diz que é o espaço do kernel, então como faço para que ele rode no espaço do usuário?
Para as pessoas que não querem ler aquele artigo extenso, aqui está o que ele faz em resumo.
- Formatei minha unidade flash USB [/dev/sdb no meu sistema Linux] com formato de arquivo ext4.
- Montado na pasta /mnt/mylinux.
- Pastas criadas /boot e /bin nele.
- Coloquei uma cópia do kernel do Linux [compilei do código-fonte do github.] bzImage na pasta /boot
- Instalei o grub2 na pasta /boot de /dev/sdb e criei o arquivo grub.cfg para especificar meu programa init.
Meu programa de inicialização.
#include <stdio.h>
#include <unistd.h>
int main(void){
while(1){
printf("Hello World\n");
sleep(1);
}
}
Meu programa init é compilado estaticamente e colocado na pasta/bin.
Então, quando eu inicializo esta unidade, ela começa a imprimir: Hello World
Responder1
No seu caso, é um espaço do usuário: você usa bibliotecas padrão, então usa a API do espaço do usuário para fazer as coisas.
Se o seu programa foi executado pelo kernel, você tem apenas uma API interna do kernel (então kprintf) e muitas restrições sobre o que você pode fazer. Além disso, você precisa colocar no kernel ou como módulo do kernel. O kernel não executa código externo como espaço do kernel.
Nota: existem casos híbridos, mas sempre iniciados pelo kernel, para processos de longa duração, não para bloquear o kernel. Nesse caso, o código é tratado pelo agendador e fica visível na lista de processos (geralmente números PID baixos, mas não 1).