La arquitectura de un procesador, como el usado en la tarjeta raspberry pi4b, soporta un conjunto de instrucciones, llamado: armv8-a. de este conjunto de instrucciones, hay un subconjunto llamado: legv8, el cual, esta más optimizado para procesamiento de 64 bits. Usaremos, este subconjunto, por ser un avance en la arquitectura de los procesadores ARM.

En la siguiente figura podemos observar los bloques del procesador usado en la tarjeta Raspberry Pi4B

 


| Clique na imagem para ampliar |

 

 

Podemos destacar la capacidad de ejecutar instrucciones para 32 y 64 bits. En este apartado veremos el subconjunto LEGv8, el cual esta mas optimizado para 64 bits. Observa la siguiente figura:

 


 

 

 

La arquitectura LEGv8 en la tarjeta Raspberry Pi4B, es basado en un subconjunto de instrucciones del conjunto de instrucciones: ARMv8-A. La siguiente figura muestra el simulador de instrucciones para este subconjunto (LEGv8):

 

 


| Clique na imagem para ampliar |

 

 

En el simulador, podemos notar: el editor de instrucciones, el conjunto de registros (X0, X27), los registros de uso especial (SP, FP, LR, XZR), donde podemos ver los resultados de las instrucciones y el camino que siguen los datos (datapath). La siguiente figura muestra el diagrama de la arquitectura LEGv8 de la tarjeta Raspberry Pi4B:

 


| Clique na imagem para ampliar |

 

 

Observemos como esta arquitectura tiene: Memoria de Instrucciones, Contador de Programa, Registros, Unidad Logica Aritmetica (ALU), Multiplexores, Memoria RAM, Logica de Control, Datos, Direcciones, Instrucciones, etc. La siguiente figura muestra las partes mas inportantes de la arquitectura LEGv8:

 

 


| Clique na imagem para ampliar |

 

 

Como visto en el capítulo anterior, el procesador de la Raspberry Pi4B, tiene un contador de programa (PC) para accesar la instrucción que se va a ejecutar. Este contador se incrementa en 4 por cada búsqueda o ciclo de reloj. Observa la siguiente imagen:

 


| Clique na imagem para ampliar |

 

 

Así, el contador de programa tiene la dirección de la “instrucción” que se está ejecutando. La memoria de instrucciones solo puede ser direccionada por el contador de programa. Esto asegura el correcto funcionamiento de acceso y búsqueda de instrucciones. Aunque existen algunos modos de direccionamiento a memoria, el contador de programa debe contener la dirección de la instrucción. Observa en la siguiente imagen, donde se ubica la dirección de la memoria de instrucciones:

 


 

 

 

Escribe este bloque de código y observemos lo que pasa en el camino de datos:

 


| Clique na imagem para ampliar |

 

 

Recuerde que es necesario ensamblar y ejecutar las instrucciones, presionando en los botones mostrados en la siguiente imagen:

 


| Clique na imagem para ampliar |

 

 

Al ejecutarse las instrucciones, el camino de datos, de la dirección de la “memoria de instrucciones”, sigue por el sumador mostrado en la siguiente imagen:

 


 

 

 

Esto se debe a que cada instrucción tiene un ancho de 32 bits y por eso es necesario el incremento de 4, en el sumador, para así, encontrar la dirección de la próxima instrucción que ejecutara el procesador. Entonces, de la memoria de instrucciones, leemos las instrucciones que se ejecutaran. Así, encontramos el concepto: “instrucción”, como mostrado en la siguiente imagen:

 


| Clique na imagem para ampliar |

 

 

Las instrucciones van a la entrada de un “decodificador de instrucciones”. Un decodificador, en electrónica digital, es un circuito con un número de entradas digitales y un numero de salidas digitales. De acuerdo a los valores colocados a la entrada del decodificador, se activarán algunas salidas. Observa la siguiente imagen:

 

 


| Clique na imagem para ampliar |

 

Como las instrucciones tienen un ancho de 32 bits, es posible, colocar ciertos valores en la instrucción, para seleccionar determinadas partes del procesador. Observa en la siguiente imagen, por ejemplo: los bits [4-0] seleccionan el registro destino (rd), los bits [9-5] seleccionan el registro fuente 1 (rs1), los bits [20-16] seleccionan el registro fuente 2 (rs2), los bits [31-21] contienen el “OpCode” de la instrucción. El OpCode es la parte que identifica la instrucción, siendo única para cada instrucción.

 


 

 

 

En la siguiente figura se resume el trabajo del decodificador de instrucciones. Aunque hay que tener en cuenta, que, dependiendo del tipo de instrucción, los bits de la instrucción tendrán informaciones referentes a esa instrucción. Por ejemplo: para una instrucción de movimiento de registros, la instrucción indicara: el registro fuente 1, el registro fuente 2 y el registro destino. Para una instrucción del salto, la instrucción contendrá la dirección a donde debe buscar la próxima instrucción.

 


| Clique na imagem para ampliar |

 

Aquí, entra el concepto: “Registros”. La arquitectura LEGv8 cuenta con 32 registros. La siguiente figura muestra como se seleccionan los registros en una instrucción:

 


| Clique na imagem para ampliar |

 

 

La siguiente figura muestra, los registros del procesador:

 


 

 

 

Hasta aquí, con un procesador como el mostrado en las figuras anteriores, podemos cargar datos en los registros y mover datos entre registros. Es momento de agregar lógica para hacer saltos incondicionales. En la siguiente figura, podemos notar como se puede usar una instrucción (OpCode) para hacer saltos en la memoria de instrucciones:

 


| Clique na imagem para ampliar |

 

 

Cuando una instrucción de salto es ejecutada, normalmente, se informa la cantidad de instrucciones, que es necesario saltar. Es importante notar que los saltos pueden ser hacia adelante o hacia atrás. Cuando los saltos son hacia adelante, el número de instrucciones a saltar es positivo. Cuando el salto es hacia atrás, el número de instrucciones a saltar es negativo. En ambos casos en necesario, hacer una multiplicación por 4. Esto se puede hacer, desplazando hacia la izquierda, el número de instrucciones a saltar. Es necesario usar un multiplexor, para seleccionar la dirección donde se ejecutará la próxima instrucción. Observa la siguiente figura:

 


| Clique na imagem para ampliar |

 

 

Escribe estas instrucciones en el editor y observemos la instrucción de salto incondicional:

 


 

 

 

Observa que cuando se ejecutan las tres primeras instrucciones, es usado el sumador de la parte superior del “datapath”, como se muestra en la siguiente imagen:

 


| Clique na imagem para ampliar |

 

 

Pero cuando es ejecutada la instrucción de salto incondicional, se usa el otro sumador para encontrar la dirección de la memoria de instrucciones. Observa esto en la siguiente figura:

 


| Clique na imagem para ampliar |

 

 

La instrucción que el simulador esta ejecutando, puede ser vista en la parte inferior del diagrama de camino de datos o “datapath”, como mostrado en la siguiente figura:

 


 

 

 

Si fuese agregada una: “Unidad Lógica Aritmética” (ALU), a la salida de datos de los registros, entonces, se pueden ejecutar instrucciones de este tipo. Observa en la siguiente figura, como fue colocada una ALU, a la salida de los registros:

 


| Clique na imagem para ampliar |

 

 

Cuando la ALU ejecute alguna operación, es posible saber si el resultado fue: “Cero”. Basado en esta información es posible realizar un salto condicional.

 


| Clique na imagem para ampliar |

 

 

Escribe en el editor de instrucciones, un programa como el siguiente:

 


| Clique na imagem para ampliar |

 

 

El programa carga el registro X1 con el valor: 10, el registro X2 con el valor: 10, después se ejecuta la instrucción de sustracción (SUB), entre los registros X2 y X1, dejando el resultado en el registro X2. Después, es ejecutada la instrucción: “CBZ”, la cual está verificando, si el registro X2, tiene el valor de cero. Caso esto sea verdadero, entonces saltar a la etiqueta: “rep_sub”. Podemos observar que la primera vez que se pasa por la instrucción de salto condicional, la verificación es verdadera, pero la segunda vez, no. Para ejecutar el programa, presione el botón: “Assemble” y después el botón: “Execute Instruction”. Observa en el “datapath”, como al ejecutarse la instrucción: “CBZ”, por la primera vez, la puerta lógica AND, tiene sus 2 entradas a nivel lógico alto:

 

 


 

 

 

La Unidad Lógica Aritmética, además de ejecutar instrucciones de este tipo, también da información de los resultados de las operaciones. Esto lo hace a través de unas banderas (flags), las cuales tienen los siguientes nombres: N, Z, C, V.

La bandera: “N”: indica si una operación dio negativo.

La bandera: “Z”: indica si una operación dio Cero.

La bandera: “C”: indica si una operación lleva un “1” (Carry).

La bandera: “V”: indica si una operación tuvo un desbordamiento (Overflop).

Observa en la siguiente imagen, que podemos hacer saltos condicionales, verificando el valor de estas banderas:

 


| Clique na imagem para ampliar |

 

 

La siguiente figura muestra las banderas de la ALU en el “datapath”:

 


 

 

 

La siguiente tabla muestra los tipos de condiciones que se pueden verificar en las banderas de la ALU:

 


| Clique na imagem para ampliar |

 

 

Con lo visto hasta aquí, es fácil entender como un lenguaje de alto nivel como Python o C++, puede interpretar código y convertirlo en lenguaje ensamblador. Vamos a crear un programa simple en Python.

El siguiente programa, crea una variable llamada: “k” y le asigna el valor: 10. Después, crea una variable: “j” y le asigna el valor: 10. Después, hace una resta (k-j), y el resultado lo almacena en la variable: “r”. Después, compara si el resultado es igual a cero. Si esto es verdadero, carga el valor: 4, en la variable: “r”. El programa en Python seria así:

 


 

 

 

Un interpretador que use el subconjunto de instrucciones LEGv8, podría generar el siguiente programa ensamblador:

 


 

 

 

Así, el interpretador de Python, asigno a:

X22, la variable: “k”

X23, la variable: “j”

X9, la variable: “r”

La instrucción: “CBNZ”, verifica si el valor en la variable: “r”, no es cero. Si es cero, entonces carga el registro: X9, con el valor: 4

 

 

Conclusión

La arquitectura de un procesador es fácil de entender, a medida que se practica con sus instrucciones. Para el caso de la Raspberry Pi4B, usamos el subconjunto de instrucciones LEGv8. El simulador LEGv8, permite escribir instrucciones en ensamblador y ver sus resultados en los registros. También, nos permite ver que caminos siguieron las instrucciones y los datos que estas manejan. En este apartado, tomamos los componentes más importantes del procesador. Mucho se puede explorar, más la “arquitectura de un procesador”, se puede entender y tener una mejor visión de la manera en que fue construida.

 

 

 

18.984MBMemory Usage40.18msRequest Duration
Joomla! Version5.2.3
PHP Version8.3.20
Identityguest
Response200
Templatecassiopeia
Database
Server
mysql
Version
10.5.22-MariaDB
Collation
latin1_swedish_ci
Conn Collation
utf8mb4_general_ci
$_GET
[]
$_POST
[]
$_SESSION
array:1 [ "joomla" => "***redacted***" ]
$_COOKIE
array:1 [ "c2123392c06423339225f3431360b7e6" => "8dgm72jshom3fs8j2j62kbp34g" ]
$_SERVER
array:52 [ "USER" => "apache" "HOME" => "/usr/share/httpd" "SCRIPT_NAME" => "/index.php" "RE...
session
array:3 [ "counter" => 3 "timer" => array:3 [ "start" => 1751772589 "last" => 1751772590...
registry
array:3 [ "data" => [] "initialized" => false "separator" => "." ]
user
array:21 [ "id" => 0 "name" => null "username" => null "email" => null "password" => "***r...
  • afterLoad (85.73KB) (321μs)
  • afterInitialise (1.14MB) (3.59ms)
  • afterRoute (179.16KB) (855μs)
  • beforeRenderComponent com_content (100.7KB) (426μs)
  • Before Access::preloadComponents (all components) (33.45KB) (206μs)
  • After Access::preloadComponents (all components) (107.06KB) (356μs)
  • Before Access::preloadPermissions (com_content) (1.57KB) (7μs)
  • After Access::preloadPermissions (com_content) (16.22MB) (20.12ms)
  • Before Access::getAssetRules (id:26972 name:com_content.article.30613) (514.65KB) (809μs)
  • After Access::getAssetRules (id:26972 name:com_content.article.30613) (7.38KB) (33μs)
  • afterRenderComponent com_content (442.16KB) (6.09ms)
  • afterDispatch (2.25KB) (50μs)
  • beforeRenderRawModule mod_articles_category (Banco de Circuitos) (358.44KB) (1.57ms)
  • afterRenderRawModule mod_articles_category (Banco de Circuitos) (79.43KB) (323μs)
  • beforeRenderRawModule mod_finder (Busca_inteligente) (5.9KB) (88μs)
  • afterRenderRawModule mod_finder (Busca_inteligente) (64.9KB) (1.09ms)
  • beforeRenderModule mod_articles_category (Banco de Circuitos) (9.27KB) (550μs)
  • afterRenderModule mod_articles_category (Banco de Circuitos) (5.47KB) (68μs)
  • beforeRenderModule mod_finder (Busca_inteligente) (6.64KB) (179μs)
  • afterRenderModule mod_finder (Busca_inteligente) (4.75KB) (46μs)
  • afterRender (281.75KB) (3.29ms)
  • 1 x After Access::preloadPermissions (com_content) (16.22MB) (50.07%)
    20.12ms
    1 x afterRenderComponent com_content (442.16KB) (15.16%)
    6.09ms
    1 x afterInitialise (1.14MB) (8.94%)
    3.59ms
    1 x afterRender (281.75KB) (8.18%)
    3.29ms
    1 x beforeRenderRawModule mod_articles_category (Banco de Circuitos) (358.44KB) (3.92%)
    1.57ms
    1 x afterRenderRawModule mod_finder (Busca_inteligente) (64.9KB) (2.7%)
    1.09ms
    1 x afterRoute (179.16KB) (2.13%)
    855μs
    1 x Before Access::getAssetRules (id:26972 name:com_content.article.30613) (514.65KB) (2.01%)
    809μs
    1 x beforeRenderModule mod_articles_category (Banco de Circuitos) (9.27KB) (1.37%)
    550μs
    1 x beforeRenderComponent com_content (100.7KB) (1.06%)
    426μs
    1 x After Access::preloadComponents (all components) (107.06KB) (0.89%)
    356μs
    1 x afterRenderRawModule mod_articles_category (Banco de Circuitos) (79.43KB) (0.8%)
    323μs
    1 x afterLoad (85.73KB) (0.8%)
    321μs
    1 x Before Access::preloadComponents (all components) (33.45KB) (0.51%)
    206μs
    1 x beforeRenderModule mod_finder (Busca_inteligente) (6.64KB) (0.44%)
    179μs
    1 x beforeRenderRawModule mod_finder (Busca_inteligente) (5.9KB) (0.22%)
    88μs
    1 x afterRenderModule mod_articles_category (Banco de Circuitos) (5.47KB) (0.17%)
    68μs
    1 x afterDispatch (2.25KB) (0.12%)
    50μs
    1 x afterRenderModule mod_finder (Busca_inteligente) (4.75KB) (0.11%)
    46μs
    1 x After Access::getAssetRules (id:26972 name:com_content.article.30613) (7.38KB) (0.08%)
    33μs
    1 x Before Access::preloadPermissions (com_content) (1.57KB) (0.02%)
    7μs
21 statements were executed, 5 of which were duplicates, 16 unique10.72ms1.64MB
  • SELECT @@SESSION.sql_mode;31μs968B/libraries/src/Session/MetadataManager.php:184Copy
  • SELECT `session_id` FROM `incbmx_session` WHERE `session_id` = :session_id LIMIT 160μs1.31KBParams/libraries/src/Session/MetadataManager.php:187Copy
  • UPDATE `incbmx_session` SET `guest` = :guest , `time` = :time , `userid` = :user_id , `username` = :username , `client_id` = :client_id WHERE `session_id` = :session_id55μs992BParams/libraries/src/Session/MetadataManager.php:316Copy
  • SELECT `id`,`rules` FROM `incbmx_viewlevels`52μs608B/libraries/src/Access/Access.php:955Copy
  • SELECT `b`.`id` FROM `incbmx_usergroups` AS `a` LEFT JOIN `incbmx_usergroups` AS `b` ON `b`.`lft` <= `a`.`lft` AND `b`.`rgt` >= `a`.`rgt` WHERE `a`.`id` = :guest66μs1.64KBParams/libraries/src/Access/Access.php:868Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `incbmx_categories` AS `s` INNER JOIN `incbmx_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`222μs20.2KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT `id`,`name`,`rules`,`parent_id` FROM `incbmx_assets` WHERE `name` IN (:preparedArray1,:preparedArray2,:preparedArray3,:preparedArray4,:preparedArray5,:preparedArray6,:preparedArray7,:preparedArray8,:preparedArray9,:preparedArray10,:preparedArray11,:preparedArray12,:preparedArray13,:preparedArray14,:preparedArray15,:preparedArray16,:preparedArray17,:preparedArray18,:preparedArray19,:preparedArray20,:preparedArray21,:preparedArray22,:preparedArray23,:preparedArray24,:preparedArray25,:preparedArray26,:preparedArray27,:preparedArray28,:preparedArray29,:preparedArray30,:preparedArray31,:preparedArray32,:preparedArray33,:preparedArray34,:preparedArray35,:preparedArray36,:preparedArray37,:preparedArray38,:preparedArray39)211μs7.44KBParams/libraries/src/Access/Access.php:357Copy
  • SELECT `id`,`name`,`rules`,`parent_id` FROM `incbmx_assets` WHERE `name` LIKE :asset OR `name` = :extension OR `parent_id` = 07.7ms1.48MBParams/libraries/src/Access/Access.php:301Copy
  • SHOW FULL COLUMNS FROM `incbmx_content`340μs2.39KB/libraries/vendor/joomla/database/src/Mysqli/MysqliDriver.php:587Copy
  • UPDATE `incbmx_content` SET `hits` = (`hits` + 1) WHERE `id` = '30613'192μs48B/libraries/src/Table/Table.php:1348Copy
  • SELECT `a`.`id`,`a`.`asset_id`,`a`.`title`,`a`.`alias`,`a`.`introtext`,`a`.`fulltext`,`a`.`state`,`a`.`catid`,`a`.`created`,`a`.`created_by`,`a`.`created_by_alias`,`a`.`modified`,`a`.`modified_by`,`a`.`checked_out`,`a`.`checked_out_time`,`a`.`publish_up`,`a`.`publish_down`,`a`.`images`,`a`.`urls`,`a`.`attribs`,`a`.`version`,`a`.`ordering`,`a`.`metakey`,`a`.`metadesc`,`a`.`access`,`a`.`hits`,`a`.`metadata`,`a`.`featured`,`a`.`language`,`fp`.`featured_up`,`fp`.`featured_down`,`c`.`title` AS `category_title`,`c`.`alias` AS `category_alias`,`c`.`access` AS `category_access`,`c`.`language` AS `category_language`,`fp`.`ordering`,`u`.`name` AS `author`,`parent`.`title` AS `parent_title`,`parent`.`id` AS `parent_id`,`parent`.`path` AS `parent_route`,`parent`.`alias` AS `parent_alias`,`parent`.`language` AS `parent_language`,ROUND(`v`.`rating_sum` / `v`.`rating_count`, 1) AS `rating`,`v`.`rating_count` AS `rating_count` FROM `incbmx_content` AS `a` INNER JOIN `incbmx_categories` AS `c` ON `c`.`id` = `a`.`catid` LEFT JOIN `incbmx_content_frontpage` AS `fp` ON `fp`.`content_id` = `a`.`id` LEFT JOIN `incbmx_users` AS `u` ON `u`.`id` = `a`.`created_by` LEFT JOIN `incbmx_categories` AS `parent` ON `parent`.`id` = `c`.`parent_id` LEFT JOIN `incbmx_content_rating` AS `v` ON `a`.`id` = `v`.`content_id` WHERE ( (`a`.`id` = :pk AND `c`.`published` > 0) AND (`a`.`publish_up` IS NULL OR `a`.`publish_up` <= :publishUp)) AND (`a`.`publish_down` IS NULL OR `a`.`publish_down` >= :publishDown) AND `a`.`state` IN (:preparedArray1,:preparedArray2)160μs54.13KBParams/components/com_content/src/Model/ArticleModel.php:215Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `incbmx_categories` AS `s` INNER JOIN `incbmx_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`access` IN (:preparedArray1,:preparedArray2) AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`174μs3.92KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT `m`.`tag_id`,`t`.* FROM `incbmx_contentitem_tag_map` AS `m` INNER JOIN `incbmx_tags` AS `t` ON `m`.`tag_id` = `t`.`id` WHERE `m`.`type_alias` = :contentType AND `m`.`content_item_id` = :id AND `t`.`published` = 1 AND `t`.`access` IN (:preparedArray1,:preparedArray2)225μs3.98KBParams/libraries/src/Helper/TagsHelper.php:388Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `incbmx_categories` AS `s` INNER JOIN `incbmx_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`access` IN (:preparedArray1,:preparedArray2) AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`165μs3.92KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT DISTINCT a.id, a.title, a.name, a.checked_out, a.checked_out_time, a.note, a.state, a.access, a.created_time, a.created_user_id, a.ordering, a.language, a.fieldparams, a.params, a.type, a.default_value, a.context, a.group_id, a.label, a.description, a.required, a.only_use_in_subform,l.title AS language_title, l.image AS language_image,uc.name AS editor,ag.title AS access_level,ua.name AS author_name,g.title AS group_title, g.access as group_access, g.state AS group_state, g.note as group_note FROM incbmx_fields AS a LEFT JOIN `incbmx_languages` AS l ON l.lang_code = a.language LEFT JOIN incbmx_users AS uc ON uc.id=a.checked_out LEFT JOIN incbmx_viewlevels AS ag ON ag.id = a.access LEFT JOIN incbmx_users AS ua ON ua.id = a.created_user_id LEFT JOIN incbmx_fields_groups AS g ON g.id = a.group_id LEFT JOIN `incbmx_fields_categories` AS fc ON fc.field_id = a.id WHERE ( (`a`.`context` = :context AND (`fc`.`category_id` IS NULL OR `fc`.`category_id` IN (:preparedArray1,:preparedArray2,:preparedArray3)) AND `a`.`access` IN (:preparedArray4,:preparedArray5)) AND (`a`.`group_id` = 0 OR `g`.`access` IN (:preparedArray6,:preparedArray7)) AND `a`.`state` = :state) AND (`a`.`group_id` = 0 OR `g`.`state` = :gstate) AND `a`.`only_use_in_subform` = :only_use_in_subform ORDER BY a.ordering ASC376μs4.81KBParams/libraries/src/MVC/Model/BaseDatabaseModel.php:164Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `incbmx_categories` AS `s` INNER JOIN `incbmx_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`access` IN (:preparedArray1,:preparedArray2) AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`184μs3.92KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT `name`,`element` FROM `incbmx_extensions` WHERE `type` = 'plugin' AND `folder` = 'finder' AND `enabled` = 1137μs1.89KB/administrator/components/com_finder/src/Helper/LanguageHelper.php:135Copy
  • SELECT `title` FROM `incbmx_finder_taxonomy` WHERE `parent_id` = 1 AND `state` = 1 AND `access` IN (1,5)79μs648B/administrator/components/com_finder/src/Indexer/Taxonomy.php:325Copy
  • SELECT * FROM `incbmx_schemaorg` WHERE `itemId` = :itemId AND `context` = :context67μs1.55KBParams/plugins/system/schemaorg/src/Extension/Schemaorg.php:403Copy
  • SELECT `a`.`id`,`a`.`asset_id`,`a`.`title`,`a`.`alias`,`a`.`introtext`,`a`.`fulltext`,`a`.`state`,`a`.`catid`,`a`.`created`,`a`.`created_by`,`a`.`created_by_alias`,`a`.`modified`,`a`.`modified_by`,`a`.`checked_out`,`a`.`checked_out_time`,`a`.`publish_up`,`a`.`publish_down`,`a`.`images`,`a`.`urls`,`a`.`attribs`,`a`.`version`,`a`.`ordering`,`a`.`metakey`,`a`.`metadesc`,`a`.`access`,`a`.`hits`,`a`.`metadata`,`a`.`featured`,`a`.`language`,`fp`.`featured_up`,`fp`.`featured_down`,`c`.`title` AS `category_title`,`c`.`alias` AS `category_alias`,`c`.`access` AS `category_access`,`c`.`language` AS `category_language`,`fp`.`ordering`,`u`.`name` AS `author`,`parent`.`title` AS `parent_title`,`parent`.`id` AS `parent_id`,`parent`.`path` AS `parent_route`,`parent`.`alias` AS `parent_alias`,`parent`.`language` AS `parent_language`,ROUND(`v`.`rating_sum` / `v`.`rating_count`, 1) AS `rating`,`v`.`rating_count` AS `rating_count` FROM `incbmx_content` AS `a` INNER JOIN `incbmx_categories` AS `c` ON `c`.`id` = `a`.`catid` LEFT JOIN `incbmx_content_frontpage` AS `fp` ON `fp`.`content_id` = `a`.`id` LEFT JOIN `incbmx_users` AS `u` ON `u`.`id` = `a`.`created_by` LEFT JOIN `incbmx_categories` AS `parent` ON `parent`.`id` = `c`.`parent_id` LEFT JOIN `incbmx_content_rating` AS `v` ON `a`.`id` = `v`.`content_id` WHERE ( (`a`.`id` = :pk AND `c`.`published` > 0) AND (`a`.`publish_up` IS NULL OR `a`.`publish_up` <= :publishUp)) AND (`a`.`publish_down` IS NULL OR `a`.`publish_down` >= :publishDown) AND `a`.`state` IN (:preparedArray1,:preparedArray2)156μs54.17KBParams/components/com_content/src/Model/ArticleModel.php:215Copy
  • SELECT SUM(CASE WHEN `a`.`next_execution` <= :now THEN 1 ELSE 0 END) AS due_count,SUM(CASE WHEN `a`.`locked` IS NULL THEN 0 ELSE 1 END) AS locked_count FROM `incbmx_scheduler_tasks` AS `a` WHERE `a`.`state` = 174μs1.37KBParams/administrator/components/com_scheduler/src/Model/TasksModel.php:465Copy