Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
時の流れが許せない
Search
KOBA789
May 11, 2025
0
45
時の流れが許せない
Kernel/VM探検隊@北陸 Part 7 で発表した内容です。
KOBA789
May 11, 2025
Tweet
Share
More Decks by KOBA789
See All by KOBA789
ついに生産が終わったけどZ80でまだまだ遊びたい
koba789
5
4.2k
ISUCONの練習を楽しくたくさんやる方法
koba789
2
1.3k
Z80をRustで動かすまで年が越せない
koba789
0
190
ISUCON練習環境を最も簡単に用意する方法
koba789
2
3.2k
音をアレする
koba789
0
900
メガネとBluetooth Low Energyでお喋りする
koba789
0
1.6k
Rustでon-diskなB+Treeを作ったときの細かな話
koba789
11
1.8k
音の出るCPUを作っている途中
koba789
5
4.7k
自宅サーバーでbottlerocketを動かしてk8sクラスタを組む
koba789
1
1.2k
Featured
See All Featured
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
Building an army of robots
kneath
306
45k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Statistics for Hackers
jakevdp
799
220k
Facilitating Awesome Meetings
lara
54
6.4k
Faster Mobile Websites
deanohume
307
31k
VelocityConf: Rendering Performance Case Studies
addyosmani
329
24k
StorybookのUI Testing Handbookを読んだ
zakiyama
30
5.8k
How GitHub (no longer) Works
holman
314
140k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
137
34k
Writing Fast Ruby
sferik
628
61k
Transcript
KOBA789 ࣌ͷྲྀΕ͕ڐͤͳ͍ ,FSOFM7.୳ݕୂ!1BSU
KOBA789 పͰ͔ͭ͘ΒंͰདྷ·ͨ͠ʢ৸ෆʣ w ࣄͷ͠·ͤΜ w ࣄͷ͠·ͤΜʢʣ w ͏͔ͬΓձࣾͷ1$Λ͖࣋ͬͯͨͷͰ͍ͭͷࣗݾհςϯϓϨʔτ͕ͳ͍
None
ಈ͘Α͏ʹͳΓ·ͨ͠ ΫϦελϧͷཪ໘ʹ৴߸ઢ͕௨ͬͯͯΫϩοΫ͕Ε͍ͯͨͷ͕ݪҼ
࣌ͷྲྀΕ͕ڐͤͳ͍
Έͳ͞Μͦ͏Ͱ͢Ͷʁ
ࢲͩͬͯͦ͏ͩ
ͭͷϚΠίϯͰ࣌ࠁΛಉظ͍ͨ͠ ΈΜͳେ͖6"35ͰλΠϜελϯϓΛૹΔ .$6 # .$6 " lz
ͭͷϚΠίϯͰ࣌ࠁΛಉظ͍ͨ͠ ΈΜͳେ͖6"35ͰλΠϜελϯϓΛૹΔ #ͷ࣌ܭ͕ͪΐͬͱ͚ͩΕΔ .$6 # .$6 " lz
ͭͷϚΠίϯͰ࣌ࠁΛಉظ͍ͨ͠ ΈΜͳେ͖6"35ͰλΠϜελϯϓΛૹΔ #ͷ࣌ܭ͕ͪΐͬͱ͚ͩΕΔ .$6 # .$6 " lz ͳ͔ͥʁ
6"35ͷΈ CBVEͳΒ#ZUFૹΔͷʹNT͔͔Δ https://vanhunteradams.com/Protocols/UART/UART.html <CJU><CJUT>˺<NT> ੨͍෦KOBA789ʹΑΔՃච
6"35ͷΈ #ZUFͷ࣌ࠁΛૹͬͨΒNTԆ͢Δ .$6# .$6" NT #ͷ࣌ܭ͕NTΕΔ
6"35ͷΈ #ZUFͷ࣌ࠁΛૹͬͨΒNTԆ͢Δ .$6# .$6" NT #ͷ࣌ܭ͕NTΕΔ NT
Ҿ͍ͨΒʁ
·͊Ԇ͕ίϯελϯτͳΒ ͦΕͰ͍͍ΜͰ͢Α
͕ͩࣄଶͦ͏୯७Ͱͳ͍
let time = gettimeofday(); send(time);
let time = gettimeofday(); send(time); ߦ͕࣮ߦ͞Ε͔ͯΒ ߦ͕࣮ߦ͞ΕΔ·ͰͷԆʁ
ߦͱߦͷؒʹ͋ΔԆ Α͋͘Γ͕ͪͳϚΠίϯͷ߹ w ී௨ʹ໋ྩ࣮ߦʹ͔͔ΔαΠΫϧ͚ͩԆ͢Δ w ༏ઌͷߴׂ͍ΓࠐΈ͕ೖΕԆ͢ΔʢཁΫϦςΟΧϧηΫγϣϯʣ w ࠷ۙͷϚΠίϯͰ w $16͕͍͗ͯ͢Ζ͍Ζ͕૬ରతʹ͍ͷͰΩϟογϡ͕͋Δ
w ΩϟογϡώοτPSOPUͰԆ͕࣌ؒมԽʢඇܾఆతʣ w 5$.ͱ͔͑ϚγʹͳΔ͕ w 0VUPG0SEFS࣮ߦ͢Δ w ίʔυಡΉ͚ͩͰԆ͕࣌ؒΘ͔Βͳ͍ʢࣄ্࣮ඇܾఆతʣ
let time = gettimeofday(); send(time);
let time = gettimeofday(); send(time); ͦͦTFOE ͷ࣮ʁ
Α͋͘Δ6"35ૹ৴ϖϦϑΣϥϧʢงғؾʣ ૹ৴'*'0 5%3 ͕ϝϞϦϚοϓ͞Ε͍ۭͯͯʹͳΔͱׂΓࠐΈ͕ೖΔ 4IJGU SFHJTUFS EFQUI '*'0 59 %"5"
όε $16 %"5" '*'0&NQUZ *OUFSSVQU 5%3
5%3ʹΛॻ͖ࠐΉͱૹ৴͞ΕΔ ͨͱ͑5%3ͷΞυϨεΛY@ͱ͢Δ *(uint32_t*)0x400001000 = 'A'; core::ptr::write_volatile(0x400001000 as *mut u8, b'A');
5%3ʹΛॻ͖ࠐΉͱૹ৴͞ΕΔ EFQUI'*'0ͳΒจࣈ·ͰҰؾʹॻ͚Δ͕ɺӽ͑ΔͱᷓΕΔ core::ptr::write_volatile(0x40000100 as *mut u8, b'0'); core::ptr::write_volatile(0x40000100 as *mut
u8, b'1'); core::ptr::write_volatile(0x40000100 as *mut u8, b'2'); core::ptr::write_volatile(0x40000100 as *mut u8, b'3'); core::ptr::write_volatile(0x40000100 as *mut u8, b'4'); core::ptr::write_volatile(0x40000100 as *mut u8, b'5'); core::ptr::write_volatile(0x40000100 as *mut u8, b'6'); core::ptr::write_volatile(0x40000100 as *mut u8, b'7'); core::ptr::write_volatile(0x40000100 as *mut u8, b'8'); core::ptr::write_volatile(0x40000100 as *mut u8, b'9'); core::ptr::write_volatile(0x40000100 as *mut u8, b'A'); core::ptr::write_volatile(0x40000100 as *mut u8, b'B'); core::ptr::write_volatile(0x40000100 as *mut u8, b'C'); core::ptr::write_volatile(0x40000100 as *mut u8, b'D'); core::ptr::write_volatile(0x40000100 as *mut u8, b'E'); core::ptr::write_volatile(0x40000100 as *mut u8, b’F'); // ͔͜͜ΒઌᷓΕΔ
Α͋͘Δ6"35υϥΠόʢงғؾʣ %."ͷ͜ͱҰ୴Ε͍ͯͩ͘͞ w TFOE w ·ͣ'*'0ͷۭ͖༰ྔ͚ͩॻ͘ w ᷓΕͨιϑτΣΞόοϑΝʹॻ͘ w
&NQUZ'*'0ׂΓࠐΈ w '*'0ͷۭ͖༰ྔ͚ͩιϑτΣΞόοϑΝ͔ΒҠ͢
͏͓͔ΓͰ͢Ͷʁ
όοϑΝɾ'*'0͕ ٧·ͬͯͨΒ ଈ࠲ʹૹ৴͞Εͳ͍ ʢͦΕͦ͏ʣ
ͯ͞
Α͋͘Δ6"35ड৴ϖϦϑΣϥϧʢงғؾʣ ड৴'*'0 3%3 ͕ϝϞϦϚοϓ͞Ε͍͕ͯͯདྷΔͱׂΓࠐΈ͕ೖΔ 4IJGU SFHJTUFS EFQUI '*'0 39 %"5"
όε $16 %"5" '*'0/PO&NQUZ *OUFSSVQU 3%3
3%3͔ΒΛಡΉͱ'*'0͔ΒQPQ͞ΕΔ ͨͱ͑3%3ͷΞυϨεΛY@ͱ͢Δ uint8_t r = *(uint32_t*)0x40000200; // r == 'A'
let r = core::ptr::read_volatile(0x40000100 as *const u8); // r == b’A'
Α͋͘Δ6"35υϥΠόʢงғؾʣ %."ͷ͜ͱҰ୴Ε͍ͯͩ͘͞ʢʣ w /POFNQUZ'*'0ׂΓࠐΈ w '*'0ͷ༰ΛιϑτΣΞόοϑΝʹҠ͢ w ͜ΕΛ͠ͳ͍ͱ'*'0༰қʹᷓΕΔ w SFDW
w ιϑτΣΞόοϑΝ͔ΒಡΈग़͢
ड৴σʔλͷಡΈऔΓ͍͘ΒͰԆ͢Δ ͏͓Θ͔ΓͰ͢Ͷʢʣ w ΞϓϦέʔγϣϯ͕ιϑτΣΞόοϑΝΛ͍ͭಡΉ͔ࣗ༝ w ׂΓࠐΈϋϯυϥ͕ݺΕΔλΠϛϯάʜʜʁ w ΞςʹͳΒͳ͍ w ผͷΫϦςΟΧϧηΫγϣϯͰεϐϯϩοΫͯͨ͠ΒΕΔ
w $PSUFY.ͰׂΓࠐΈͷԣऔΓͱ͔ͰϨΠςϯγ͕ζϨΔ
ࠔΔ
ࠔΔͷͰɺΑ͋͘Δํ๏ʢ6"35 114ʣ ඵ͝ͱʹύϧεΛೖྗ͠ɺͦΕΛϋʔυΣΞͰΩϟϓνϟ͢Δ .$6 # .$6 " lz ʮࠓͰ͢ʂʯ
*OQVU$BQUVSF0VUQVU$PNQBSF ΠέͯΔϚΠίϯͷλΠϚʹ͍͍ͩͨ͋Δ w *OQVU$BQUVSF w ύϧεೖྗΛτϦΨʔʹͯ͠ɺΧϯλͷΛϨδελʹΩϟϓνϟ w ιϑτΣΞͷλΠϛϯάʹґଘͤͣਖ਼֬ͳλΠϛϯά͕औΕΔ w (1*0ׂΓࠐΈͱશ͘ผͷػೳ
w 0VUQVU$PNQBSF w ΧϯλͷΛτϦΨʔʹͯ͠ɺύϧεΛग़ྗ w ιϑτΣΞͷλΠϛϯάʹґଘͤͣʢSZ
ΊͰͨ͠ΊͰͨ͠ʢʁʣ
ݪཧతʹཱ͍ͯ͠Δ͕ݱ࣮తʹࠔΔ 6"35࣌ࠁ৴ઐ༻Ͱͳ͍ɻଞͷίϚϯυૹΓ͍ͨ .$6 # .$6 " lz ʮࠓͰ͢ʂʯ $.%@%0@40.&5)*/( ࠞͬͯ͟͠·͏
6"35ʹྲྀΕΔσʔλΛผ͍ͨ͠ ͜ͷΜͷεϥΠυ͕Ͱ͖ͯͳ͍ w σʔλΛผ͢ΔʹϔομΛ͚Δͷ͕ৗखஈ w ϔομΛ͚Δʹύέοτࢦ͡Όͳ͍ͱ͍͚ͳ͍ w ͱ͜ΖͰ6"35ͨͩͷΕͷͳ͍όΠτετϦʔϜ w ύέοτʹ͢Δʹϓϩτίϧ͕ඞཁ
w ͔͠ඪ४Խ͞Εͯͳ͍ͱඍਖخ͘͠ͳ͍
͜ͷΜͷεϥΠυ͕Ͱ͖ͯͳ͍
͏݁ߦͧ͘
151 1SFDJTJPO5JNF1SPUPDPM &UIFSOFU্Ͱ/51ΑΓਫ਼ີͳ࣌ࠁಉظΛ͢Δϓϩτίϧ w ൃͱͯ͠/51ͱಉ͡ʢԟ෮ͰϨΠςϯγΛଌΔʣ w େ͖ͳҧ͍ϋʔυΣΞλΠϜελϯϓͷαϙʔτ w &UIFSOFUϑϨʔϜͷ4'%͕1):Λ௨աͨ͠ॠؒͷΧϯλͷΛ ϋʔυΣΞͰΩϟϓνϟ͢Δ
w ΑΓਫ਼ີʹϨΠςϯγ͕ଌΕΔͷͰVTʙOTΦʔμʔͷਫ਼͕ૂ͑Δ w ࣮ࡍʹͬͱ͍Ζ͍Ζ͋Δ͕ɺ͜͜ʹॻ͘ʹ४උ͕࣌ؒΒͳ͗͢͞Δ
151 1SFDJTJPO5JNF1SPUPDPM &UIFSOFU্Ͱ/51ΑΓਫ਼ີͳ࣌ࠁಉظΛ͢Δϓϩτίϧ .$6 # .$6 "
31J$.ͱळ݄ͷ(14ϞδϡʔϧͰ࡞ΕΔ ͜ͷهࣄಡΜͩΒ؆୯ʹ࡞ΕΔͱࢥ͏ https://www.je ff geerling.com/blog/2022/ptp-and-ieee-1588-hardware-timestamping-on-raspberry-pi-cm4
/VDMFP 45. ͰΕಈ͘ ୭151ͳΜͯͬͯͳ͍ͷͰؾ߹ೖΕ࣮ͯ͢Δඞཁ͋Δ
ͱͳΔͱؾʹͳΔ͜ͱ͕ ͋Γ·͢Ͷʁ
Ϣʔβʔϥϯυͷ"1* Ͳ͏ͳͬͯΜͩ
#4%TPDLFUʹ λΠϜελϯϓऔΔ"1*ͳ͍
·ͣTFUTPDLPQUͰઃఆ͢Δ https://docs.kernel.org/networking/timestamping.html#so-timestamping-also-so-timestamping-old-and-so-timestamping-new
·ͣTFUTPDLPQUͰઃఆ͢Δ https://docs.kernel.org/networking/timestamping.html#so-timestamping-also-so-timestamping-old-and-so-timestamping-new
·ͣTFUTPDLPQUͰઃఆ͢Δ https://docs.kernel.org/networking/timestamping.html#so-timestamping-also-so-timestamping-old-and-so-timestamping-new ΤϥʔΩϡʔʹ ใࠂ͞ΕΔ
·ͣTFUTPDLPQUͰઃఆ͢Δ https://docs.kernel.org/networking/timestamping.html#so-timestamping-also-so-timestamping-old-and-so-timestamping-new ʁʁʁ
λΠϜελϯϓ ΠϯλʔϑΣʔεΛ ഁյͯͭ͠Β͍ ʢਫ਼ӠʑΑΓͦΕ͕ͭΒ͍ʣ