当前位置:网站首页>Processus d'exécution du programme exécutable
Processus d'exécution du programme exécutable
2022-04-23 05:26:00 【La vie a besoin de profondeur】
./hello_worldCette commande estlinuxComment fonctionne le système du noyau.Utilisation du système de fichiersbusybox,CorrespondantlinuxProcédure d'appel du noyau.
busyboxMoyenneshellRésoudre la ligne de commande
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 */
}
Deux appels système sont appelés pendant l'exécution de la commande forkshellEtshellexec,Adoptionshellexec Par exemple, un appel système
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
}
execveLa fonction estgcc Mise en oeuvre des fichiers de la Bibliothèque fournis par l'outil de compilation glibc-2.3.6/sysdeps/unix/sysv/linux/execve.cDéfinition moyenne
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)
Appel final àINLINE_SYSCALL Macro dans le fichier d'en - tête glibc-2.3.6/sysdeps/unix/sysv/linux/arm/sysdep.hRéalisation intermédiaire
/* 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; })
Enfin appelé àarmDeswitch La commande entre dans l'interruption douce et est transférée dans le traitement de l'interruption du système d'exploitation pour traitement .
版权声明
本文为[La vie a besoin de profondeur]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/04/202204230525501380.html
边栏推荐
- Data management of basic operation of mairadb database
- Graphics. Fromimage reports an error "graphics object cannot be created from an image that has an indexed pixel..."
- Anti crawler (0): are you still climbing naked with selenium? You're being watched! Crack webdriver anti crawler
- Cross domain CORS relationship~
- Five key technologies to improve the devsecops framework
- Source code analysis of how to use jump table in redis
- Study notes: unity customsrp-13-colorgrading
- 史上最强egg框架的error处理机制
- Kanban Quick Start Guide
- Knowledge of egg testing -- mock, Supertest, coffee
猜你喜欢
What are the reasons for the failure of digital transformation?
2021-09-28
Let the LAN group use the remote device
何时适合进行自动化测试?(下)
Graphics.FromImage报错“Graphics object cannot be created from an image that has an indexed pixel ...”
To understand Devops, you must read these ten books!
Excel 2016 打开文件第一次打不开,有时空白,有时很慢要打开第二次才行
Anti crawler (0): are you still climbing naked with selenium? You're being watched! Crack webdriver anti crawler
What role do tools play in digital transformation?
跨域CORS的情缘~
随机推荐
SQL Server检索SQL和用户信息的需求
Getting started with varnish
My old programmer's perception of the dangers and opportunities of the times?
点击添加按钮--出现一个框框(类似于添加学习经历-本科-研究生)
MySQL series - install MySQL 5.6.27 on Linux and solve common problems
If I am PM's performance, movie VR ticket purchase display
When is it appropriate for automated testing? (bottom)
Good test data management, in the end how to do?
d.ts---更详细的知识还是需要看官网的介绍(声明文件章节)
Blender程序化地形制作
Source code analysis of how to use jump table in redis
Basic knowledge of redis
Self incrementing sequence creation of MySQL
Necessity of selenium preloading cookies
Let the LAN group use the remote device
Graphics.FromImage报错“Graphics object cannot be created from an image that has an indexed pixel ...”
青岛敏捷之旅,来了!
Mairadb数据库基本操作之数据管理
Project manager's thinking mode worth trying: project success equation
【openh264】cmake: msopenh264-static