Just perform this function in your head:
function understand_codeigniter()
{
$index = include('index.php');
for ( $line = 1; ! end_of_codeigniter($line); $line++ )
{
read_and_understand_line($index[$line]);
}
}
function read_and_understand_line($line)
{
if ( $other_file = line_mentions_other_file($line) )
{
open($other_file);
for ( $line = 1; ! end_of_codeigniter($line); $line++ )
{
read_and_understand_line($other_file[$line]);
}
}
}
function line_mentions_other_file($line)
{
$matches = array();
if ( regexp('(include|require)((\_once)?\(.+\))', $line, $matches) )
{
return $matches[0];
}
return FALSE;
}
It’s a mixture of PHP and abstract programming language. You’d better not execute that, it will not work.
But in other words: You want to understand CI? Then open index.php and read and understand every single line of it. Wherever index.php mentions another file, open this file and read and understand it. Do this until either you fully understood CI or you’re at the end of files to look at. If the latter happens first, you should start all over again 
Sounds harsh, but that’s how I learned CI and what a lot of other people answer for the same question. The best tutorial can only teach you how to use CI, but to understand CI you need to look at the source - which fortunately is open-source 