C����́uHello World�I�v�v���O�����Ŏg����A�uprintf()�v�umain()�v���̒��g���A�f�o�b�K�ɂ���͂Ƌt�A�Z���u���A�\�[�X�R�[�h�lj��Ȃǂ̂��܂��܂ȑ��ʂ���T��A�ځB�ŏI��́ALinux�J�[�l���̒��ł́A�v���O�����̋N�����ɂ͂ǂ̂悤�ȏ������s���Ă���̂���T��B
���Ђ̒�����L�p�ȋZ�p�����s�b�N�A�b�v���ďЉ��{�V���[�Y�B����́A�G�a�V�X�e�����s�̏��Ёw�n���[�gHello, World�h OS�ƕW�����C�u�����̃V�S�g�Ƃ����݁i2015�N9��11�����s�j�x����̔����ł��B
�����ӁF�{�e�́A���ҋy�яo�ŎЂ̋��āA���̂܂ܓ]�ڂ������̂ł��B���̂��ߗp���p��̓��ꃋ�[���Ȃǂ́�IT�̂���Ƃ͈�v���܂���B���炩���߂��������������B
���ҏW�����F�O��L���u�G���W�j�A�Ȃ�C����v���O�����̏I���ɌĂяo�����exit()�̒��g�������Ă܂���ˁH�v�͂�����
�@�����܂ł͎��glibc�����X�^�[�g�A�b�v�ƏI�������ɂ��Č��Ă����B
�@������OS�J�[�l���̒��ł́A�v���O�����̋N�����ɂ͂ǂ̂悤�ȏ������s���Ă���̂��낤���B
�@�Ⴆ�v���O�����̎��s�̓G���g���E�|�C���g����J�n�����A�Ƃ��������������B�Ƃ������Ƃ̓G���g���E�|�C���g��EIP�ɐݒ肵�Ď��s���J�n����悤�ȏ������A�ǂ����ōs���Ă���͂����B
�@����Linux�J�[�l���ł̃v���Z�X�N�����������Ă݂悤�B
�@���������v���O�����̎��s�́A�ǂ̂悤�ɂ��čs����̂ł��낤���B
�@UNIX���C�N�ȃV�X�e���ł́A�V�����v���Z�X��fork()�ɂ�萶������Aexec()�n�̊��ɂ��V���ȃv���O�����ɏ�������邱�ƂŎ��s�����Ƃ����̂���{�`���B�u��{�`�v�ƌ����Ă���̂�vfork()�Ȃǂ̐V���ȃV�X�e���R�[�������邩�炾���A�Ƃ肠�����͋C�ɂ��Ȃ��Ă������낤�B
�@�܂��uexec()�n�v�Ƃ����̂̓v���O���������s���邽�߂̃��C�u�������Ƃ���execlp()��execvp()�Ȃǂ�����A�����̂��āuexec()�n�v�Ƒ��ɌĂ��B�ŏI�I�ɂ�execve�V�X�e���R�[���s���邽�߁A�V�X�e���R�[���Ƃ��Ă�execve�ɏW���B
�@�܂�v���O�����̋N����fork��execve�Ƃ�������ɂ���čs����B
�@execve�V�X�e���R�[�������s���ꂽ��A���Ƃ̓J�[�l���̎d�����B�����Ă��̂Ƃ��ɕK�v�ȍ�Ƃ́A�ȉ��̂悤�Ȃ��̂��낤���B
�@�����̏�����OS�̃J�[�l�����s���Ă��邱�ƂɂȂ�B�����Ă��Ƃ���Linux�Ȃ�A���̃\�[�X�R�[�h��ǂ߂A���ۂɂǂ̂悤�ȏ������s����̂����킩��͂����B
�@�����ł͐V���ȃv���Z�X���J�n���邽�߂́A�J�[�l�������������Ă݂悤�B
�@�܂���execve�V�X�e���R�[���̏�������T���Ă݂悤�B
�@����̓V�X�e���R�[���E�e�[�u��������킩�邾�낤���BLinux�J�[�l���E�\�[�X�R�[�h��arch/x86/kernel/syscall_table_32.S�����Ă݂�ƁA�ȉ��̂悤�ɓo�^����Ă���B
1:ENTRY(sys_call_table) ... 12: .long sys_unlink /* 10 */ 13: .long ptregs_execve ...
�@�V�X�e���R�[���ԍ���11�̂悤���B�����execve �Ō�������ƁAkernel/entry_32.S�Ɉȉ��̂悤�Ȓ�`�����邱�ƂɋC�����B
715:/* 716: * System calls that need a pt_regs pointer. 717: */ 718:#define PTREGSCALL(name) \ 719: ALIGN; \ 720:ptregs_##name: \ 721: leal 4(%esp),%eax; \ 722: jmp sys_##name; ... 728:PTREGSCALL(execve) ...
�@ptregs_execve�Ƃ����V���{������`����A��������sys_execve���Ă��A�Ƃ������ƂɂȂ�悤���B�܂�sys_execve��T���������ƂɂȂ�B
�@����̓A�[�L�e�N�`����ˑ������ɂ��邾�낤����A�g�b�v�E�f�B���N�g���t�߂Ō�������������낤�c�Ǝv�����̂������ۂɂ���Ă�������Ȃ��B�C�����Ȃ�����x86�ˑ����Ō�������ƁAkernel/process_32.c�Ƃ����t�@�C����������Asys_execve()���ȉ��̂悤�ɒ�`����Ă����B
447:/* 448: * sys_execve() executes a new program. 449: */ 450:int sys_execve(struct pt_regs *regs) 451:{ ... 459: error = do_execve(filename, 460: (char __user * __user *) regs->cx, 461: (char __user * __user *) regs->dx, 462: regs); ...
�@do_execve()���Ă��悤���B�����T���Ă݂�ƁA���x�����A�[�L�e�N�`����ˑ�����fs/exec.c�Ɍ�����A�ȉ��̂悤�ɒ�`����Ă����B
1357:/* 1358: * sys_execve() executes a new program. 1359: */ 1360:int do_execve(char * filename, 1361: char __user *__user *argv, 1362: char __user *__user *envp, 1363: struct pt_regs * regs) 1364:{ ... 1426: retval = copy_strings(bprm->argc, argv, bprm); 1427: if (retval < 0) 1428: goto out; 1429: 1430: current->flags &= ~PF_KTHREAD; 1431: retval = search_binary_handler(bprm,regs); ...
�@copy_strings()�Ƃ������ɂ����argv[]�̏������s���Ă���悤���B
�@��n�߂�do_execve()�̏��������Ă݂����A�ʂ̖ڐ������execve()�̏��������Ă݂悤�B
�@���s�t�@�C����ELF�t�H�[�}�b�g�Ƃ����`���ɂȂ��Ă���̂ŁAELF�t�H�[�}�b�g�̉�͏������s���Ă���ӏ�������͂����B�����Ă���̓A�[�L�e�N�`����ˑ����ɂ��邾�낤�B
�@�t�@�C�����Ɂuelf�v���܂ނ悤�ȃt�@�C���͖������낤���B
[user@localhost ~]$ cd linux-2.6.32.65 [user@localhost linux-2.6.32.65]$ ls */*elf* fs/binfmt_elf.c lib/locking-selftest-softirq.h fs/binfmt_elf_fdpic.c lib/locking-selftest-spin-hardirq.h fs/compat_binfmt_elf.c lib/locking-selftest-spin-softirq.h lib/locking-selftest-hardirq.h lib/locking-selftest-spin.h lib/locking-selftest-mutex.h lib/locking-selftest-wlock-hardirq.h lib/locking-selftest-rlock-hardirq.h lib/locking-selftest-wlock-softirq.h lib/locking-selftest-rlock-softirq.h lib/locking-selftest-wlock.h lib/locking-selftest-rlock.h lib/locking-selftest-wsem.h lib/locking-selftest-rsem.h lib/locking-selftest.c [user@localhost linux-2.6.32.65]$
�@fs/binfmt_elf.c�Ƃ����t�@�C��������炵���v����B
�@������binfmt_elf.c�̒��g�����Ă݂�ƁAload_elf_binary()�Ƃ�����������B���O���炵�āA�܂���ELF�t�H�[�}�b�g�̎��s�t�@�C���̃��[�h�����̂悤�Ɏv����B
�@�A�ڑ�8��Ő��������悤�ɁA�v���O�����̎��s��ELF�t�H�[�}�b�g�Ɋ܂܂�Ă���G���g���E�|�C���g����J�n�����B�Ƃ������Ƃ͂��̒��ɁA�G���g���E�|�C���g�������Ă���ӏ�������̂ł͂Ȃ����낤���B
�@�uentry�v�Ƃ����L�[���[�h�Ō�������ƁA�ȉ��̂悤�ȉӏ������������B
563:static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs) 564:{ ... 978: start_thread(regs, elf_entry, bprm->p); ...
�@start_thread()�Ƃ��������Ăяo���Ă���B����Ƀ��W�X�^�֘A�炵�������ƁA�G���g���E�|�C���g�̃A�h���X��n���Ă���悤���B
Copyright © ITmedia, Inc. All Rights Reserved.