当前位置:网站首页>Executable program execution process
Executable program execution process
2022-04-23 05:26:00 【Life needs depth】
./hello_world This order is in linux How to execute in the kernel system . File system usage busybox, Corresponding linux Kernel call procedure .
busybox in shell Parse command line
int ash_main(int argc, char **argv)
{
state4: /* XXX ??? - why isn't this before the "if" statement */
cmdloop(1);
}
static int
cmdloop(int top)
{
union node *n;
struct stackmark smark;
int inter;
int numeof = 0;
printf("1. cmdloop\n");
TRACE(("cmdloop(%d) called\n", top));
for (;;) {
} else if (nflag == 0) {
/* job_warning can only be 2,1,0. Here 2->1, 1/0->0 */
printf("3. cmdloop\n");
job_warning >>= 1;
numeof = 0;
evaltree(n, 0);
printf("4. cmdloop\n");
}
}
static void
evaltree(union node *n, int flags)
{
int checkexit = 0;
void (*evalfn)(union node *, int);
unsigned isor;
int status;
if (n == NULL) {
TRACE(("evaltree(NULL) called\n"));
goto out;
}
case NCMD:
evalfn = evalcommand;
printf("2. evaltree ncmd switch\n");
checkexit:
if (eflag && !(flags & EV_TESTED))
checkexit = ~0;
goto calleval;
calleval:
evalfn(n, flags);
break;
}
}
static void
evalcommand(union node *cmd, int flags)
{
static const struct builtincmd bltin = {
"\0\0", bltincmd
};
struct stackmark smark;
/* Execute the command. */
switch (cmdentry.cmdtype) {
default:
printf("2. cmdentry.cmdtype default.\n");
/* Fork off a child process if necessary. */
if (!(flags & EV_EXIT) || trap[0]) {
INT_OFF;
jp = makejob(cmd, 1);
if (forkshell(jp, cmd, FORK_FG) != 0) {
exitstatus = waitforjob(jp);
INT_ON;
break;
}
printf("3. cmdentry.cmdtype forkshell.\n");
FORCE_INT_ON;
}
listsetvar(varlist.list, VEXPORT|VSTACK);
shellexec(argv, path, cmdentry.u.index);
/* NOTREACHED */
}
Two system calls will be called during command execution forkshell and shellexec, adopt shellexec Take system calls for example
static void
shellexec(char **argv, const char *path, int idx)
{
char *cmdname;
int e;
char **envp;
int exerrno;
clearredir(1);
envp = environment();
if (strchr(argv[0], '/')
#if ENABLE_FEATURE_SH_STANDALONE
|| find_applet_by_name(argv[0])
#endif
) {
tryexec(argv[0], argv, envp);
e = errno;
} else {
e = ENOENT;
while ((cmdname = padvance(&path, argv[0])) != NULL) {
if (--idx < 0 && pathopt == NULL) {
tryexec(cmdname, argv, envp);
if (errno != ENOENT && errno != ENOTDIR)
e = errno;
}
stunalloc(cmdname);
}
}
}
static void
tryexec(char *cmd, char **argv, char **envp)
{
int repeated = 0;
repeat:
#ifdef SYSV
do {
execve(cmd, argv, envp);
} while (errno == EINTR);
#else
execve(cmd, argv, envp);
#endif
}
execve The function is gcc The library file provided by the compilation tool realizes glibc-2.3.6/sysdeps/unix/sysv/linux/execve.c In the definition of
int
__execve (file, argv, envp)
const char *file;
char *const argv[];
char *const envp[];
{
#if __BOUNDED_POINTERS__
{
char *const *v;
int i;
char *__unbounded *__unbounded ubp_argv;
char *__unbounded *__unbounded ubp_envp;
char *__unbounded *__unbounded ubp_v;
for (v = argv; *v; v++)
;
i = v - argv + 1;
ubp_argv = (char *__unbounded *__unbounded) alloca (sizeof (*ubp_argv) * i);
for (v = argv, ubp_v = ubp_argv; --i; v++, ubp_v++)
*ubp_v = CHECK_STRING (*v);
*ubp_v = 0;
for (v = envp; *v; v++)
;
i = v - envp + 1;
ubp_envp = (char *__unbounded *__unbounded) alloca (sizeof (*ubp_envp) * i);
for (v = envp, ubp_v = ubp_envp; --i; v++, ubp_v++)
*ubp_v = CHECK_STRING (*v);
*ubp_v = 0;
return INLINE_SYSCALL (execve, 3, CHECK_STRING (file), ubp_argv, ubp_envp);
}
#else
return INLINE_SYSCALL (execve, 3, file, argv, envp);
#endif
}
weak_alias (__execve, execve)
Finally call to INLINE_SYSCALL Macro in header file glibc-2.3.6/sysdeps/unix/sysv/linux/arm/sysdep.h To realize
/* Define a macro which expands into the inline wrapper code for a system
call. */
#undef INLINE_SYSCALL
#define INLINE_SYSCALL(name, nr, args...) \
({ unsigned int _sys_result = INTERNAL_SYSCALL (name, , nr, args); \
if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (_sys_result, ), 0)) \
{ \
__set_errno (INTERNAL_SYSCALL_ERRNO (_sys_result, )); \
_sys_result = (unsigned int) -1; \
} \
(int) _sys_result; })
#undef INTERNAL_SYSCALL_DECL
#define INTERNAL_SYSCALL_DECL(err) do { } while (0)
#undef INTERNAL_SYSCALL
#define INTERNAL_SYSCALL(name, err, nr, args...) \
({ unsigned int _sys_result; \
{ \
register int _a1 asm ("a1"); \
LOAD_ARGS_##nr (args) \
asm volatile ("swi %1 @ syscall " #name \
: "=r" (_a1) \
: "i" (SYS_ify(name)) ASM_ARGS_##nr \
: "memory"); \
_sys_result = _a1; \
} \
(int) _sys_result; })
Will eventually be called to arm Of switch The instruction enters the soft interrupt and is transferred to the operating system interrupt processing for processing .
版权声明
本文为[Life needs depth]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/04/202204230525501380.html
边栏推荐
- 【openh264】cmake: msopenh264-static
- Laravel routing settings
- Semi synchronous replication of MariaDB
- How to add beautiful code blocks in word | a very complete method to sort out and compare
- Requirements for SQL server to retrieve SQL and user information
- 4 most common automated test challenges and Countermeasures
- CPT 104_ TTL 09
- Knowledge of egg testing -- mock, Supertest, coffee
- egg中的多进程模型--egg文档搬运工
- Study notes: unity customsrp-12-hdr
猜你喜欢
Branch and loop statements
Double click The jar package cannot run the solution
What are the most popular recruitment technical skills in 2022? You can't think of it
Publish your own wheel - pypi packaging upload practice
How to set the initial value of El input number to null
Basic use of sqlyog
SQLyog的基本使用
Basic knowledge of redis
Necessity of selenium preloading cookies
Source code analysis of how to use jump table in redis
随机推荐
Multi process model in egg -- egg document Porter
如果我是pm之 演出电影vr购票展示
Project manager's thinking mode worth trying: project success equation
Graphics. Fromimage reports an error "graphics object cannot be created from an image that has an indexed pixel..."
2021 年 25 大 DevOps 工具(下)
Master-slave replication of MariaDB database
2021-10-08
Three of three JS (webgl) simple sorting of rotation attribute function, and a simple case of rotating around the axis based on this
egg的static的前缀是可以修改惹,靴靴
Good test data management, in the end how to do?
Why can't V-IF and V-for be used together
領域驅動模型DDD(三)——使用Saga管理事務
学习笔记:Unity CustomSRP-11-Post Processing---Bloom
d.ts---更详细的知识还是需要看官网的介绍(声明文件章节)
Laravel routing job
Knowledge of egg testing -- mock, Supertest, coffee
Semi synchronous replication of MariaDB
Using PHP post temporary file mechanism to upload arbitrary files
学习笔记:Unity CustomSRP-10-Point and Spot Shadows
The annual transaction volume of the app store is US $1 million, and only 15% commission is paid. Small and medium-sized developers are very contradictory