2020ǯ04��03��

xv6�˥ͥåȥ����ǽ���������

¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

�����̳�˰ܹԤ��Ƥ���1����Ⱦ�ۤɷвᤷ�ޤ������̶ФȤ�����ǰ�����Ǥ����������Ǹ����椫���ư�Ǥ���褦�ˤʤä� @pandax381 �Ǥ���

����

�ե륹����å��Ǽ���� TCP/IP �ץ��ȥ��륹���å��� xv6 ���Ȥ߹��ߡ����̤�ε�ǽ��ư���褦�ˤʤ�ޤ�����

�а�

���줳��7��8ǯ���餤�ФĤ�Ǥ����ɡ��饤�ե���Ȥ��Ƥ��ٶ��Ѥ�TCP/IP�ץ��ȥ��륹���å��γ�ȯ��ۤ��ܤ���³���Ƥ��ޤ���

����Ū�ˡ��ץ��ȥ��륹���å���OS�ε�ǽ�ΰ����Ȥ��ƥ����ͥ�������¸�ߤ��Ƥ���ΤǤ��������μ���ץ��ȥ��륹���å��ϡ����䤹����Ż뤷���Թ�ǥ桼�����֤Υ��ץꥱ��������ѤΥ饤�֥��Ȥ��Ƽ������Ƥ��ޤ���

microps-01

�Dz��ؤ˰��֤����󥯥�٥�������Ϥ� PF_PACKET / BPF / TAP �����Ѥ��뤪��ڻ��ͤǡ����˥ѥ��åȽ�������ǰ�Ǥ���褦�ˤʤäƤ��ޤ���

microps-02

����꤬�Ƥ���ʬ�⤢��ޤ�����Ethernet�ե졼�������������TCP�������ȤΤ����ޤ����Ƥ����ǽ������Ƥ��ޤ����֥ץ��ȥ��륹���å��äƤɤ�ʺ��ˤʤäƤ����������פȶ�̣����ä��ͤ������Ф���ʷ�ϵ����Ϥ�Τ����٤������餤�Υܥ�塼��ˤʤäƤ���󤸤�ʤ����Ȼפ��ޤ���

��ʪ���ǥХ������������󥿥ե���������ݲ��Ȥ�����ʤ�˺�����Ǥ���Τǡ���̣�����ä��饳���ɸ��Ƥ���������

��ǯ�����󥿡��󥷥åפ��˾����������������Ƥ��ơ����δ�ĥ��ˤ�ä� DHCP���饤����ȵ�ǽ��ѥ��å�ž����ǽ�����ˤ�DPDK���ݡ��ȤȤ��ä����ɤ��ä���줤�ޤ������������1��2���֤Ȥ���û�����֤����̤�Ф��Ƥ���ޤ�����

����ή��ǡ���Ƥˤ� KLab Expert Camp �Ȥ�����ɥ��٥�Ȥ򳫺Ť��ޤ�����

4���֡��Ҥ�����ץ��ȥ��륹���å���ȯ����Ȥ����ޥ˥��å��ʹ�ɥ��٥�Ȥˤ⤫����餺�����񤫤餿������γ��������ä��Ƥ��졢����������̤��ƴ���Ū�ʻ��Ȥߤ�ؤ���ꡢ�̸���ؤΰܿ��䵡ǽ�ɲä˼���Ȥ�Ǥ���ޤ�����

���üԤ���Υե����ɥХå����������ɤ��ƺ�������Ū�˳��Ť������ʤȻפ���ǡ��Ƕ��ư���򸫤Ƥ���ȡּ���CPU��ư�����Ƥ��뼫���ѥ���ǥӥ�ɤ�������OS�˼���ץ��ȥ��륹���å����Ȥ߹��ߤ����פȤ�����Х��ͤ��и������ǽ���⽽ʬ���ꤽ���ʵ������Ƥ��ޤ���

���ʤ��Ȥ⡢�桼�����֤Ǥ�ư�������Ȥ��Ƥ��饤�֥��ξ��֤���OS�Υ����ͥ���Ȥ߹��⤦�Ȥ����ݤˤɤ��櫤�����Ǥ��뤫���İ����Ƥ����ʤ����Ȥˤϡ���ʬ�˥��ݡ��Ȥ��Ƥ������ʤ����Ȥ��ܤ˸����Ƥ��ޤ�������ʤ櫓�ǡ֤ޤ��ϼ�ʬ�Ǥ�äƤߤ뤫�פȤ����Τ������μ���ȤߤΤ��⤽���ư���Ǥ���

�꺢��OS������

�Ѥ������ʤ��顢�ͤ�OS������Ϥ�Ǥ��餺�ּ�ʬ��OS�פ��ͭ���Ƥ��ޤ���30��OS�����ܤ�֤��Ĥ��ɤ⤦�פ��Ѥ�Ǥ�������ʤΤǡ�OS�����Ϥ���Ƥ���Ȼ��֤��ݤ��ꤹ���Ƥ��ޤ��ޤ���������ȸ��ä� Linux �� BSD ���ȡ��١����ˤ���ˤϵ��Ϥ��礭�����ޤ���

�������ä����Ӥˤϡ�����ѥ��Ȥ� xv6 �������Ƥ������ʵ������ޤ���

CPU�����Ϣ������Ǥ����ˤ��о줷�Ƥ��ޤ��������ޤ�����������ޤǤ�ʤ��Ȼפ��ޤ�����xv6 �� Version 6 UNIX (V6) �� x86�ʥޥ���ץ����å��Ķ��˸����˺Ƽ���������ΤǤ���MIT�����ڥ졼�ƥ��󥰥����ƥ�ιֵ��Ѥ˳�ȯ����MIT�ʳ��ˤ��¿���ζ��鵡�ؤ�����Ȥ��ƺ��Ѥ��Ƥ��ޤ���

�������̤�10,000�����٤ǡ�OS�μ����ˤ��ۤɾܤ����ʤ��Ƥ����Τ��Ϥ����Ȥ��Ǥ���ܥ�塼��Ǥ������¤����ɥ�����Ȥ���ͤ������������Ƥ���Ƥ������˭�٤ˤ���Τ⿴�����Ǥ���

�Ƕ�� RISC-V �����μ����˰ܹԤ����褦�ǡ�MIT�ιֵ�������ǿ��Τ�Τ� RISC-V �Ǥ��١����ˤʤäƤ��ޤ���x86 �Ǥ� 2018 ǯ�ٰ����Υ��������֤򻲾Ȥ��ޤ��礦��

�ɤ�����Ϥ���뤫

xv6 �ˤϥͥåȥ����ǽ�����ڴޤޤ�Ƥ��ʤ����ᡢNIC�Υɥ饤�Ф����ɬ�פ�����ޤ�������ץ��ȥ��륹���å��Ǥϥ�󥯥���������OS�ε�ǽ��PF_PACKET �� BPF�ˤ����Ѥ��Ƥ��ƥɥ饤�ФˤϥΡ����å����ä��Τǡ��⤦���ʲ��������عߤ�뤳�Ȥˤʤ�ޤ���

xv6 �� QEMU ���ư����ʤ��鳫ȯ��ʤ�뤳�Ȥˤʤ�Τǡ�NIC �� QEMU �ǻȤ��ƾ����˭�٤����� e1000 (Intel 8254x) �򥿡����åȤˤ���Τ��ɤ������Ǥ���

�ޤ��ϡ��ɥ饤�ФΥ���ȥ�ݥ���ȤΥ��ߡ����Ѱդ��� Hello, World! �Ǥ���Ϥ���褦�ʥ����ɤ�񤭡�PCI �ǥХ����Υɥ饤�ФΥꥹ�Ȥ��ɲä��Ƥ�����Ȥ�������Ϥ��᤿���ɤ����� ...�Ȼפä��ΤǤ����� õ���Ƥ⤽��äݤ������ɤ�������������ޤ���

�Ϥ���xv6 �� PCI �򥵥ݡ��Ȥ��Ƥ��ʤ��ΤǤ�����

�������ä� xv6 �� NIC �򰷤�����ˤ�

  • PCI���ò¥¹¥ï¿½ï¿½ï¿½ï¿½
  • ��³����Ƥ���ǥХ����ò¸¡½ï¿½
  • �б�����ɥ饤�Ф�ƤӽФ�

�Ȥ�����Ϣ�ν������������ɬ�פ����ꡢ���ˤ⤦���ʲ��������عߤ�뤳�Ȥˤʤ�櫓�Ǥ����������Ⱦ徺��٤��������ʤꤽ���Ǥ��͡�

PCI������

PCI�Х��Υ������ �Ȥ������Ȥʤ�����������񤷤�����ʹ�����ޤ�����I/O�ݡ��Ȥ�á���ƾ�����ɤࡢ�Ȥ��������η����֤��Ǥ��������ơ������դ�OS������Τߤʤ��������餷�������������Ƥ���Ƥ��ޤ���

����ե����졼������ΰ�äƤʤ󤾡��Ȥ������֤Ǥ����� uchan���� �λ������ɤ�� PCI ���������򤷤ޤ����ʤ��Ƥޤ���ˡ�

�ʲ��� Linux Kernel ����⤷���ɥ�����Ȥ⻲�ͤˤʤ�ޤ�����

�����β�����ɤߤʤ��龯���ŤĿʤ�Ƥ����� PCI �Х��򥹥���󤷤ƥǥХ����򸡽Ф��륳���ɤ��񤯤ΤϤ��ۤ��񤷤��ʤ��Ȼפ��ޤ����ʤ���xv6-net �Ǥ� PCI �κǽ�Ū�ʥ����ɤ� JOS �Ȥ����̤� OS �����Ҽڤ��뤳�Ȥˤ��ޤ�����

  • https://pdos.csail.mit.edu/6.828/2018/jos.git

JOS �ϡ�xv6 ��Ʊ�ͤ� MIT �����ڥ졼�ƥ��󥰥����ƥ�ιֵ��ǻȤ�����˳�ȯ���Ƥ��� OS �Ǥ���JOS �ϰ������տ�Ū�˺���Ƥ���̤������OS�Ǥ��ꡢxv6 �β����ʹ�������Ȥˡ�JOS �μ�����ʤ�ƴ���������Ȥ��������Τ褦�Ǥ����ޤ���xv6 ����Υꥷ�å��ʥ����ͥ�Ǥ���Τ��Ф��� JOS �ϥޥ����������ͥ�Ȥ����㤤�⤢��褦�Ǥ���

�ɤ���٤Ƥߤ�� JOS ������������������Ƥ��ƥ��쥤�˽񤫤�Ƥ��뵤�������ΤΡ����Τ�ʷ�ϵ��Ϥ��ʤ���Ƥ��ޤ��������ơ�JOS �ˤ� PCI ����Υ����ɤ� e1000 �ɥ饤�ФΥ�����ȥ�ʤۤܤʤˤ�񤫤�Ƥ��ʤ����äݤΥե�����ˤ��Ѱդ���Ƥ��뤿�ᡢ�����Ȥ碌�Ƥ�餦���Ȥˤ��ޤ�����

�嵭�� pci.c �� JOS �Υ����ɤ��Τ�ΤǤ���xv6 �˼��Ф��ͤϹ��Ψ�� JOS �Υ����ɤ��ɤ�Ǥ���Ϥ��ǡ�����Ǥ�����ͤ��񤭻��餫���������ɤ��� JOS �Υ����ɤ�Ȥ碌�Ƥ��ä��ۤ����ɤ�ͤ����򤷤䤹���������ȹͤ�����̤Ǥ��ʥ����ɤ򤽤Τޤ��Ȥ߹��ि�ᡢ������碌�˾�����֤�ݤ��Ƥ����ꤷ�ޤ��ˡ�

pciinit() �� main() ���椫��Ƥ�Ǥ�����ȡ���ư���� PCI �Х��򥹥���󤷤���³����Ƥ���ǥХ��������Ф���ޤ���

PCI: 0:0.0: 8086:1237: class: 6.0 (Bridge device) irq: 0
PCI: 0:1.0: 8086:7000: class: 6.1 (Bridge device) irq: 0
PCI: 0:1.1: 8086:7010: class: 1.1 (Storage controller) irq: 0
PCI: 0:1.3: 8086:7113: class: 6.80 (Bridge device) irq: 9
PCI: 0:2.0: 1234:1111: class: 3.0 (Display controller) irq: 0
PCI: 0:3.0: 8086:100e: class: 2.0 (Network controller) irq: 11

�٥��ID�ȥǥХ���ID�򥭡��˥ɥ饤�ФΥ���ȥ�ݥ���Ȥ�������Ƥ����ȡ��ǥХ������л��ˤ����á���Ƥ���ޤ���

struct pci_driver pci_attach_vendor[] = {
	{ 0x8086, 0x100e, &e1000_init },
	{ 0, 0, 0 },
};

NIC�Υɥ饤��

PCI �ΥǥХ����򸡽ФǤ���褦�ˤʤä��顢���� NIC �Υɥ饤�Ф�񤭤ޤ���

JOS �Υ������ˤ� kernel/e1000.c �� kernel/e1000.h ���ޤޤ�Ƥ��ޤ������ɤ������äݤǡ�Intel �Υɥ�����Ȥ�������ɤ�Ȥ�����������äƤ��ޤ���

���ͤˤʤꤽ���ʥ����ɤ��ʤ���õ���Ƥߤ�ȡ�xv6 �� RISC-V �ǤΥ�ݥ��ȥ�ˤ� NIC �ν���������ޤǽ񤫤줿�ɥ饤�Фο���������ޤ���������������򻲹ͤˤ��Ĥġ��إå��ե�����Ϥ��Τޤ����Ѥ����Ƥ�餤�ޤ�����

�ޤ���������� ����������Ƥ����ܤ�����㤯����狼��䤹���ƽ�����ޤ�����PCI�ξ����ܤ����񤫤�Ƥ��ơ�����ʾ���򥿥����ɤޤ��Ƥ��ä��ɤ��Τ�...�ȴ�ư���ʤ��� e1000 ���������򤷤ޤ����ʤ��Ƥޤ���ˡ�EPUB�ǤǤ����㤤�ޤ���

OSDev.org �ǾҲ𤵤�Ƥ���ʲ��Υ����ɤ⻲�ͤˤ��ޤ�����

¾�ˤ⡢������ˤ� xv6 ������ e1000 �ɥ饤�Ф�񤤤Ƥ���ͤ���������Τǡ�github ��Ǥ⤤���Ĥ��ץ��������Ȥ򸫤Ĥ��뤳�Ȥ��Ǥ��ޤ������������ɤ��ݡ���󥰤�������ǡ������ߤ�������ư�����֤Τ�Τϸ��Ĥ����ޤ���Ǥ�����

��Ϣ�κ�Ȥ���ǰ��ֶ��路���Τ����ѥ��åȼ������˳����ߤ�ȯ�������뤳�Ȥǡ�1���֤��餤�ϥޤäƤ��ޤ����������Ƚ񤤤��Ĥ��Ǥ�ʤ��ʤ������ߤ�ȯ�����ʤ������ޤ줽���ˤʤäƤ����Τǡ�ư�����Ȥ��Ϥ���㤯����򤷤��ä��Ǥ���

�ʤ��֤��������ǻȤ�DMA�ѤΥХåե����꤬���ޤ��Ǥ��Ƥ��ʤ���ư���Ƥ��ʤ��ä��󤸤�ʤ����ȻפäƤ��ޤ���

�����դξܤ������Ȥϡ��ޤ��̤ε����������ܤǤ�񤳤����ʤȻפäƤ��ޤ���

�ץ��ȥ��륹���å����Τΰܿ�

NIC �Υɥ饤�Ф�ư�����Τǡ����褤������Υץ��ȥ��륹���å����Τΰܿ��˼��ݤ���ΤǤ��������ޤ��������Ȥʤ����ä���ܿ��Ǥ��Ƥ��ޤ��ޤä��Τǡ����ޤ�񤯤��Ȥ��ʤ��ä��ꤷ�ޤ���

pthread ��ȤäƤ����Τ� mutex �� spinlock ���֤��������ꡢcond �򥿥����� sleep/wakeup ���֤��������ꤷ�����餤�Ǥ������ȡ������ޡ����Ȥ��Ƥ��ʤ��Τǡ�TCP�κ����Ȥ������ޡ��˰�¸���������Ϥޤ�ư�����Ƥ��ޤ���

�ޤ���ARP �˱����Ǥ���褦�ˤʤä�

ICMP �˱����Ǥ���褦�ˤʤä�

UDP ���̿��Ǥ���褦�ˤʤ�

�ǽ�Ū�� TCP ��ư���褦�ˤʤ�ޤ���

�����å�

�����ͥ���ǥץ��ȥ��륹���å���ư���褦�ˤʤäƤ⥽���åȤ��ʤ���Х桼�����֤��̿����ץꥱ��������񤯤��Ȥ��Ǥ��ޤ���

����ץ��ȥ��륹���å��ˤϥ����å�����API�⤢��ΤǤ����������ñ�ʤ�饤�֥��ؿ��ʤΤǥץ��ȥ��륹���å��򥫡��ͥ���Ȥ߹�������֤Ǥϥ桼�����֤Υ��ץꥱ������󤫤�ƤӤ����ޤ���

����ʤ櫓�ǡ������å��� �ǤϤʤ������Υ����åȡʴ�Ϣ�Υ����ƥॳ����ˤ�������ޤ�����

�����ƥॳ������ɲäˤ����äƤϡ�xv6 �δ�¸�Υ����ƥॳ������椫������褦�ʥץ��ȥ����פΤ�Τ�õ����Ʊ���褦�˼������Ƥ��ޤ���

socket() �Ǻ����ǥ�������ץ��ϡ���Ȥ��¸�ߤ��Ƥ���ե�����ǥ�������ץ��ȸߴ�������Ĥ褦�˺�äƤ���Τǡ������åȤΥǥ�������ץ��� close() ���Ĥ����ꡢrecv() / senc() ������� read() / write() ��Ȥ����Ȥ�����ޤ���

ñ��ʥ����å��̿��Υץ������Ǥ���С�Linux �Ѥ˽񤤤������ɤ����Τޤ�ư�����٤ˤϤ����Ⱥ�äƤ��ޤ���

ifconfig ���ޥ��

�����뤫�饤�󥿥ե������ξ��֤��ǧ������IP���ɥ쥹�����ꤹ�뤿��ˡ������Ŭ���ʥ��ޥ�ɡ�ifget / ifset / ifup / ifdown�ˤ��б����륷���ƥॳ������äơ����ξ�򤷤Τ��Ǥ��ޤ�����

������������Ȥ���äȥ������Τǡ��ǽ�Ū�� ifconfig ���ޥ�ɤ���ޤ�����ip ���ޥ�ɤ���ʤ��Τ� NETLINK �μ����Ϥ������˸���������Ȥ�����ͳ�Ǥ���

ifconfig �� ioctl() ���̤��ƥ��󥿥ե������ξ�������/���ꤷ�Ƥ���Τǡ�ioctl �Υ����ƥॳ������ɲä���SIOCGXXX �� SIOCSXXX ��Ҥ����������Ǥ��ޤ���

������

����⤳���Ⱥ�����Ǥ�����ּ���ץ��ȥ��륹���å��� xv6 �˰ܿ������פȤ������ϡ�xv6 �˥ͥåȥ����ǽ����������פȤ����������ˤʤä��Τǡ����Τ褦�ʥ����ȥ�ˤʤ�ޤ�����

���ȡ�����;�ä� reddit �ǥӥ塼�⤷�ޤ�����

reddit �ǥ����Ȥ��줿���μ���OS�����ä������Ƥ��ƴ�ư�����ΤǾҲ𤷤Ƥ����ޤ���

�ޤ����ͽ���Ω�Ƥ�Τ��񤷤��Ǥ��������٥�Ȥ����ŤǤ���褦�ʾ����ˤʤä��顢�ޤ� KLab Expert Camp �ǥץ��ȥ��륹���å�����ι�ɤ��ꤿ���ȻפäƤ��ޤ������κݤϼ���OS�ؤ��Ȥ߹��ߤ⥵�ݡ��ȤǤ���褦�˽������Ƥ����ޤ��Τdzڤ��ߤˤ��Ƥ��Ƥ���������


@pandax381

pandax381 at 18:58��Comments(0)��network 

���ε����˥����Ȥ���

̾��:
URL:
  ����òµ­²ï¿½: ɾ��: ��    ��
 
 
 
Blog�⸡��
�ǿ�����
Archives
���Υ֥����ˤĤ���
DSAS�Ȥϡ�KLab �����ۤ����Ѥ��Ƥ��륳��ƥ�ĥ����ӥ��Ѥ�Linux�١����Υ���ե�Ǥ�������5����Υǡ������󥿤ˤƹ��ۤ������Ѥ��Ƥ��ޤ������桹��DSAS����Ȥ��䤹�����������ˡ������Ƥ����ϤDZ��ѤǤ��뤳�Ȥ��ܻؤ��ơ��������ɤ˶Ф���Ǥ��ޤ���
���Υ֥����Ǥϡ������ DSAS �ǻȤäƤ��뵻�ѤξҲ�䡢�¸����Ƥߤ���̤���𡢥ȥ�֥�˴������ޤ줿���ηи��̤ʤɡ���������������������򿥤�ޤ��ƾҲ𤷤Ƥ��������Ȼפ��ޤ���
�ǿ�������
<%==comments[n].author%>
<% } %>