Está en la página 1de 12

Implementación APIs en SO

POSIX & SUS

Miguel Pajares Hernández Antonio Pérez Morales


Escuela Politécnica Superior Escuela Politécnica Superior
Universidad Francisco de Vitoria Universidad Francisco de Vitoria
Pozuelo de Alarcón, Madrid Pozuelo de Alarcón, Madrid
miguel.pajares@outlook.com antonio.pemo@hotmail.com

Abstract—Para poder profundizar en como los conjunto de controladores que proporcionan


sistemas operativos basados en el kernel de Linux, vamos comunicación entre el hardware y la capa
a hacer una introducción a cómo funciona la API y ABI
software que se asienta por encima de él.
de Linux, y como el estándar de C y POSIX han
posibilitado el soporte de programas en muchos sistemas
operativos suficientemente diferentes sin ningún tipo de
incompatibilidad de programas.

Keywords—kernel; Linux; UNIX; POSIX;


programming; API; ABI; C; C++; shell.

I. DEFINICIÓN Y ALCANCE DEL PROYECTO

Ilustración 1: En el anexo podrá encontrar un


En este trabajo, vamos a comenzar introduciendo los diagrama más completo)
conceptos de API, ABI y como Linux gestiona estos
sistemas con el estándar de la IEEE POSIX del que
hablaremos más adelante. • API: Application Programming Interface.
Para comenzar vamos a definir algunos términos que Como su nombre indica, se trata de una
son importantes: interfaz de Programación. Esto es lo que
proporciona unas formas de comunicación
• LINUX: Linux hace referencia generalmente
entre el kernel y el SO previamente definidas,
a los sistemas operativos que se construyen
que permite la programación de una forma
encima del kernel, que es lo que se llama
mucho más rápida, puesto que no hace falta
realmente Linux. Este kernel, o núcleo,
crear esa comunicación cada vez que se
explicándolo de forma simplificada, es un
intenta acceder a características de niveles fragmentos o llamadas cortas, pues todo el código por
más bajos del SW. Un ejemplo puede ser la seguridad no se puede ejecutar en el kernel. Cada
API que dibuja en pantalla, pues abstrae una arquitectura define una forma de acceso diferente,
información y la dibuja en pantalla o la más pero el i386 se hace mediante la instrucción int con el
conocida Standard I/O conocida como valor 0x80, que es un wrapper para la función de
<stdio.h> en C. system call.

• ABI: Application Binary Interface: Al igual Las librerías de C, como ‘stdio’ son una de las partes
que la API permite el acceso desde el propio principales en la programación en kernel de Linux
código de alto nivel, la ABI permite el acceso que dan acceso a servicios de núcleo. La más
a rutinas y a estructuras de datos desde un conocida es glibc, que aparte de implementar la
código de tan bajo nivel como es el binario. librería estándar de C, también proporciona wrappers
Un código compilado en API asegura para llamadas del sistema, soporte para acceso a hilos
compatibilidad, mientras que uno en ABI y acceso a memorias.
puede ser compatible directamente sin tener El compilador de C, en Linux conocido como GNU
que ser recompilado con otro sistema que Compiler Collection, gcc, que ayuda a implementar
comparta ABI y librerías. los estándares de C y las ABIs del sistema

II. HISTORIA

En los años 80, la gran variedad de sistemas Unix


quería ser estandarizado por Richard Stallman,
fundador del movimiento Free Software y parte del
IEEE (Instituto de Ingenieros Eléctricos y
Electrónicos), sugiriendo que se llamara POSIX,
Portable Operating System Interface.
Desde entonces se ha ido evolucionando el estándar,
Ilustración 2: Diferencias API vs ABI En el anexo quedando dividido en diferentes versiones: POSIX.1,
podrá encontrar un diagrama más completo)
POSIX.1b, POSIX.1c, POSIX.2. De acuerdo con
Wikipedia [1], cada uno incluyen lo siguiente:
• POSIX.1: Servicios de núcleo, implementa
llamadas de C estándar, como señales,
En Linux se encuentran tres componentes
creación y control de procesos, excepciones,
principales: “System calls”, “Librerias C” y
operaciones de ficheros y directorios, tuberías
“Compilador C”
y operaciones i/o.
Las llamadas al sistema dan una forma al código del
usuario de ejecutarse en el modo de kernel a través de
• POSIX.1b: Extensiones para tiempo real, - obtención de más operaciones sobre
señales, temporizadores, semáforos, shared archivos como: mkdir, dirname, symlink,
memory, bloqueos de memoria y i/o síncrona readlink, hardlinks, poll, sync
y asíncrona.
- procesos e hilos nuevos como: fork, execl,
• POSIX.1c: Exteniones para hilos o threads.
pipe, emáforos, memoria compartida, kill y
• POSIX.2: Shell y comandos. parámetros de programación

- networking
Sin embargo, POSIX y la IEEE tenían un problema y
es que eran de pago. Por tanto, el Open Group
- regular expressions
(consorcion de la industria en favor del software
libre) desarrolló la Single UNIX Specification,
- Gestión avanzada de memoria: mmap,
conocida por sus siglas SUS, que se hizo rápidamente
mlock, mprotect y madvise
famoso por ser libre. Hoy en día, POSIX se encuentra
incluido en SUS, cuya última versión data del año
Estas APIs tamién determinan los conceptos
2008.
subyacentes del sistema del que dependen. Hay
muchas llamadas a Linux para implementar alguna
III. ESTADO DEL ARTE función API Posix C específica y cumplir con los
procesos Linux como sys_write, sys_read,...
La relevancia de POSIX en la actualidad es total. La
capacidad que tiene de ofrecer una mayor facilidad
para el desarrollo y porteado de las aplicaciones. Las 2. Utilidades CLI
interfaces son ampliamente implementadas y
referenciadas en otros intentos de estandarización, Como por ejemplo los comandos: cd, ls, echo, etc.
pues es la norma que seguir. De hecho, en desarrollos Muchas de estas utilidades son interfaces directas del
actuales de sistemas empotrados, dispositivos shell para una función de la API C correspondiente.
móviles Android, dispositivos de red (routers),
servidores y Workstation, hasta supercomputadores. También tenemos importantes implementaciones
sobre lo que es el escritorio en Linux, como GNU
Coreutils para proyectos pequeños y la
A. POSIX 4.2 define: implementación de utilidades CLI integradas con el
Bash.
1. C API

Amplía enormemente ANSI C con cosas como: 3. Lenguaje Shell

Introducciones principal del GNU Bash.


8. Nombres de archivos

4. Variables del entorno - '/' lo utilizaremos como el separador de ruta

Nuevas rutas como: HOME y PATH - NUL no podrá ser utilizado

- '.' será cwd y '..' su padre


5. Estado de las salidas del programa
- Para el nombre de los archivos que puedan ser
ANSI C nos devolverá EXIT_SUCCESS para los portales tenemos:
éxitos, EXIT_FAILURE en caso de fracaco y la
definición del resto de la implementación la dejará - solo podrán utilizar 14 caracteres como máximo
definida añadiendo: y 256 para la ruta completa.

126: comando encontrado pero no puede ser - solo podrá contener caracteres como: a-zA-Z0-
ejecutado 9 ._-
127: comando no encontrado
128: comando terminado por una señal
9. Utilidades de la línea de comandos usadas de
forma convencional por la API
6. Expresiones regulares
Por ejemplo, podemos destacar:
Tenemos dos tipos: BRE(Básico) y ERE(extendido).
La primera actualmente se encuentra en desuso y - '-' significa donde se debe esperar un
solo es mantenida dentro de la API. archivo.

Estas expresiones son implementadas por funciones - '--' usado como fin de los flags.
de la API C y usadas por medio de las utilidades de
CLI como grep
Esto se encuentra implementado en los sistemas
actuales basados en Unix, donde gran parte de las
7. Estructura de directorios funciones aquí mencionadas son parte esencial del
comportamiento básico del sistema, sobre todo del
POSIX es ampliado enormemente por medio de Shell de comandos, herramienta principal para
Linux FHS. cualquier programador y desarrollador de la
Por ejemplo: /dev, /tmp, /null, etc plataforma para los que las APIs del sistema son
esenciales pues les facilitan el empleo de estas
herramientas.
UnixWare SkyOS
Compatibilidad de POSIX en distintos SSOO

Syllable
VelOSity
Mayoritariamente
Totalmente compatibles
compatibles (no
(de forma oficial) VxWorks Windows
certificados oficialmente)

A/AUX BeOS

AIX FreeBSD

BSD/OS GNU/Linux

HP-UX Contiki

INTEGRITY NetBSD

IRIX Nucleus RTOS

LynxOS OpenBSD

MAC OS X OpenSolaris

MINIX PikeOS

MPE/iXa RTOS

Solaris RTEMS

Unison RTOS Sanos


IV. EJEMPLO DESARROLLO PRÁCTICO

Aquí podemos apreciar un ejemplo en pseudocódigo de una API de Linux la cual es una rutina que se encarga
de realizar manipulaciones de cadenas de strings. Es una implementación de los estándares de C en la librería
string.h:

Description:
Here are some standard string manipulation functions:

{To determine if the character is a digit.}


function IsDigit(ch: char): boolean;
begin
Result := ch in ['0'..'9'];
end;

{To determine if the character is an uppercase letter.}


function IsUpper(ch: char): boolean;
begin
Result := ch in ['A'..'Z'];
end;

{To determine if the character is an lowercase letter.}


function IsLower(ch: char): boolean;
begin
Result := ch in ['a'..'z'];
end;

{Changes a character to an uppercase letter.}


function ToUpper(ch: char): char;
begin
Result := chr(ord(ch) and $DF);
end;

{Changes a character to a lowercase letter.}


function ToLower(ch: char): char;
begin
Result := chr(ord(ch) or $20);
end;

{ Capitalizes first letter of every word in s }


function Proper(const s: string): string;
var
i: Integer;
CapitalizeNextLetter: Boolean;
begin
Result := LowerCase(s);
CapitalizeNextLetter := True;
for i := 1 to Length(Result) do
begin
if CapitalizeNextLetter and IsLower(Result[i]) then
Result[i] := ToUpper(Result[i]);
CapitalizeNextLetter := Result[i] = ' ';
end;
end;

{ NOTE: The following functions are available in Delphi 2.0,


but not in Delphi 1.0. }

{Supresses trailing blanks in a string.}


function TrimRight(const s: string): string;
var
i: integer;
begin
i := Length(s);
while (I > 0) and (s[i] <= ' ') do Dec(i);
Result := Copy(s, 1, i);
end;

{Removes the leading spaces from a string.}


function TrimLeft(const S: string): string;
var
I, L: Integer;
begin
L := Length(S);
I := 1;
while (I <= L) and (S[I] <= ' ') do Inc(I);
Result := Copy(S, I, Maxint);
end;

{ Removes leading and trailing whitespace from s);


function Trim(const S: string): string;
var
I, L: Integer;
begin
L := Length(S);
I := 1;
while (I <= L) and (S[I] <= ' ') do Inc(I);
if I > L then Result := '' else
begin
while S[L] <= ' ' do Dec(L);
Result := Copy(S, I, L - I + 1);
end;
end;
V. CONCLUSIONES VI. BIBLIOGRAFÍA

El desarrollo actual de software para Sistemas Operativos le


[1] Anónimo, «WIkipedia POSIX,» [En línea]. Available:
debe en gran medida su tamaño a Linux y la cantidad de
https://es.wikipedia.org/wiki/POSIX.
innovaciones que ha puesto sobre la mesa y sobre las que se
han construido estos sólidos cimientos. Una vez más [2] C. Santilini, «stackexchange,» [En línea]. Available:
podemos observar la importancia de estandarizar procesos a https://unix.stackexchange.com/questions/11983/what-
la hora de extender el empleo generalizado de tus exactly-is-posix/220877.
herramientas, y el estándar POSIX de la IEEE y el SUS de [3] A. Josey, «opengroup,» [En línea]. Available:
la Open Group son dos grandes ejemplos de ello. https://www.opengroup.org/austin/papers/posix-
paper1.txt .
En la investigación que hemos llevado a cabo hemos [4] R. Lerner, «Linux Journal,» [En línea]. Available:
comprendido muchos de los procesos que se nos enseñaron https://www.linuxjournal.com/content/apis .
en la asignatura de Sistemas Operativos I, en los que a
[5] Anónimo, «Kernel,» [En línea]. Available:
primera vista la consola parecía algo del pasado, pero como
https://www.kernel.org/doc/htmldocs/kernel-api/ .
hemos podido comprobar el empleo que hace de las
[6] Anónimo, «Wikipedia,» [En línea]. Available:
herramientas disponibles en materia de APIs y ABIs es
https://en.wikipedia.org/wiki/Linux_kernel_interfaces .
importante, proporcionando no solo ejemplo para otros
sistemas, sino que la extensa documentación y la facilidad [7] R. Love, System Programming, O'Reilly.
para introducirse en este mundo ha facilitado que se pueda
llegar a comprender este tipo de conceptos abstractos de una
forma mucho mas accesible al público en general.

Para terminar, nos gustaría recalcar las facilidades que


proporcionan las interfaces de programación. Pues la época
de programación en ensamblador y mucho menos en binario,
y las APIs, no solo de SO, sino de gran cantidad de software
actual en todos los ámbitos de la informática.
VII. ANEXOS

También podría gustarte