Análisis experimental: https://www.zhihu.com/column/c_142990858
Linux es un sistema operativo de código abierto. Los usuarios pueden adaptar y modificar el núcleo de acuerdo con su propio sistema, las necesidades de personalizar los sistemas con funciones más apropiadas y una mayor eficiencia operativa. Por lo tanto, compilar el núcleo Linux es una habilidad básica necesaria para el desarrollo del núcleo.
Agregar nuevas llamadas del sistema según sea necesario en el sistema es un método común para modificar el núcleo. A través de este experimento, los lectores deben comprender el proceso de las llamadas del sistema de procesamiento del sistema Linux y el método de agregar llamadas al sistema.
(1) Agregue una llamada del sistema para implementar la función de modificación o lectura del buen valor del proceso especificado y devuelva el último valor de buen valor y prioridad del proceso. Se recomienda llamar al prototipo como:
int mySetNice (pid_t pid, int Flag, int
Significado de parámetro: PID: ID de proceso.
Bandera: si el valor es 0, significa leer el buen valor; Si el valor es 1, significa modificar el buen valor.
Prio, Niza: la prioridad actual y el buen valor del proceso. Valor de retorno: devuelva 0 cuando la llamada del sistema es exitosa y devuelve el código de error Efault cuando la llamada del sistema falla.
(2) Escriba una prueba de aplicación simple agregada en (1).
(3) Si la función del núcleo de Linux se llama en el programa, se requiere leer el código fuente de la función relevante en profundidad.
El mecanismo del módulo proporcionado por Linux puede expandir dinámicamente las funciones de Linux sin recompilar el núcleo, y se ha utilizado ampliamente en la implementación de muchas funciones del núcleo de Linux. En este experimento, aprenderemos los conceptos básicos, los principios y las técnicas de implementación de los módulos, y luego usaremos el módulo del núcleo para programar y acceder a la información básica del proceso, profundizando así nuestra comprensión de los conceptos del proceso y la dominación de las técnicas de programación de módulos.
(1) Diseñe un módulo que requiere enumerar los nombres del programa, los números de PID, el estado del proceso y las prioridades de proceso de todos los hilos del núcleo en el sistema.
(2) Diseñe un módulo con parámetros, cuyos parámetros son el número PID de un proceso. La función de este módulo es enumerar la información familiar del proceso, incluido el nombre del programa y el número de PID del proceso principal, el proceso del hermano y el proceso infantil.
(3) Lea aún más la implementación del código fuente de las funciones relevantes del kernel utilizadas en el programa en función de su propia situación.
(1) Esté familiarizado con la interfaz de comando de Linux.
(2) A través de la aplicación de programación de las llamadas de sistema relacionadas para el control del proceso de Linux, profundizaremos aún más nuestra comprensión de los conceptos de procesos, aclararemos la conexión y las diferencias entre procesos y programas, y comprenderemos el significado específico de la ejecución concurrente de procesos.
(3) Mediante el uso del mecanismo de comunicación de la tubería de Linux, el mecanismo de comunicación de colas de mensajes y el mecanismo de comunicación de memoria compartida, profundice la comprensión de los diferentes tipos de métodos de comunicación de procesos.
(4) profundizar la comprensión del mecanismo de sincronización de semáforo a través de la aplicación de semáforos POSIX en Linux. (5) Lea y analice aún más la implementación del código fuente del núcleo de las llamadas del sistema relacionadas en función de su propia situación.
(1) Familiarizado con los comandos comunes de Linux: PWD, UserAdd, Passwd, OMS, PS, PStree, Kill, Top, LS, CD, Mkdir, Rmdir, CP, RM, MV, Cat, More, Grep, etc.
(2) Implementar un shell simulado:
Escriba tres programas diferentes cmd1.c, cmd2.c y cmd3.c. Las funciones de cada programa se personalizan y compilan en archivos ejecutables CMD1, CMD2 y CMD3 respectivamente. Luego escriba un programa para simular la función del programa Shell. Puede crear un proceso infantil para el comando correspondiente basado en la cadena ingresada por el usuario (que representa el nombre del comando correspondiente) y dejar que ejecute el programa correspondiente. El proceso principal espera a que termine el proceso infantil, y luego espera a que se reciba el próximo comando. Si el comando recibido es salida, el proceso principal finaliza; Si el comando recibido es un comando inválido, se muestra "comando no encontrado" y continúa esperando.
(3) Implementar un programa de comunicación de tuberías:
El proceso principal crea una tubería, y luego se crean 3 procesos infantiles, y estos tres procesos infantiles usan la tubería para comunicarse con el proceso principal: el proceso infantil envía información, y el proceso principal y otros tres procesos infantiles reciben la información después de todo envío de mensajes. El contenido específico de la comunicación se puede diseñar a voluntad de acuerdo con sus propias necesidades, y es necesario probar varias situaciones en el proceso de lectura y escritura de bloqueo, probar el tamaño predeterminado de la tubería y utilizar el mecanismo de semáforo POSIX para lograr un acceso mutuamente excluyente a la tubería entre los procesos. Ejecute el programa para observar el número real de bytes leídos y escritos por el proceso y el bloqueo y el despertar del proceso en diversas circunstancias.
(4) Use el mecanismo de comunicación de la cola de mensajes de Linux para realizar la comunicación entre dos hilos:
Escriba un programa para crear dos subprocesos: hilo del remitente y hilo de recibir, donde el hilo del remitente ejecuta el remitente de la función (), que crea una cola de mensajes, y luego boques para esperar a que el usuario ingrese una cadena de caracteres a través del terminal, enviando la cadena de caracteres a la hilo del receptor a través de la cola de mensajes hasta que el usuario ingrese "Salir"; Finalmente, envía un mensaje "Fin" al hilo del receptor y espera la respuesta del receptor. Después del mensaje de respuesta, muestra la información de respuesta recibida en la pantalla del terminal, elimina la cola de mensajes relevante y finaliza el programa en ejecución. El hilo del receptor ejecuta recibir (), que recibe mensajes del remitente a través de la cola de mensajes y muestra el mensaje en la pantalla del terminal hasta que recibe un mensaje con "Fin". En este momento, envía un mensaje de respuesta "sobre" al remitente, finalizando la ejecución del programa. Use semáforos sin nombre para lograr la sincronización y la exclusión mutua entre dos hilos.
(5) Use el mecanismo de comunicación de memoria compartida de Linux para realizar la comunicación entre dos procesos:
Escriba un remitente del programa, que crea una memoria compartida, y luego espera a que el usuario ingrese una cadena de caracteres a través del terminal, y envía la cadena de caracteres al receptor a través de la memoria compartida; Finalmente, espera la respuesta del receptor. Después de recibir el mensaje de respuesta, muestra la información de respuesta recibida en la pantalla del terminal, elimina la memoria compartida y finaliza la ejecución del programa. Escriba un programa receptor, que recibe mensajes del remitente a través de la memoria compartida, muestra el mensaje en la pantalla del terminal y luego envía un mensaje de respuesta "sobre" al remitente a través de la memoria compartida, finalizando el programa en ejecución. Use un semáforo o semáforo del sistema v con nombre para lograr el uso mutuamente exclusivo y sincrónico de la memoria compartida por dos procesos.
A través de la administración del espacio de almacenamiento de archivos específico, la estructura física de los archivos, la estructura del directorio y las operaciones de archivos, profundizaremos nuestra comprensión de la estructura de datos internos, las funciones y el proceso de implementación del sistema de archivos.
(1) Abra un espacio de disco virtual en la memoria como una partición de almacenamiento de archivos e implementa un sistema de archivos simple en un solo sistema de tareas de un solo usuario basado en directorios de niveles múltiples. Al salir del sistema de archivos, el sistema de archivos virtual debe guardar en el disco como un archivo para que pueda restaurarse al espacio de disco virtual en la memoria la próxima vez.
(2) La asignación del espacio de almacenamiento de archivos se puede realizar mediante asignación explícita de enlaces u otros métodos.
(3) Puede elegir diagramas de bits u otros métodos para administrar el espacio de disco gratuito. Si se usa Bitmap para administrar el espacio de almacenamiento de archivos y usar la asignación de enlaces explícito, entonces Bitmap se puede fusionar en grasa.
(4) La estructura del directorio de archivos adopta una estructura de directorio de niveles múltiples. Para simplificar, se pueden usar nodos de índice, cada elemento de directorio debe contener información como el nombre del archivo, la dirección física, la longitud, etc., y los archivos de lectura y escritura también pueden protegerse a través de elementos del directorio.
(5) Se requieren los siguientes comandos de operación: