the return from strace tells you the sequence that happens, simply analyze what it tells you and each step leads to the next.
For example, the first line returned from your "strace ls -a" (on my system) is
Code:
execve("/usr/bin/ls", ["ls", "-a"], 0x7ffd9a4e7948 /* 99 vars */) = 0
which says that the shell calls execve to create the subshell and execute "/usr/bin/ls" (within that sub-shell) with the parameters "ls" and "-a" as $0 and $1, the 0x.... is the memory address to use, the /* ... */ is a comment, and the final "= 0" says it was successful
The remainder of the return is what is done inside the ls command, including the multiple write(....) statements that return the results back to the original shell (your terminal window).