Linux�ɂ����闘�p���}���ɑ����Ă���uBerkeley Packet Filter�iBPF�j�v�ɂ��āA��b���牞�p�܂ŕ��L���Љ��A�ځB����́ALinux�ŗp������BPF�̃A�[�L�e�N�`���Ȃǂ��������B
�@Linux�ɂ����闘�p���}���ɑ����Ă���uBerkeley Packet Filter�iBPF�j�v�ɂ��āA��b���牞�p�܂ŕ��L���Љ��A�ځuBerkeley Packet Filter�iBPF�j�����v�B�����́ABPF�̗��j��T�v�ɂ��ĉ�����܂����B�����BPF�̊�b�Ƃ��āALinux�ŗp������BPF�̃A�[�L�e�N�`���Ȃǂ�������܂��B
�@����Linux�Ŏ�Ƃ��ėp�����Ă���ueBPF�iextended BPF�j�v�̓I���W�i���́ucBPF�iclassic BPF�j�v�Ƃ͈قȂ�A�݊���������܂���B�������ALinux��eBPF���������ꂽ����ALinux����cBPF�����S�ɂȂ��Ȃ����킯�ł͂���܂���BcBPF�𗘗p�����p�P�b�g�t�B���^�����O���\�ł����i�������eBPF�ł��ł��܂��j�A�V�X�e���R�[���t�B���^�[�iseccomp�j�͈ˑR�Ƃ���eBPF�ł͂Ȃ�cBPF����͂Ƃ��Ď��܂��B
�@�������A�����I�ɂ�cBPF�̃v���O������eBPF�̃v���O�����ɕϊ�����Ď��s����Ă��܂��B
�@�ȉ��ł́AcBPF��eBPF�o���̃A�[�L�e�N�`���ɂ��ĊȒP�ɂ܂Ƃ߂܂��B����͍���̘A�ڂ̃��t�@�����X���ӎ��������̂ł���ABPF�̗��p�ɓ������Ċo���Ă����K�v�͂���܂���B�K�v�ɉ����ēK�X�Q�Ƃ��Ă��������B�܂������ȃh�L�������e�[�V�����́uLinux Socket Filtering aka Berkeley Packet Filter�iBPF�j�v�ɂ���܂��B
�@cBPF�̖��߃Z�b�g��64bit�Œ蒷�ł��B�t�H�[�}�b�g��C����ŕ\������ƁA���L�̂悤�ɂȂ�܂��B
struct cbpf_insn { u16 code; /* �I�y�R�[�h */ u8 jt; /* �������^�̂Ƃ��̕���� */ u8 jf; /* �������U�̂Ƃ��̕���� */ u32 k; /* �ėp�t�B�[���h */ };
�@�W�����v��̃I�t�Z�b�g�ijt�Ajf�j��unsigned�Ȃ̂ŁAcBPF�ł͕��̕����ւ̃W�����v���ł��܂���B�܂�A���[�v�����͂ł��܂���B���̎d�l�ƃv���O�����T�C�Y�𐧌����邱�ƂŁA��莞�ԓ��ł̃v���O�������s�I�����ۏ���܂��B
�@���z�}�V���͉��L�̃��W�X�^�ƃ������̈�������܂��B���W�X�^��32bit���ł��B
���W�X�^�� | ���� |
---|---|
A | �A�L�������[�^���W�X�^ |
X | �C���f�b�N�X���W�X�^ |
M[] | �������̈�A32bit���A�T�C�Y16 |
�@cBPF�ɂ͉��L�̂悤�Ȗ��߂�����܂��B
�@�p�P�b�g�f�[�^�ɑ���X�g�A���߂͂���܂���B
�@eBPF�̖��߃Z�b�g��64bit�Œ蒷�ł��B�t�H�[�}�b�g��C����ŕ\������ƁA���L�̂悤�ɂȂ�܂��B
struct ebpf_insn { u8 code; /* �I�y�R�[�h */ u8 dst_reg:4; /* �f�B�X�e�B�l�[�V�������W�X�^ */ u8 src_reg:4; /* �\�[�X���W�X�^ */ s16 off; /* �I�t�Z�b�g */ s32 imm; /* ���l */ };
�@�I�t�Z�b�g�⑦�l��signed�^�ɂȂ��Ă��܂��B�]���āAcBPF�Ƃ͈قȂ�A�������ւ̃W�����v���\�ł��B�v���O�����̈�莞�Ԉȓ��̓���I���͌��؊킪�����܂��B�܂��A�udst_reg�v�usrc_reg�v�t�B�[���h�Ŏg�p���郌�W�X�^���w��ł���悤�ɂȂ��Ă��܂��B
�@����ŁAcBPF�ɂ������ujt�v�ujf�v�t�B�[���h��eBPF�ɂ͑��݂��܂���BeBPF�̃W�����v���߂́A�w�肵���Ԓn�ւ̃W�����v���邢�̓t�H�[���X���[�̂ǂ��炩�ɂȂ�܂��B
�@���z�}�V���͉��L�̃��W�X�^�������܂��B���W�X�^��64bit���ł��B
���W�X�^�� | ���� |
---|---|
R0 | �ėp���W�X�^�i�߂�l���i�[�j |
R1�`R5 | �ėp���W�X�^�i�������W�X�^�j |
R6�`R9 | �ėp���W�X�^ |
R10 | �t���[���|�C���^�i�ǂݏo����p�j |
�@x86_64��AArch64�Ȃǂ̃A�[�L�e�N�`���ɂ����āAeBPF�̃��W�X�^�͎��ۂ�CPU�̃��W�X�^��1��1�őΉ��t������悤�ɂȂ��Ă��܂��BeBPF�̌Ăяo���K���64bit�J�[�l���ŗ��p�������̂ƒ��ڑΉ����܂��B
�@cBPF��eBPF�ɂ́A���L�̂悤�ȈႢ������܂��B
cBPF | eBPF | |
---|---|---|
���W�X�^�� | 2 | 10 |
���W�X�^���ibit�j | 32 | 64 |
�X�^�b�N�T�C�Y�iByte�j | 16 | 512 |
�X�^�b�N�A�N�Z�X�T�C�Y�iByte�j | 4 | 1�A2�A4�A8 |
�p�P�b�g�A�N�Z�X�T�C�Y�iByte�j | 1�A2�A4 | 1�A2�A4�A8 |
�O�����Ăяo�� | �~ | �� |
�������ւ̕��� | �~ | �� |
�A�g�~�b�N���Z���� | �~ | �� |
�@cBPF�ɑ��݂����������̈�̑���ɁAeBPF�ł�R10�̃t���[���|�C���^�𗘗p���ăv���O�����p�̃X�^�b�N�i512B�j�ɃA�N�Z�X�ł��܂��B
�@eBPF�͈ꕔ������cBPF�Ɠ����̖��߂��T�|�[�g���鑼�A�ȉ��̂悤�Ȗ��߂��lj�����Ă��܂��B
�@�܂�cBPF�ł͑����̖��߂�A���W�X�^�ɑ�����̂ł������̂ɑ��AeBPF�ł́usrc_reg�v�udst_reg�v�t�B�[���h�ɂ��g�p���郌�W�X�^���_��ɑI���ł���悤�ɂȂ��Ă��܂��B
�@eBPF�ł͎��O�ɓo�^�ς݂̃J�[�l��������BPF�v���O��������Ăяo�����Ƃ��\�ł��B���̂Ƃ��A�Ăяo������R1�`R5�ɓK�Ɉ�����ݒ肵�Ċ����Ăяo���܂��B�߂�l��R0�Ɋi�[����܂��B
�@�K�v�ł����R0-R5�̒l�͌Ăяo���O�ɑޔ�����K�v������܂��BR6�`R9�̃��W�X�^�́A�������ޔ�����K��ɂȂ��Ă��邽�߁A�Ăяo�������ޔ�����K�v�͂���܂���B������6�ȏ�̊��Ăяo���̓T�|�[�g����Ă��܂���B
�@eBPF�͌��݃l�b�g���[�N�p�r�݂̂Ȃ炸�A���܂��܂ȗp�r�ŗ��p����Ă��܂��B���p��ʂɉ����āABPF�v���O�������\�ȑ���i���؊킪��������e�j��Ăяo���\�ȊO�����͈قȂ�܂��B
�@�J�[�l���ł�BPF�̎�ނ��uBPF_PROG_TYPE�v�Ŏ��ʂ��Ă��܂��B�J�[�l��4.18���_�ňȉ��̃^�C�v�����݂��܂��B
enum bpf_prog_type { BPF_PROG_TYPE_UNSPEC, BPF_PROG_TYPE_SOCKET_FILTER, BPF_PROG_TYPE_KPROBE, BPF_PROG_TYPE_SCHED_CLS, BPF_PROG_TYPE_SCHED_ACT, BPF_PROG_TYPE_TRACEPOINT, BPF_PROG_TYPE_XDP, BPF_PROG_TYPE_PERF_EVENT, BPF_PROG_TYPE_CGROUP_SKB, BPF_PROG_TYPE_CGROUP_SOCK, BPF_PROG_TYPE_LWT_IN, BPF_PROG_TYPE_LWT_OUT, BPF_PROG_TYPE_LWT_XMIT, BPF_PROG_TYPE_SOCK_OPS, BPF_PROG_TYPE_SK_SKB, BPF_PROG_TYPE_CGROUP_DEVICE, BPF_PROG_TYPE_SK_MSG, BPF_PROG_TYPE_RAW_TRACEPOINT, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_PROG_TYPE_LWT_SEG6LOCAL, BPF_PROG_TYPE_LIRC_MODE2, }
�@eBPF�ł́ueBPF map�v�ƌĂ��f�[�^�\�������p�\�ł��BeBPF map�́ABPF�v���O��������͊O�����Ăяo���@�\�𗘗p���āA���[�U�[�A�v���P�[�V��������̓V�X�e���R�[���𗘗p���āA���ꂼ��A�N�Z�X�\�ł��B
�@eBPF map�𗘗p���邱�ƂŁAeBPF�v���O�����̏�Ԃ��Ǘ��ł��܂��BeBPF map�̋�̓I�Ȑ����́A��̘A�ڂŁA���ۂɗ��p�����ʂōs���܂��B
�@cBPF�ł͈����͔��I�Ȍ`�ŗ^�����A���[�h���߂𗘗p���Ă��̒��g�����W�X�^�ɓǂݍ��ނ��Ƃ��\�ł��B
�@���eBPF�ł́A�ŏ���eBPF�v���O���������s�����Ƃ�R1���W�X�^�Ɉ������n����܂��B�����eBPF�ł́u�R���e�L�X�g�v�ƌĂ�ł��܂��B���I�Ȉ����͑��݂��܂���B�܂������̃R���e�L�X�g��BPF�v���O�����ɓn����邱�Ƃ͂���܂���B
�@�R���e�L�X�g��BPF_PROG_TYPE���ƂɈقȂ�܂��B�Ⴆ�A�l�b�g���[�L���O�֘A�̏ꍇ�R���e�L�X�g�ɂ̓J�[�l�����̃p�P�b�g�̃f�[�^�\���ł���ustruct sk_buff�v���n����܂��B
�@�uTail Call�v�͑���BPF�v���O�����ւ̑J�ڂ��s���@�\�ł��B�J�ڌ�ɑJ�ڌ��ɖ߂邱�Ƃ͂���܂���B�J�ڐ��BPF�v���O�����Ƃ̓X�^�b�N�t���[�������L���܂��B
�@��莞�Ԃł̏I����ۏ��邽�߂ɍő��Tail Call�̉�32�ɐ�������Ă��܂��B
�@Linux 4.16�����LLVM 6.0����A����BPF����BPF�v���O��������Ăяo����悤�ɂȂ�܂����B�Ăяo�����@�͊O�����Ăяo���ɏ������܂��B����ȑO�ł́ABPF�v���O�������瑼��BPF�����Ăяo�������ꍇ�́A�S�ăC�����C���œW�J����K�v������܂����B
�@BPF�����Ăяo���ꍇ�A�ő�̌Ăяo���l�X�g��8�ɐ�������Ă��܂��B�����Ƃ��ČĂяo������frame pointer��n�����Ƃ͉\�ł����A�t�͕s�\�ł��B
�@���̋@�\��Tail Call�ƍ��킹�ė��p���邱�Ƃ͂ł��܂���B
Copyright © ITmedia, Inc. All Rights Reserved.