Skip to main content

CSAPP

CSAPP 4.3 Sequential Y86-64 Implementations

·983 words·5 mins
๐Ÿ“ ์ƒ์„ธ ์ •๋ฆฌ # ์ด์ œ ์ˆœ์ฐจ์  ํ”„๋กœ์„ธ์„œ (SEQ)๋ฅผ ๋จผ์ € ๋งŒ๋“ค ๊ฒƒ์ด๋‹ค. ๊ฐ ํด๋ก์‚ฌ์ดํด์—์„œ, ์™„์ „ํ•œ ๋ช…๋ น์–ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ชจ๋“  ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๋А๋ฆด ๊ฒƒ์ด๋‹ค! 4.3.1 Organizing Processing into Stages # ์ผ๋ฐ˜์ ์œผ๋กœ, ๋ช…๋ น์–ด ์ฒ˜๋ฆฌ์—๋Š” ์—ฌ๋Ÿฌ ์—ฐ์‚ฐ์ด ์ˆ˜๋ฐ˜๋œ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ ๋ชจ๋“  ๋ช…๋ น์–ด๊ฐ€ ์ผ๊ด€๋œ ๋‹จ๊ณ„ ์‹œํ€€์Šค๋ฅผ ๋”ฐ๋ฅด๋„๋ก ํ•˜๊ณ ์‹ถ๋‹ค. ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค Fetch PC๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์ฃผ์†Œ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…๋ น์–ด ๋ฐ”์ดํŠธ ์ฝ๊ธฐ icode / ifun / ๋ ˆ์ง€์Šคํ„ฐ ์ง€์ •์ž / valC ๋“ฑ์„ ์ฝ๊ธฐ valP๋Š” ๋‹ค์Œ ๋ช…๋ น์–ด ์ฃผ์†Œ = PC์˜ ๊ฐ’์— ์ฝ์€ ๋ช…๋ น์–ด์˜ ๊ธธ์ด๋ฅผ ๋”ํ•œ ๊ฐ’ Decode ๋ ˆ์ง€์Šคํ„ฐํŒŒ์ผ์—์„œ ์ตœ๋Œ€ ๋‘๊ฐœ์˜ ์—ฐ์‚ฐ์ž๋ฅผ ์ฝ์–ด์„œ valA / valB ์ œ๊ณต Execute ๋ช…๋ น์–ด์— ์˜ํ•ด ์ง€์ •๋œ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜, ๋ฉ”๋ชจ๋ฆฌ ์ฐธ์กฐ์˜ ์ฃผ์†Œ๋ฅผ ๊ณ„์‚ฐํ•˜๊ฑฐ๋‚˜, ์Šคํƒํฌ์ธํ„ฐ๋ฅผ ์ฆ๊ฐ€/๊ฐ์†Œํ•˜๋Š” ๋“ฑ. ์ด ๊ฐ’์„ valE๋ผ๊ณ  ํ•œ๋‹ค. ์กฐ๊ฑด ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ • / ํ‰๊ฐ€ํ•˜๋Š”๊ฒƒ๋„ ์—ฌ๊ธฐ Memory ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๊ฑฐ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ค๊ธฐ ๊ทธ ๊ฐ’์„ valM์ด๋ผ๊ณ  ํ•œ๋‹ค. Write back ์ตœ๋Œ€ ๋‘๊ฐœ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ ˆ์ง€์Šคํ„ฐ ํŒŒ์ผ์— ์“ฐ๊ธฐ PC update PC๋ฅผ ๋‹ค์Œ ๋ช…๋ น์–ด ์ฃผ์†Œ๋กœ ์—…๋ฐ์ดํŠธ. ํ”„๋กœ์„ธ์„œ๋Š” ์œ„ ๊ณผ์ •์„ ๋ฌดํ•œํžˆ ๋ฐ˜๋ณตํ•œ๋‹ค. ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ• ๋•Œ ์ •์ง€ํ•œ๋‹ค halt / ์œ ํšจํ•˜์ง€ ์•Š์€ ๋ช…๋ น์–ด / ์œ ํšจํ•˜์ง€ ์•Š์€ ์ฃผ์†Œ ๋“ฑ ๋ณด๋‹ค ์™„์ „ํ•œ ์„ค๊ณ„์—์„œ๋Š” ์˜ˆ์™ธ์ฒ˜๋ฆฌ ๋ชจ๋“œ์— ์ง„์ž…ํ•ด์„œ ํŠน์ˆ˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ ๊ณผ์ •์ด ๋˜๊ฒŒ ๋งŽ๊ฒŒ ๋А๊ปด์ง€์ง€๋งŒ, ์ €๋ ‡๊ฒŒ ์ „์ฒด ํ๋ฆ„์„ ์œ ์‚ฌํ•˜๊ฒŒ ํ•ด์•ผ ํ•˜๋“œ์›จ์–ด์˜ ์–‘์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ๋ณต์žก์„ฑ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ ๋ช…๋ น์–ด๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋งŽ์€ ํ•˜๋“œ์›จ์–ด๋ฅผ ๊ณต์œ ํ•˜๋„๋ก ํ•œ๋‹ค๊ฑฐ๋‚˜.. ํ•˜๋“œ์›จ์–ด์—์„œ ๋…ผ๋ฆฌ๋ธ”๋Ÿญ์„ ์ค‘๋ณตํ•˜๋Š” ๋น„์šฉ์€ ์†Œํ”„ํŠธ์›จ์–ด์—์„œ ์ฝ”๋“œ๋ธ”๋Ÿญ์„ ์ค‘๋ณตํ•˜๋Š”๊ฑฐ๋ณด๋‹ค ํ›จ์”ฌ ๋น„์‹ธ๋‹ˆ๊นŒ! 4.3.2 SEQ Hardware Structure # ๋ชจ๋“  Y86-64 ๋ช…๋ น์–ด๋“ค์€ ์œ„์˜ 6๋‹จ๊ณ„์˜ ์—ฐ์†์œผ๋กœ ์กฐ์งํ™”ํ•  ๊ฒƒ์ด๋‹ค. ํ•˜๋“œ์›จ์–ด์ ์œผ๋กœ ์œ„์˜ 6๋‹จ๊ณ„๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜๋Š”๊ฐ€? Fetch PC ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ด์šฉํ•ด์„œ ๋ช…๋ น์–ด ๋ฐ”์ดํŠธ ์ฝ๊ธฐ, valP ๊ณ„์‚ฐ Decode ๋ ˆ์ง€์Šคํ„ฐ ํŒŒ์ผ์˜ ๋‘๊ฐœ์˜ ์ฝ๊ธฐํฌํŠธ๋ฅผ ํ†ตํ•ด valA, valB๋ฅผ ๋™์‹œ์— ์ฝ๋Š”๋‹ค. Execute ๋ช…๋ น์–ด ์œ ํ˜•์— ๋”ฐ๋ผ arithmetic / Logic ALU ์œ ๋‹›์„ ๋‹ค์–‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ์ค‘์— ์ž…๋ ฅ์ค‘ ํ•˜๋‚˜์— 0์„ ๋”ํ•˜์—ฌ ์ถœ๋ ฅ์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ๋”๋ฏธ adder๋„ ์žˆ๋‹ค! CC (Condition Code Register) ์„ธ๊ฐœ์˜ ์กฐ๊ฑด ์ฝ”๋“œ ๋น„ํŠธ๋ฅผ ๋ณด์œ ํ•จ ์ƒˆ๋กœ์šด ๊ฐ’์€ ALU์— ์˜ํ•ด ๊ณ„์‚ฐ๋˜๊ณ , ์กฐ๊ฑด๋ถ€ ์ด๋™ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ๋ชฉ์ ์ง€ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ• ์ง€๋ฅผ ๊ณ„์‚ฐํ•จ. ์ ํ”„๊ฐ™์€๊ฒƒ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€. Memory ๋ฉ”๋ชจ๋ฆฌ์˜ ์›Œ๋“œ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์”€. ๋ช…๋ น์–ด ๋ฉ”๋ชจ๋ฆฌ์™€ ๋ฐ์ดํ„ฐ ๋ฉ”๋ชจ๋ฆฌ๋Š” ๊ทธ๋ฆผ์—์„œ๋Š” ๋‹ค๋ฅด๊ฒŒ ๊ทธ๋ฆฌ์ง€๋งŒ, ๊ฒฐ๊ตญ ํ•˜๋‚˜์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์—‘์„ธ์Šคํ•˜๋Š”๊ฒƒ์ž„ Write back ๋ ˆ์ง€์Šคํ„ฐํŒŒ์ผ์˜ ๋‘๊ฐœ์˜ ์“ฐ๊ธฐ ํฌํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ž‘์„ฑ ํฌํŠธ E๋Š” ALU์˜ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์“ฐ๊ธฐ ์œ„ํ•ด, ํฌํŠธ M์€ ๋ฐ์ดํ„ฐ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ฝ์€ ๊ฐ’์„ ์“ฐ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ ๊ทธ๋ฆผ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ๋•Œ ๊ด€๋ก€ ํด๋Ÿญ ๋ ˆ์ง€์Šคํ„ฐ๋Š” ํฐ์ƒ‰ ์ง์‚ฌ๊ฐํ˜• (SEQ์—์„œ๋Š” PC๊ฐ€ ์œ ์ผํ•œ ํฌ๋Ÿญ ๋ ˆ์ง€์Šคํ„ฐ์ด๋‹ค) ํ•˜๋“œ์›จ์–ด ์œ ๋‹›์€ ์—ฐํ•œ ํŒŒ๋ž€์ƒ‰ ์‚ฌ๊ฐํ˜• ์ œ์–ด ๋กœ์ง ๋ธ”๋Ÿญ์€ ํšŒ์ƒ‰ ๋‘ฅ๊ทผ ์‚ฌ๊ฐํ˜• ์™€์ด์–ด ์ด๋ฆ„์€ ํฐ์ƒ‰ ์› (๋ผ๋ฒจ) ์›Œ๋“œ๋Š” ์ค‘๊ฐ„๋‘๊ป˜ ์„ , ๋ฐ”์ดํŠธ๋Š” ์–‡์€์„ , ๋‹จ์ผ๋น„ํŠธ๋Š” ์ ์„  4.3.3 SEQ Timing # SEQ๋Š” ์กฐํ•ฉ๊ธฐ์™€ ๋‘๊ฐ€์ง€ ํ˜•ํƒœ์˜ ๋ฉ”๋ชจ๋ฆฌ ์žฅ์น˜(ํด๋ก ๋ ˆ์ง€์Šคํ„ฐ, ๋žœ๋ค ์•ก์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ)๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ์กฐํ•ฉ๊ธฐ๋Š” ์‹œํ€€์‹ฑ์ด๋‚˜ ์ œ์–ด ์—†์ด, ์ž…๋ ฅ์ด ๋ณ€๊ฒฝ๋ ๋•Œ๋งˆ๋‹ค ๋…ผ๋ฆฌ๊ฒŒ์ดํŠธ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ „ํŒŒ๋œ๋‹ค. ๋žœ๋ค ์—‘์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ค๋Š” ๊ณผ์ •์€ ์ฃผ์†Œ ์ž…๋ ฅ์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ๊ณ„์‚ฐ๋œ๋‹ค๊ณ  ๋ด๋„ ๋œ๋‹ค. ๋ ˆ์ง€์Šคํ„ฐ ํŒŒ์ผ์—์„œ๋Š” ํ•ฉ๋ฆฌ์ ์ด๊ณ , ๋” ํฐ ํšŒ๋กœ์—์„œ๋„ ํŠน์ˆ˜ํ•œ ํด๋ก ํšŒ๋กœ๋ฅผ ์ด์šฉํ•ด์„œ ์ด๋ฅผ ๋ชจ๋ฐฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์จ์žˆ๋Š” ๋ง์ด ์ข€ ๋ณต์žกํ•œ๋ฐ, ๊ทธ๋ƒฅ ํšŒ๋กœ ๊ด€์ ์—์„œ ์–ด์ฐจํ”ผ ์“ฐ๊ธฐ๋„ ํด๋ก ์—ฃ์ง€์—์„œ๋งŒ ์ผ์–ด๋‚˜๊ณ , ์ฝ๊ธฐ๋Š” ์ฃผ์†Œ๋ฅผ ๋„ฃ์œผ๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚˜์˜ค๋Š” ๊ณผ์ •์ด๋‹ˆ๊นŒ ์กฐํ•ฉ ๋…ผ๋ฆฌ ๋ธ”๋ก์ด๋ž‘ ๋‹ค๋ฅผ๊ฒŒ ์—†๋‹ค๋Š” ๋ง์ธ ๊ฒƒ ๊ฐ™๋‹ค. ๋ช…๋ น์–ด ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋ช…๋ น์–ด ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ๋งŒ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ, ์ด ์œ ๋‹› ์ž์ฒด๋ฅผ ์กฐํ•ฉ๊ธฐ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด, ์‹œํ€€์‹ฑ์— ๋Œ€ํ•ด ๋ช…์‹œ์ ์œผ๋กœ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•œ๊ฑด PC, ์กฐ๊ฑด์ฝ”๋“œ ๋ ˆ์ง€์Šคํ„ฐ, ๋ฐ์ดํ„ฐ ๋ฉ”๋ชจ๋ฆฌ, ๋ ˆ์ง€์Šคํ„ฐ ํŒŒ์ผ 4๊ฐ€์ง€๊ฐ€ ๋‚จ๋Š”๋‹ค. ์ด๋“ค์€ ํด๋ก์‹ ํ˜ธ ํ•˜๋‚˜๋ฅผ ํ†ตํ•ด ์ œ์–ด๋˜๊ณ , ๋ ˆ์ง€์Šคํ„ฐ์— ๊ฐ’์„ ๋กœ๋“œํ•˜๊ณ  ๋žœ๋ค์•ก์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ์— ๊ฐ’์„ ์“ฐ๋Š” ํƒ€์ด๋ฐ์„ ํŠธ๋ฆฌ๊ฑฐํ•œ๋‹ค. PC๋Š” ๋งค ํด๋ก ์‚ฌ์ดํด๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋ช…๋ น์–ด ์ฃผ์†Œ๋ฅผ ๋กœ๋“œํ•˜๊ณ , ์กฐ๊ฑด์ฝ”๋“œ ๋ ˆ์ง€์Šคํ„ฐ๋Š” OPq์—์„œ๋งŒ ๋กœ๋“œ๋˜๊ณ , ๋ฐ์ดํ„ฐ๋ฉ”๋ชจ๋ฆฌ๋Š” rmmovq, pushq, call์—์„œ๋งŒ ์“ฐ์ด๊ณ … ๋ ˆ์ง€์Šคํ„ฐ ํŒŒ์ผ์˜ ์“ฐ๊ธฐ ํฌํŠธ๋Š” ๋งค ์‚ฌ์ดํด๋งˆ๋‹ค ๋‘๊ฐœ์˜ ํ”„๋กœ๊ทธ๋žจ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํŠน์ˆ˜ ๋ ˆ์ง€์Šคํ„ฐ ID์ธ 0xF๋ฅผ ํฌํŠธ์ฃผ์†Œ๋กœ ์‚ฌ์šฉํ•ด์„œ ์“ฐ๊ธฐ๊ฐ€ ์—†๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ํด๋กing๋Š” ์‹œํ€€์‹ฑ์„ ์ œ์–ดํ•˜๋Š”๋ฐ ๊ผญ ํ•„์š”ํ•œ ๊ฒƒ๋“ค์ด๋‹ค. ์›์น™: No reading back ํ”„๋กœ์„ธ์Šค๋Š” ๋ช…๋ น์–ด ์ฒ˜๋ฆฌ๋ฅผ ์™„๋ฃŒํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ๋ช…๋ น์–ด์— ์˜ํ•ด ์—…๋ฐ์ดํŠธ ๋œ ์ƒํƒœ๋ฅผ ์ฝ์„ ํ•„์š”๊ฐ€ ์—†๋‹ค.

CSAPP 4.2 Logic design ant the Hardware Contrlop Language HCL

·484 words·3 mins
๐Ÿ“ ์ƒ์„ธ ์ •๋ฆฌ # 4.2.0 ํ•˜๋“œ์›จ์–ด ์ƒ์—์„œ ์ „์ž ํšŒ๋กœ๋Š” ๋น„ํŠธ๋“ค ์ƒ์˜ ํ•จ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  / ์ƒ์ดํ•œ ์ข…๋ฅ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ์š”์†Œ๋“ค์— ๋น„ํŠธ๋“ค์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ๋…ผ๋ฆฌ๊ฐ’ 1์€ 1๋ณผํŠธ ๋‚ด์™ธ์˜ ๊ณ ์ „์••, 0์€ 0๋ณผํŠธ ๋‚ด์™ธ์˜ ์ €์ „์••์œผ๋กœ ํ‘œํ˜„ํ•œ๋‹ค. ๋””์ง€ํ„ธ ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ธ๊ฐ€์ง€ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋น„ํŠธ์— ๋Œ€ํ•œ ํ•จ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•œ ์กฐํ•ฉ ๋กœ์ง ๋น„ํŠธ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์š”์†Œ ๋ฉ”๋ชจ๋ฆฌ ์š”์†Œ์˜ ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•œ ํด๋ก ์‹ ํ˜ธ 4.2.1 Logic Gates ๋…ผ๋ฆฌ ๊ฒŒ์ดํŠธ๋Š” ๋””์ง€ํ„ธ ํšŒ๋กœ์˜ ๊ธฐ๋ณธ ์ปดํ“จํŒ… ์š”์†Œ์ด๋‹ค. bool๊ฐ’์— ๋Œ€ํ•œ and, or, not ์—ฐ์‚ฐ && & / || | ์ฐจ์ด && || ๋Š” ๋…ผ๋ฆฌ์—ฐ์‚ฐ์ž -> ๊ฒฐ๊ณผ๋Š” 0 or 1 & |๋Š” ๋น„ํŠธ์—ฐ์‚ฐ์ž -> ๊ฒฐ๊ณผ๋Š” ๊ฐ ๋น„ํŠธ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•œ ๊ฐ’ ๋…ผ๋ฆฌ๊ฒŒ์ดํŠธ๋Š” ํ•ญ์ƒ ํ™œ์„ฑํ™” ๋˜์–ด์žˆ๋‹ค. ์ž…๋ ฅ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ž ์‹œํ›„์— ๊ทธ์—๋”ฐ๋ผ ์ถœ๋ ฅ์ด ์ˆ˜์ •๋  ๊ฒƒ 4.2.2 Combinational circuits and HCL Boolean Ecpressions ๋‹ค์ˆ˜์˜ ๋…ผ๋ฆฌ ๊ฒŒ์ดํŠธ๋ฅผ ๋„คํŠธ์›Œํฌ๋กœ ์กฐ๋ฆฝํ•˜๋ฉด์„œ ์šฐ๋ฆฌ๋Š” ์กฐํ•ฉ ํšŒ๋กœ๋กœ ์•Œ๋ ค์ง„ ๊ณ„์‚ฐ ๋ธ”๋ก์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ ๋ช‡๊ฐ€์ง€ ์ œํ•œ์ด ์žˆ๋Š”๋ฐ ๋ชจ๋“  ๋…ผ๋ฆฌ ๊ฒŒ์ดํŠธ์˜ ์ž…๋ ฅ์€ ๋‹ค์Œ ์„ธ๊ฐ€์ง€์ค‘ ์ •ํ™•ํžˆ ํ•˜๋‚˜์— ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•œ๋‹ค. ์‹œ์Šคํ…œ ์ž…๋ ฅ(1์ฐจ ์ž…๋ ฅ) ์ผ๋ถ€ ๋ฉ”๋ชจ๋ฆฌ์š”์†Œ์˜ ์ถœ๋ ฅ ์ผ๋ถ€ ๋…ผ๋ฆฌ๊ฒŒ์ดํŠธ์˜ ์ถœ๋ ฅ ๋‘˜ ์ด์ƒ์˜ ๋…ผ๋ฆฌ ๊ฒŒ์ดํŠธ์˜ ์ถœ๋ ฅ์€ ํ•จ๊ป˜ ์—ฐ๊ฒฐ๋  ์ˆ˜ ์—†๋‹ค. (?wire ๋ฅผ ์ƒ์ดํ•œ ์ „์••์„ ํ–ฅํ•ด ๊ตฌ๋™์‹œ์ผœ์„œ ํšŒ๋กœ ์˜ค๋™์ž‘์„ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค.) ์•„ํ•˜, ์ด๊ฒŒ ๋ฌด์Šจ์†Œ๋ฆฐ๊ฐ€ ํ–ˆ๋Š”๋ฐ ๋‘ ์ถœ๋ ฅ๋ถ€๋ฅผ ์—ฐ๊ฒฐํ•˜๋ฉด ํ•˜๋‚˜๊ฐ€ 1, ํ•˜๋‚˜๊ฐ€ 0์ด์—ˆ๋‹ค๋ฉด ์—ฐ๊ฒฐ๋ ๋•Œ ์ข€ ๊ณค๋ž€ํ•ด์ง„๋‹ค! ์ „์›๊ณผ ์ ‘์ง€๊ฐ€ ๋งŒ๋‚˜๋Š”๊ฒƒ๋„ ์ด์Šˆ๊ณ . ๋„คํŠธ์›Œํฌ๋Š” ๋น„์ˆœํ™˜์ ์ด์–ด์•ผ ํ•œ๋‹ค. ๋ฃจํ”„๋Š” ๋„คํŠธ์›Œํฌ์— ์˜ํ•ด ๊ณ„์‚ฐ๋œ ํ•จ์ˆ˜์— ๋ชจํ˜ธ์„ฑ์„ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค. 4.2.3 Word-Level Combinational Circuits and HCL Integer Expressions ํฐ ๋…ผ๋ฆฌ ๊ฒŒ์ดํŠธ ๋„คํŠธ์›Œํฌ๋ฅผ ์กฐ๋ฆฝํ•จ์œผ๋กœ์จ ์šฐ๋ฆฌ๋Š” ํ›จ์”ฌ ๋” ๋ณต์žกํ•œ ํ•จ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค. word ๋‹จ์œ„๋กœ ์—ฐ์‚ฐํ•ด์•ผ์ง€! ์ •์ˆ˜, ์ฃผ์†Œ, instuction ์ฝ”๋“œ, ๋ ˆ์ง€์Šคํ„ฐ ์‹๋ณ„์ž ๋“ฑ 4~64๋น„ํŠธ ๋ฒ”์œ„์˜ ์ˆ˜๋งŽ์€ word๊ฐ€ ์žˆ์„ ๊ฒƒ ์•ž์œผ๋กœ ๊ทธ๋ฆผ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ๋•Œ ์ ์„ ์€ ๋น„ํŠธ๋‹จ์œ„, ์ค‘๊ฐ„ํฌ๊ธฐ ์‹ค์„ ์€ word๋‹จ์œ„ 4.2.4 Set MemberShip HCL์—์„œ or์—ฐ์‚ฐ์ด ๋ถ™์–ด์žˆ๋Š” ์ฝ”๋“œ๋Š” in ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 4.2.5 Memory and Clocking ์กฐํ•ฉํšŒ๋กœ๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ์–ด๋–ค ์ •๋ณด๋„ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ ์ˆœ์ฐจํšŒ๋กœ๊ฐ€ ํ•„์š”ํ•ด์ง€๋ฉด, ์šฐ๋ฆฌ๋Š” ๋น„ํŠธ๋กœ ํ‘œํ˜„๋˜๋Š” ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ์žฅ์น˜๋ฅผ ๋„์ž…ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋Š” ์ƒˆ๋กœ์šด ๊ฐ’์ด ์žฅ์น˜์— ๋กœ๋“œ๋  ๋•Œ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์ฃผ๊ธฐ์ ์ธ ์‹ ํ˜ธ์ธ ๋‹จ์ผ ํด๋Ÿญ์— ์˜ํ•ด ์ œ์–ด๋œ๋‹ค. ํด๋ก ๋ ˆ์ง€์Šคํ„ฐ๋Š” ๊ฐœ๋ณ„ ๋น„ํŠธ / ์›Œ๋“œ๋ฅผ ์ €์žฅํ•จ ๋žœ๋ค ์•ก์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฝ๊ฑฐ๋‚˜ ์“ธ ๋‹จ์–ด๋ฅผ ์„ ํƒํ•˜๋ฉด์„œ ์—ฌ๋Ÿฌ ์›Œ๋“œ๋ฅผ ์ €์žฅํ•จ ๋Œ€ํ‘œ์ ์œผ๋กœ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ์‹œ์Šคํ…œ, ๋ ˆ์ง€์Šคํ„ฐ ํŒŒ์ผ ๋“ฑ ์•„๋ฌดํŠผ ์ด ๋‘๊ฐ€์ง€ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ๊ฐ๊ฐ ํ•˜๋“œ์›จ์–ด ๋ ˆ์ง€์Šคํ„ฐ / ํ”„๋กœ๊ทธ๋žจ ๋ ˆ์ง€์Šคํ„ฐ๋ผ๊ณ  ํ•˜์ž. ๋ ˆ์ง€์Šคํ„ฐ ํŒŒ์ผ์€ ๋‚ด๋ถ€ ์ €์žฅ์žฅ์น˜๋ฅผ ๊ฐ–๊ธฐ์— ์กฐํ•ฉํšŒ๋กœ๊ฐ€ ์•„๋‹ˆ๋‹ค. ์•„ํ•˜, ์ด๊ฒŒ ์ข…ํ•ฉ์ ์œผ๋กœ ๋ฌด์Šจ๋ง์ธ์ง€ ์ฒœ์ฒœํžˆ ์ฝ์œผ๋ฉด์„œ ์ดํ•ดํ•ด๋ณด์ž. ๊ฒฐ๊ตญ ๊ฐ’์„ ์ €์žฅํ•  ์ผ์€ ๋ถ„๋ช…ํžˆ ์ƒ๊ธด๋‹ค. ์ „์— ๊ณ„์‚ฐํ•œ ๊ฒฐ๊ณผ๋ฅผ ํ™œ์šฉํ•˜๋˜๊ฐ€ ํ•ด์•ผํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ. ์ž˜ ์•Œ๋“ฏ์ด ๊ทธ๊ฑธ ์ €์žฅํ•˜๋Š” ๋ถ€๋ถ„์€ CPU์˜ ๋ ˆ์ง€์Šคํ„ฐ๋‹ค. CPU์— ๋‹ฌ๋ ค์žˆ๋Š” ๊ทธ ์นœ๊ตฌ๋ฅผ ํ•˜๋“œ์›จ์–ด ๋ ˆ์ง€์Šคํ„ฐ๋ผ๊ณ  ๋ถ€๋ฅด์ž. ๊ทธ๋Ÿฌ๋ฉด ์ €์žฅ์„ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”๊ฐ€? CPU์—์„œ๋Š” ์•ˆ์—์„œ D-ํ”Œ๋ฆฝํ”Œ๋ž์ด๋ผ๋Š”๊ฑธ ์ด์šฉํ•ด์„œ, ์•ˆ์— ์ „๋ฅ˜๋ฅผ ๊ฐ€๋‘๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค. ๊ฐ€๋‘๋Š” ํƒ€์ด๋ฐ์€ ํด๋ก ์‹ ํ˜ธ (0-1 ์ง„๋™์‹ ํ˜ธ)๊ฐ€ ์ผœ์ง€๋Š” ๊ทธ ํƒ€์ด๋ฐ์ด๋‹ค. X86-64์—๋Š” ์ด 16๊ฐœ์˜ ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ์žˆ์œผ๋‹ˆ๊นŒ, ํ•˜๋“œ์›จ์–ด ๋ ˆ์ง€์Šคํ„ฐ๋Š” ์ด 16๊ฐœ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ๋“ค์— ๋Œ€ํ•œ ๋ฌถ์Œ์„ ๋ ˆ์ง€์Šคํ„ฐ ํŒŒ์ผ์ด๋ผ๊ณ  ํ•œ๋‹ค. ์™œ ๋ฌถ์–ด์„œ ๋ณด๊ด€ํ•˜๋Š”๊ฐ€? ๊ทธ๊ฑด 16๊ฐœ์— ๋Œ€ํ•ด ๋ชจ๋“  ALU์— ๋‹ค๋Š”๊ฒŒ ์—๋ฐ”๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์œ„์— MUX, ์„ ํƒ๊ธฐ๋งˆ๋ƒฅ ์ด ๋ ˆ์ง€์Šคํ„ฐ์—์„œ๋„ ๋น„ํŠธ๋งˆ์Šคํ‚น ๊ฒฐ๊ณผ์ฒ˜๋Ÿผ ์—ฐ์‚ฐํ•ด์„œ ๊ฐ’์„ ์–ป์–ด๋‚ด๋Š”๊ฒŒ ํšŒ๋กœ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ ํ›จ์”ฌ ๋” ์‰ฝ๋‹ค. ๋”ฐ๋ผ์„œ ๊ทธ ๋ณด๋“œ ์œ„์˜ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ํ•˜๋“œ์›จ์–ด ๋ ˆ์ง€์Šคํ„ฐ, ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์“ฐ๋Š” %rax๊ฐ™์€๊ฑธ ํ”„๋กœ๊ทธ๋žจ ๋ ˆ์ง€์Šคํ„ฐ๋ผ๊ณ  ํ•œ๋‹ค. โ”์งˆ๋ฌธ ์‚ฌํ•ญ # ๋ฃจํ”„๋Š” ๋„คํŠธ์›Œํฌ์— ์˜ํ•ด ๊ณ„์‚ฐ๋œ ํ•จ์ˆ˜์— ๋ชจํ˜ธ์„ฑ์„ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์™œ? AND / OR ๊ฐ™์€ ํšŒ๋กœ๋“ค๋กœ ๋ฃจํ”„๋ฅผ ๋งŒ๋“ค๋ฉด ์ „์••์ด ์ง„๋™ํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ์ค‘๊ฐ„์—์„œ ๋ฉˆ์ถฐ๋ฒ„๋ฆฐ๋‹ค!

CSAPP Chapter 4 Processor Architecture

·139 words·1 min
๐Ÿ“ ์ƒ์„ธ ์ •๋ฆฌ # ์ง€๊ธˆ๊นŒ์ง€ ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์„ ๊ธฐ๊ณ„์–ด ์ˆ˜์ค€์œผ๋กœ๋งŒ ๋ณด์•˜๋‹ค. ํ”„๋กœ์„ธ์„œ๋Š” ๋‘ ์ˆ˜๋ฅผ ๋”ํ•˜๋Š” ๊ฒƒ ๊ฐ™์€ ์›์‹œ์ ์ธ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค๋Š”๊ฒƒ์„ ์•ˆ๋‹ค. ๋ช…๋ น์–ด๋Š” 1๋ฐ”์ดํŠธ ์ด์ƒ์˜ ์‹œํ€€์Šค๋กœ ์ด์ง„ ํ˜•ํƒœ๋กœ ์ธ์ฝ”๋”ฉ ๋˜๋Š”๊ฒƒ๋„ ์•ˆ๋‹ค. ํŠน์ • ํ”„๋กœ์„ธ์Šค์— ์˜ํ•ด ์ง€์›๋˜๋Š” ๋ช…๋ น์–ด๋“ค ๋ฐ ๊ทธ ์ธ์ฝ”๋”ฉ๋“ค์„ ISA (Instruction set Architecture)๋ผ๊ณ  ํ•œ๋‹ค. ์ธํ…” IA32, x86-64, ARMํ”„๋กœ์„ธ์„œ ํŒจ๋ฐ€๋ฆฌ ๋“ฑ ๋‹ค๋ฅธ ํŒจ๋ฐ€๋ฆฌ๋“ค์€ ๋‹ค๋ฅธ ISA๋ฅผ ๊ฐ€์ง„๋‹ค. ํ•œ ์ข…๋ฅ˜์˜ ๊ธฐ๊ณ„์— ๋Œ€ํ•ด ์ปดํŒŒ์ผ ๋œ ํ”„๋กœ๊ทธ๋žจ์€ ๋‹ค๋ฅธ๋ฐ์„œ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค. ๋‹จ์ผ ํŒจ๋ฐ€๋ฆฌ ๋‚ด์—๋Š” ๋‹ค์–‘ํ•œ ํ”„๋กœ์„ธ์„œ ๋ชจ๋ธ์ด ์žˆ๋‹ค. ์ด ๋˜ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ์ž‘์„ฑ์ž์™€ ํ”„๋กœ์„ธ์„œ ์„ค๊ณ„์ž ๊ฐ„์˜ ๊ฐœ๋…์  ์ถ”์ƒํ™” ๋ ˆ์ด์–ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค! ์ด ์žฅ์—์„œ ๋ฐฐ์šธ ๊ฒƒ ํ”„๋กœ์„ธ์„œ ํ•˜๋“œ์›จ์–ด์˜ ์„ค๊ณ„ (๊ฐ„๋žตํžˆ) ๊ฐ„๋‹จํ•œ ๋ช…๋ น์–ด ์…‹ ์ •์˜ํ•˜๊ธฐ (Y86-64) ๋””์ง€ํ„ธ ํ•˜๋“œ์›จ์–ด ๋””์ž์ธ์— ๋Œ€ํ•œ ๋ช‡๊ฐ€์ง€ ๋ฐฐ๊ฒฝ ๊ธฐ๋ณธ ๋นŒ๋”ฉ ๋ธ”๋ก๋“ค ์ž์ฒด, ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋“ค์ด ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋Š”์ง€ ํ•˜๋“œ์›จ์–ด ์‹œ์Šคํ…œ์˜ ์ œ์–ด ๋ถ€๋ถ„์„ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•œ ์–ธ์–ด์ธ HCL (Hardware Control language) ์ˆœ์ฐจ์  ๋™์ž‘์— ๊ธฐ์ดˆํ•œ Y86-64 ํ”„๋กœ์„ธ์„œ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ ์šฉํ•œ ํ”„๋กœ์„ธ์„œ (5๋‹จ๊ณ„ ๋ถ„๋ฅ˜) โ”์งˆ๋ฌธ ์‚ฌํ•ญ # ๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ #

CSAPP 4.1 The Y86-64 Instuction Set Architecture

·615 words·3 mins
๐Ÿ“ ์ƒ์„ธ ์ •๋ฆฌ # ISA๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์€ ์ปดํฌ๋„ŒํŠธ๋“ค, ๋ช…๋ น์–ด๋“ค, ์ธ์ฝ”๋”ฉ, ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ปจ๋ฒค์…˜ ์„ธํŠธ ๋“ฑ์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ํฌํ•จํ•œ๋‹ค. 4.1.1 Programmer-Visible State Y86-64 ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฐ ๋ช…๋ น์–ด๋Š” ํ”„๋กœ์„ธ์„œ ์ƒํƒœ์˜ ์ผ๋ถ€๋ฅผ ํŒ๋…ํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋จธ ๊ฐ€์‹œํ™” (programmer-visible) ์ƒํƒœ๋ผ๊ณ  ํ•œ๋‹ค. programmer์€ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ์—์„œ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋Š” ์‚ฌ๋žŒ ํ˜น์€ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์˜๋ฏธํ•จ Y86-64์˜ ๋ ˆ์ง€์Šคํ„ฐ๋Š” x86-64์™€ ๋น„์Šทํ•˜๊ฒŒ %rax %rbx… %r14๊นŒ์ง€ ์žˆ๋‹ค. ๊ฐ ๋ ˆ์ง€์Šคํ„ฐ๋Š” 64๋น„ํŠธ word๋ฅผ ์ €์žฅํ•˜๊ณ , %rsp๋Š” ์Šคํƒ ํฌ์ธํ„ฐ๋กœ ์‚ฌ์šฉ๋˜๊ณ … ์ •๋ณด ์กฐ๊ฑด ์ฝ”๋“œ๋Š” ZF, SF, OF 3๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•œ๋‹ค. PC (Program Counter)์€ ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ๋ช…๋ น์–ด์˜ ์ฃผ์†Œ๋ฅผ ๋ณด์œ ํ•œ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๋Š” ํ”„๋กœ๊ทธ๋žจ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์œ ์ง€ํ•œ๋‹ค. ๊ฐ€์ƒ ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฐธ์กฐ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜๋ฅผ ํ”„๋กœ๊ทธ๋žจํ•  ๊ฒƒ 4.1.2 Y86-64 Instructions ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค Y86-64 ISA๋Š” x86-64์˜ ์„œ๋ธŒ์…‹์ด๋‹ค. 8๋ฐ”์ดํŠธ ์ •์ˆ˜ ์—ฐ์‚ฐ๋งŒ์„ ํฌํ•จ ๋” ์ ์€ ์–ด๋“œ๋ ˆ์‹ฑ ๋ชจ๋“œ ๋” ์ž‘์€ ์—ฐ์‚ฐ ์„ธํŠธ 8๋ฐ”์ดํŠธ๋งŒ ํ•˜๋‹ˆ๊นŒ, ๊ทธ๋ƒฅ word๋ผ๊ณ  ๋ถˆ๋Ÿฌ๋„ ๋œ๋‹ค! movq๋Š” ir, rr, mr, rm movq 4๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. i๋Š” immediate๊ฐ’, r์€ ๋ ˆ์ง€์Šคํ„ฐ, m์€ ๋ฉ”๋ชจ๋ฆฌ ์ •์ˆ˜์—ฐ์‚ฐ์€ addq, subq, andq, xorq 4๊ฐ€์ง€๋กœ, ๋ ˆ์ง€์Šคํ„ฐ ๋ฐ์ดํ„ฐ์—๋งŒ ๋™์ž‘ํ•˜๋„๋ก ํ•  ๊ฒƒ์ด๋‹ค. ๋ฌผ๋ก  ZF, SF, OF๋„ ์„ค์ •ํ•ด์•ผํ•œ๋‹ค. ์ ํ”„ ๋ช…๋ น์–ด๋Š” jmp, jle, jl, je, jne, jge, jg 7๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ์กฐ๊ฑด๋ถ€ ์ด๋™์—๋Š” cmovle, cmovl, cmove, cmovne, cmovge, cmovg 6๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. call์€ ์Šคํƒ์— return address๋ฅผ pushํ•˜๊ณ  jumpํ•œ๋‹ค. pushq, popq๋„ ๋ฌผ๋ก  ์žˆ๋‹ค. hlt์ด ๋‚˜์˜ค๋ฉด ์ƒํƒœ์ฝ”๋“œ๊ฐ€ HLT๋กœ ์„ค์ •๋œ ์ƒํƒœ์—์„œ ํ”„๋กœ์„ธ์„œ๊ฐ€ ์ •์ง€๋œ๋‹ค. 4.1.3. Insturction Encoding ๊ฐ instuction์—๋Š” ์–ด๋–ค ํ•„๋“œ๊ฐ€ ํ•„์š”ํ•œ์ง€์— ๋”ฐ๋ผ 1~10๋ฐ”์ดํŠธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋ชจ๋“  insturction์€ ์œ ํ˜•์„ ์‹๋ณ„ํ•˜๋Š” ์ดˆ๊ธฐ ๋ฐ”์ดํŠธ๊ฐ€ ์žˆ๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ์œ„์˜ 4๋น„ํŠธ๋Š” ์ฝ”๋“œ๋ถ€๋ถ„, ์•„๋ž˜ 4๋น„ํŠธ๋Š” ํ•จ์ˆ˜ ๋ถ€๋ถ„์ด๋‹ค. ์ฝ”๋“œ๋ถ€๋ถ„์€ 0 ~ 0xB ๊นŒ์ง€์˜ ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง„๋‹ค. ํ•จ์ˆ˜๋ถ€๋ถ„์€ ๊ด€๋ จ instuction์ด ๊ฐ™์€ ์ฝ”๋“œ๋ถ€๋ถ„์„ ๊ณต์œ ํ•  ๋•Œ๋งŒ ์œ ์˜ํ•˜๋‹ค. (OPq ๋“ฑ) jmp๋Š” 0x70์ด์–ด์•ผํ•˜๋Š”๊ฒƒ์ฒ˜๋Ÿผ. ๋’ค์˜ 1๋ฐ”์ดํŠธ๋Š” ๋ ˆ์ง€์Šคํ„ฐ ์‹๋ณ„์ž์ด๋‹ค. x86-64์™€ ์ผ์น˜ํ•˜๊ฒŒ ํ•˜๊ฒ ๋‹ค. ๋’ค์˜ 8๋ฐ”์ดํŠธ๋Š” ์ƒ์ˆ˜ word ์˜์—ญ์ด๋‹ค. ์ผ๋ถ€ ๋ช…๋ น์–ด๋Š” ๊ธธ์ด๊ฐ€ 1๋ฐ”์ดํŠธ๋ฟ์ด ์•ˆ๋˜์ง€๋งŒ ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ์ƒ์ˆ˜ํŒŒํŠธ๊ฐ€ ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ํ•˜๋ฉด ์ปค์ง„๋‹ค. x86-64์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‹ค Little Endian์ด๋‹ค!! ์˜ˆ๋ฅผ ๋“ค์–ด rmmovq %rsp, 0x123456789abcd(%rdx)๋Š” rmmovq -> 40, %rsp %rdx -> 42, ์ƒ์ˆ˜๋Š” ๋ฆฌํ‹€์—”๋””์•ˆ ์ฒ˜๋ฆฌ๋˜์–ด 40 42 cd ab 89 67 45 23 01 00 ์œผ๋กœ ์ธ์ฝ”๋”ฉ๋  ๊ฒƒ์ด๋‹ค. 4.1.4 Y86-64 Exceptions ์‹คํ–‰ ํ”„๋กœ๊ทธ๋žจ์˜ ์ „์ฒด ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒํƒœ ์ฝ”๋“œ๋„ ์žˆ๋‹ค. ๋ชจ๋‘ ์ •์ƒ์ธ AOK halt๋ฅผ ๋งŒ๋‚œ HLT ์ž˜๋ชป๋œ ์ฃผ์†Œ๋ฅผ ๋งŒ๋‚œ ADR ์ž˜๋ชป๋œ instruction์„ ๋งŒ๋‚œ INS 4.1.5 Y86-64 Programs Y86-64๋Š” x86-64์™€ ๋‹ฌ๋ฆฌ immediate ๊ฐ’์„ ์ด์šฉํ•œ ์—ฐ์‚ฐ์ด ์•ˆ๋˜๊ธฐ๋•Œ๋ฌธ์—, ๋ ˆ์ง€์Šคํ„ฐ์— ๋กœ๋“œํ•˜๊ณ  ์‚ฌ์šฉํ•œ๋‹ค. “.“๋กœ ์‹œ์ž‘ํ•˜๋Š” word๋Š” ์–ด์…ˆ๋ธ”๋Ÿฌ์—๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฃผ์†Œ๋ฅผ ์กฐ์ •ํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ์˜ ์ผ๋ถ€ ๋‹จ์–ด๋ฅผ ์‚ฝ์ž…ํ•˜๋„๋ก ์ง€์‹œํ•˜๋Š” ์–ด์…ˆ๋ธ”๋Ÿฌ ์ง€์‹œ์ด๋‹ค. “.pos 0"์€ ์–ด์…ˆ๋ธ”๋Ÿฌ๊ฐ€ ์ฃผ์†Œ 0์—์„œ ์‹œ์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์‹œ์ž‘ํ•ด์•ผ ํ•จ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. 38 # Stack starts here and grows to lower addresses 39 .pos 0x200 40 stack: ์ด์™€๊ฐ™์ด ์Šคํƒ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•ด์„œ ๋” ๋‚ฎ์€์ฃผ์†Œ๋กœ ํ™•์žฅ๋˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. 7 # Array of 4 elements 8 .align 8 9 array : 10 .quad 0x000d000d000d 11 .quad 0x00c000c000c0 12 .quad 0x0b000b000b00 13 .quad 0xa000a000a000 ๋ฐฐ์—ด์˜ ์‹œ์ž‘์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, 8๋ฐ”์ดํŠธ ์ •๋ ฌ์ด ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ์ด์™€ ๊ฐ™์ด Y86-64๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์šฐ๋ฆฌ์˜ ๋„๊ตฌ๋Š” ์–ด์…ˆ๋ธ”๋Ÿฌ์ด๊ธฐ์— ์šฐ๋ฆฌ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ, ๋ง์ปค, ๋Ÿฐํƒ€์ž„ ์‹œ์Šคํ…œ ์œ„์ž„ ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค. 4.1.6 Some Y86-64 Instruction details pushq ๋ช…๋ น์–ด๋Š” ์Šคํƒํฌ์ธํ„ฐ๋ฅผ ๋ชจ๋‘ 8๋งŒํผ ๊ฐ์†Œ์‹œํ‚ค๊ณ  ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด pushq %rsp๋Š”? 1 .text 2 .globl pushtest 3 pushtest: 4 movq %rsp, %rax Copy stack pointer 5 pushq %rsp Push stack pointer 6 Popd %rdx Pop it back 7 subq %rdx, %rax Return 0 or 4 8 ret x86-64์—์„œ, ์œ„ ์ฝ”๋“œ๋Š” ์–ธ์ œ๋‚˜ 0๋งŒ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋Š” 4๋งŒํผ ๋•ก๊ธฐ๊ธฐ ์ „์˜ ๊ธฐ์กด %rsp๊ฐ’์„ pushํ•˜๋Š”๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. 1 .text 2 .globl poptest 3 poptest: 4 movq %rsp, %rdi Save stack pointer 5 pushq $0xabcd Push test value 6 popq %rsp Pop to stack pointer 7 movq %rsp, %rax Set popped value as return value 8 movq %rdi, %rsp Restore stack pointer 9 ret ํ•ด๋‹น ์ฝ”๋“œ๋„ ์–ธ์ œ๋‚˜ 0xabcd๋งŒ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋Š” ๋˜ํ•œ %rsp์— ๊ฐ’์„ ๋„ฃ๊ณ  %rsp๋ฅผ ์›€์ง์ž„์„ ์˜๋ฏธํ•œ๋‹ค. โ”์งˆ๋ฌธ # ์ธ์ฝ”๋”ฉ๋œ ๋ฐ”์ดํŠธ์— ๋”ฐ๋ผ ํ•ด์„ํ•ด์„œ ๊ฐ„๋‹จํ•œ ์—ฐ์‚ฐ๋งŒ์œผ๋กœ ๋ณต์žกํ•œ ํ”„๋กœ๊ทธ๋žจ์ด ๋Œ์•„๊ฐ„๋‹ค๋Š”๊ฑด ์•Œ๊ฒ ๋Š”๋ฐ, ๊ทธ๋ž˜์„œ ํ”„๋กœ์„ธ์„œ๊ฐ€ ์‹ค์ œ๋กœ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ๋“ค์„ ์–ด๋–ป๊ฒŒ ์—ฐ์‚ฐํ•˜๋Š”๊ฑฐ์ง€? ํ”„๋กœ์„ธ์„œ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ์‹ค์ œ๋กœ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ๊ฐ€ ํ๋ฅด๋Š” ๊ธธ ์ž์ฒด๋ฅผ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์—ด๊ณ  ๋‹ซ๋Š”๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด addq %rax, %rdx๊ณผ ๊ฐ™์€ ์ธ์ฝ”๋”ฉ์ด ๋“ค์–ด์˜ค๋ฉด, ์ œ์–ด ์œ ๋‹›์—์„œ ๋”ํ•˜๊ธฐ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ALU๋ฅผ ํ‚ค๊ณ , %rax๊ณผ %rdx์˜ ํ†ต๋กœ๋ฅผ ์—ด์–ด์„œ ๊ฒฐ๊ตญ ๊ฒฐ๊ณผ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ์ „์•• ํŒจํ„ด์„ ์–ป๋Š”๋‹ค.

CSAPP Attack Lab

·1218 words·6 mins
๐Ÿ“ ์ƒ์„ธ ์ •๋ฆฌ # Part I: Code Injection Attacks # ์ƒˆ๋กœ์šด ์ฝ”๋“œ๋ฅผ ์ธ์ ์…˜ํ•˜์ง€๋Š” ์•Š๊ณ , string์„ ์ง์ ‘ ๋ฐ•์•„๋„ฃ์–ด์„œ ์กด์žฌํ•˜๋Š” ํ”„๋กœ์‹œ์ ธ๋กœ ๊ฝ‚์„๊ฒƒ์ด๋‹ค. void test() { int val; val = getbuf(); printf("No exploit. Getbuf returned 0x%x\n", val); } ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ์— ์ง์ ‘ ๋„ฃ์„ ์˜ˆ์ • Level 1 # void touch1() ํ•จ์ˆ˜๋กœ ๊ฐ€๊ฒŒ ๋งŒ๋“ค์ž. 00000000004017a8 <getbuf>: 4017a8: 48 83 ec 28 sub $0x28,%rsp 4017ac: 48 89 e7 mov %rsp,%rdi 4017af: e8 8c 02 00 00 call 401a40 <Gets> 4017b4: b8 01 00 00 00 mov $0x1,%eax 4017b9: 48 83 c4 28 add $0x28,%rsp 4017bd: c3 ret 4017be: 90 nop 4017bf: 90 nop getbuf ํ•จ์ˆ˜๋ฅผ ๋ณด๋‹ˆ, 0x28 = 40๋ฐ”์ดํŠธ๋ฅผ ์Šคํƒ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹นํ•˜๊ณ , getํ•จ์ˆ˜๋ฅผ ๋ถ€๋ฅธ๋‹ค.

CSAPP 3.12 Summary

·134 words·1 min
๐Ÿ“ ์ƒ์„ธ ์ •๋ฆฌ # ๊ทธ๋™์•ˆ C์–ธ์–ด์˜ ์ถ”์ƒํ™” ์ธต์„ ์‚ดํŽด๋ดค๋‹ค! 5์žฅ์—์„œ ์ปดํŒŒ์ผ๋Ÿฌ์˜ ํŠน์„ฑ์„ ์•Œ๋ฉด, ํšจ์œจ์ ์ธ ์ฝ”๋“œ์— ๋Œ€ํ•ด ๋” ์ž˜ ์ดํ•ดํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. 12์žฅ์—์„œ ๋Ÿฐํƒ€์ž„ ์Šคํƒ์— ํ”„๋กœ๊ทธ๋žจ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š”์ง€, ๋™์  ํ• ๋‹น๋œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ์žˆ๋Š”์ง€, ๊ธ€๋กœ๋ฒŒ ํ”„๋กœ๊ทธ๋žจ ๋ฐ์ดํ„ฐ ์ผ๋ถ€์—์žˆ๋Š”์ง€ ๋” ๊ณต๋ถ€ํ•  ๊ฒƒ์ด๋‹ค. ํ”„๋กœ๊ทธ๋žจ์€ ๋ช…๋ น์–ด๋“ค์˜ ์‹œํ€€์Šค๋กœ ํ‘œํ˜„๋˜๋ฉฐ, ๋ช…๋ น์–ด ๊ฐ๊ฐ์€ ๋‹จ์ผ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ƒ์ดํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ƒ์„ฑ/๋™์ž‘/์ œ์–ด ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€๋ฅผ ์œ„ํ•ด ๋‹ค์ˆ˜์˜ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. C์—์„œ๋Š” ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ๊ฐ€ ๋ถ€์กฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ์กฐ์‹ฌํ•ด์•ผ ํ•œ๋‹ค. C++์€ C์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์ปดํŒŒ์ผ๋˜์ง€๋งŒ, ์ž๋ฐ”๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค. ์ž๋ฐ” ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ํŠน๋ณ„ํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ๊ฐ€ ๋œ๋‹ค. ์ด๋Š” ๊ฐ€์ƒ ๋จธ์‹ ์„ ์œ„ํ•œ ๋จธ์‹  ๋ ˆ๋ฒจ์˜ ํ”„๋กœ๊ทธ๋žจ์ด์ง€๋งŒ, ํ•˜๋“œ์›จ์–ด์—์„œ ์ง์ ‘ ๊ตฌํ˜„๋˜์ง€ ์•Š๋Š”๋‹ค. ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ์ด๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜์—ฌ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ด๋Š” ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ธฐ๊ณ„์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ์šฐ๋ฆฌ๊ฐ€ ๊ณ ๋ คํ•œ C๊ฐ™์€ ๊ฒฝ์šฐ๋Š” x86-64 ๊ธฐ๊ณ„์—์„œ๋งŒ ์‹คํ–‰๋œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. โ”์งˆ๋ฌธ ์‚ฌํ•ญ # ๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ #

CSAPP 3.11 Floating-Point Code

·642 words·4 mins
๐Ÿ“ ์ƒ์„ธ ์ •๋ฆฌ # Floating-Point Code ๋ถ€๋™์†Œ์ˆ˜์  ์•„ํ‚คํ…์ณ๋Š” ์–ด์ผ€ ๋™์ž‘ํ• ๋ผ๋‚˜ ๋ถ€๋™์†Œ์ˆ˜์  ๊ฐ’์ด ์ €์žฅ๋˜๊ณ  ์—‘์„ธ์Šค๋˜๋Š” ๋ฐฉ๋ฒ• ๋ถ€๋™์†Œ์ˆซ์  ๋ฐ์ดํ„ฐ์—์„œ ์ž‘๋™ํ•˜๋Š” ๋ช…๋ น์–ด ๋ถ€๋™์†Œ์ˆ˜์  ๊ฐ’์„ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ปจ๋ฒค์…˜/๊ด€๋ก€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ค‘ ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ๋ณด์กด๋˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ทœ์•ฝ SSE๋Š” 128๋น„ํŠธ, AVX๋Š” 256๋น„ํŠธ, AVX-512๋Š” 512๋น„ํŠธ.. %xmm0, %xmm1๋“ฑ์˜ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๊ฐ€ ๋‚˜์˜ค๋ฉด ํ˜„๋Œ€์ ์ธ ๋ ˆ์ง€์Šคํ„ฐ๋‹ค! %rax, %rbx, %rsp, … %r15๋ž‘์€ ์•„์˜ˆ ๋ณ„๊ฐœ. ์œ„์น˜๋„ ๋‹ค๋ฅธ๋“ฏ? ์—ฐ์‚ฐ ๋ฐฉ์‹ ์ž์ฒด๊ฐ€ ๋ณด์ˆ˜๋ฐฉ์‹ / ์ง€์ˆ˜๊ฐ€์ˆ˜ ๋ฐฉ์‹์œผ๋กœ ๋‹ค๋ฅด๋‹ˆ๊นŒ ๋‹ค๋ฅธ ์žฅ์น˜์—์„œ SIMD๋„ ๊ฐ€๋Šฅํ•˜๋‹ค! 3.11.1 Floating-Point Movement and Conversion Operations vmovss / vmovsd / vmovaps / vmovapd ๊ฐ™์€ ๋ช…๋ น์–ด๋“ค์ด ์žˆ๋‹ค ์ฝ”๋“œ ์ตœ์ ํ™” ์ง€์นจ์€ 32๋น„ํŠธ ๋ฐ์ดํ„ฐ๋Š” 4๋ฐ”์ดํŠธ ์ •๋ ฌ์„, 64๋น„ํŠธ ๋ฐ์ดํ„ฐ๋Š” 8๋ฐ”์ดํŠธ ์ •๋ ฌ์„ ๋งŒ์กฑํ•˜๋„๋ก ๊ถŒ์žฅํ•˜์ง€๋งŒ ์•ˆ๊ทธ๋ž˜๋„ ๋™์ž‘์€ ํ•œ๋‹ค ์ •์ˆ˜ mov๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์›ฌ๋งŒํ•˜๋ฉด ๋™์ž‘ํ•œ๋‹ค! GCC๋Š” ์Šค์นผ๋ผ ์ด๋™ ์—ฐ์‚ฐ์„ xmm ๋ ˆ์ง€์Šคํ„ฐ - ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์ด์—์„œ๋งŒ ์ˆ˜ํ–‰ํ•œ๋‹ค. xmm ๋ ˆ์ง€์Šคํ„ฐ ์‚ฌ์ด์—์„œ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด์„  vmovaps๋‚˜ vmoapd ์•ˆ์—์žˆ๋Š” a๋Š” aligned, ์ •๋ ฌ์„ ์˜๋ฏธํ•œ๋‹ค float float_mov(float v1, float *src, float *dst){ float v2 = *src; *dst = v1; return v2; } ์œ„ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฒˆ์—ญ๋œ๋‹ค. v1 in %xmm0, src in %rdi, dst in %rsi 1 float_mov: 2 vmovaps %xmm0, %xmm1 Copy v1 3 vmovss (%rdi), %xmm0 Read v2 from src 4 vmovss %xmm1, (%rsi) Write v1 to dst 5 ret Return v2 in %xmm0 ``` vmovaps, vmovss๋ฅผ ๋‘˜๋‹ค ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค! float -> ์ •์ˆ˜์—์„œ๋Š” ์ž˜ ๋ฐ˜์˜ฌ๋ฆผํ•ด์„œ ๋“ค์–ด๊ฐ ์ •์ˆ˜ -> float์—์„œ๋Š” ์‹ ๊ธฐํ•˜๊ฒŒ๋„ ๋’ค์— ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ 3๊ฐœ ๋“ค์–ด๊ฐ„๋‹ค ์ด๋•Œ ๋‘๋ฒˆ์งธ ํ”ผ์—ฐ์‚ฐ์ž๋Š” ์ƒ์œ„ ๋ฐ”์ดํŠธ์—๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์ณ์„œ ๋ฌด์‹œํ•ด๋„ ๋œ๋‹ค ์ผ๋‹จ ๋‘๋ฒˆ์งธ ์—ฐ์‚ฐ์ž๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋“ค์–ด๊ฐˆ ๋ ˆ์ง€์Šคํ„ฐ์˜๊ธฐ ๊ธฐ์กด ๊ฐ’์„ ์˜๋ฏธํ•œ๋‹ค. ์›ฌ๋งŒํ•œ ์—ฐ์‚ฐ์—์„œ ๋‘๋ฒˆ์งธ ํ”ผ์—ฐ์‚ฐ์ž์™€ ์„ธ๋ฒˆ์งธ ๋ชฉ์ ์ง€ ํ”ผ์—ฐ์‚ฐ์ž๋Š” ๊ฐ™๋‹ค float -> float์—์„œ ์กฐ๊ธˆ ์ด์ƒํ•œ ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค ์ƒ์œ„๋น„ํŠธ๋ฅผ ๋‹ค์‹œ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•จ ๊ฐ€์งœ ์˜์กด์„ฑ ์ด์ „์˜ ์ƒ์œ„ ๋น„ํŠธ๊ฐ’์„ ์จ์•ผ๋ ๋•Œ ๊ฐ’์„ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด, ๊ทธ๋ƒฅ ๋ฎ์–ด๋ฒ„๋ฆฐ๋‹ค single -> double, double -> single ๋‘˜๋‹ค ๋งˆ์ฐฌ๊ฐ€์ง€ 3.11.2 Floating-Point Code in Procedures ํฌ์•„์•… ํ”„๋กœ์‹œ์ ธ๋‹ค ์–ธ์ œ๋‚˜ ๊ทธ๋žฌ๋“ฏ XMM ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ด์šฉํ•ด์„œ float ์ธ์ˆ˜๋“ค์„ ํ•จ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๊ณ  ๋ฐ˜ํ™˜๋ฐ›๊ณ  ํ•œ๋‹ค x86-64์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ด€์Šต์ด ๊ด€์ฐฐ๋œ๋‹ค ์ตœ๋Œ€ 8๊ฐœ์˜ float arg๊ฐ€ xmm0~7๋กœ ์ „๋‹ฌ๋˜๊ณ , ๋” ํ•„์š”ํ•˜๋ฉด ์Šคํƒ ์‚ฌ์šฉ float ๋ฐ˜ํ™˜์€ xm0์—์„œ ๋ชจ๋“  XMM ๋ ˆ์ง€์Šคํ„ฐ๋Š” caller-saved. ์ดํ›„์— ํ˜ธ์ถœ๋œ๋†ˆ์ด ๋ง˜๋Œ€๋กœ ๋ฐ”๊ฟ”๋„ ๋จ double f1(int x, double y, long z); ์œ„์˜ ์˜ˆ์—์„œ, %edi์— x, %xmm0์— y, %rsi์— z 3.11.3 Floating-Point Arithmetic Operations double funct(double a, float x, double b, int i){ return a*x - b/i; } ์œ„ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ๊ฐ™์ด ๋ฒˆ์—ญ๋œ๋‹ค. a in %xmm0, x in %xmm1, b in %xmm2, i in %edi 1 funct: The following two instructions convert x to double 2 vunpcklps %xmm1, %xmm1, %xmm1 3 vcvtps2pd %xmm1, %xmm1 4 vmulsd %xmm0, %xmm1, %xmm0 Multiply a by x 5 vcvtsi2sd %edi, %xmm1, %xmm1 Convert i to double 6 vdivsd %xmm1, %xmm2, %xmm2 Compute b/i 7 vsubsd %xmm2, %xmm0, %xmm0 Subtract from a*x 8 ret Return ``` 3.11.4 Defining and Using Floating-Point Constants ์ •์ˆ˜ ์—ฐ์‚ฐ๊ณผ ๋‹ฌ๋ฆฌ AVX float ์—ฐ์‚ฐ์€ immediate value๋กœ ์—ฐ์‚ฐํ•  ์ˆ˜ ์—†๋‹ค. ๋Œ€์‹  ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ž„์˜๊ฐ’์— ๋Œ€ํ•ด ์Šคํ† ๋ฆฌ์ง€๋ฅผ ํ• ๋‹นํ•˜๊ณ  ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ๋ฉ”๋ชจ๋ฆฌ๋กœ๋ถ€ํ„ฐ ๊ฐ’์„ ์ฝ๋Š”๋‹ค. double cel2fahr(double temp){ return 1.8 * temp + 32.0; } ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด, ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๋€๋‹ค. double cel2fahr(double temp) temp in %xmm0 1 cel2fahr: 2 vmulsd .LC2(%rip), %xmm0, %xmm0 Multiply by 1.8 3 vaddsd .LC3(%rip), %xmm0, %xmm0 Add 32.0 4 ret 5 .LC2: 6 .long 3435973837 Low-order 4 bytes of 1.8 7 .long 1073532108 High-order 4 bytes of 1.8 8 .LC3: 9 .long 0 Low-order 4 bytes of 32.0 10 .long 1077936128 High-order 4 bytes of 32.0 ``` .LC2์˜ ์œ„์น˜๋กœ๋ถ€ํ„ฐ 1.8์„ ๊ฐ€์ ธ์˜ค๊ณ , .LC3์—์„œ 32.0์„ ํŒ๋…ํ•ด์˜ค๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค. 3.11.5 Using Bitwise Operations in Floating-Point Code ๋น„ํŠธ์—ฐ์‚ฐ์„ float์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค! vxorps, vxorpd, vandps, vandpd ๊ทผ๋ฐ float์—์„œ ๋น„ํŠธ์—ฐ์‚ฐ์€ ์ง„์งœ ์™œํ•˜์ง€? ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์ž๊ธฐ ์ž์‹ ์„ xorํ•˜๊ธฐ ๋ถ€ํ˜ธ ๋ฐ˜์ „ / ์ ˆ๋Œ“๊ฐ’ํ™” ๋งจ์•ž MSB ๋งŒ์ง€๊ธฐ (x<0 ? 0:x)๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ (RELU) 3.11.6 Floating Point Comparison Operations ์•„๋ฌด๋ž˜๋„ ์ˆ˜๋ฅผ ๋น„๊ต๋Š” ํ•ด์•ผ๊ฒ ์ง€ ucomiss / ucomisd S1์™€ S2 ๋น„๊ต ๋Š˜ ๊ทธ๋žฌ๋“ฏ ZF, CF, PF๋ฅผ ์„ค์ •ํ•œ๋‹ค ํ•˜๋‚˜๋ผ๋„ NaN์ด๋ฉด, ์„ธ ํ”Œ๋ž˜๊ทธ๋ฅผ ๋‹ค ํ‚จ๋‹ค! 3.11.7 Observations about Floating-Point Code AVX2๊ฐ€ float์— ๋Œ€ํ•ด ์ •์ˆ˜๋ž‘ ๋น„์Šทํ•˜์ง€๋งŒ, ํ›จ์”ฌ๋” ๋‹ค์–‘ํ•œ ๋ช…๋ น์–ด์™€ ํ˜•์‹์„ ํฌํ•จํ•˜๋Š”๊ฑธ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋˜ํ•œ ํŒจํ‚น๋œ ๋ฐ์ดํ„ฐ์— ๋ณ‘๋ ฌ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ด์„œ ๋” ๋น ๋ฅด๊ฒŒ ์‹คํ–‰์‹œํ‚ฌ์ˆ˜๋„ ์žˆ๋‹ค. ์š”์ƒˆ gcc๊ฐ€ ํ•ด์ฃผ๋”๋ผ โ”์งˆ๋ฌธ ์‚ฌํ•ญ # ๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ #

CSAPP 3.10 Combining Control and Data in Machine-Level Programs

·988 words·5 mins
๐Ÿ“ ์ƒ์„ธ ์ •๋ฆฌ # ๋ฐ์ดํ„ฐ์™€ ๋จธ์‹ ๋ ˆ๋ฒจ ์ฝ”๋“œ๋ฅผ ์ง€๊ธˆ๊นŒ์ง€ ๋”ฐ๋กœ ์‚ดํŽด๋ณด์•˜๋‹ค ์ด์ œ๋ถ€ํ„ฐ๋Š” ํ•ฉ์ณ์„œ ํ™•์ธํ•ด๋ณด์ž ์ด๊ฑด ํฌ์ธํ„ฐ ๋‹จ์œ„๋กœ ๊ณต๋ถ€ํ•  ๊ฒƒ์ด๋‹ค. ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋„ ์—ฐ๊ตฌํ•ด๋ณด์ž ์Šคํƒ ์ €์žฅ๋Ÿ‰์ด ์‹คํ–‰๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ? ๋ฅผ ํ™•์ธํ•ด๋ณด์ž 3.10.1 Understanding Pointers ๋ชจ๋“  ํฌ์ธํ„ฐ๋Š” associated type์ด ์žˆ๋‹ค. ์–ด๋–ค object๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š”์ง€ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ ๊ฐ์ฒด๊ฐ€ ํƒ€์ž… T๋ฅผ ๊ฐ–๋Š” ๊ฒฝ์šฐ, T์˜ ํฌ์ธํ„ฐ๋Š” ํƒ€์ž… *T๋ฅผ ๊ฐ–๋Š”๋‹ค. ํƒ€์ž… *T์˜ ํฌ์ธํ„ฐ๋Š” **T์ด๋‹ค. ๊ทธ๋ƒฅ * ๋ผ๊ณ  ์“ฐ๋ฉด ์ผ๋ฐ˜ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด ํฌ์ธํ„ฐ ์œ ํ˜•์€ ๊ธฐ๊ณ„์ฝ”๋“œ์˜ ์ผ๋ถ€๋Š” ์•„๋‹ˆ์ง€๋งŒ, ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด C๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ถ”์ƒํ™”์ž„ ๋ชจ๋“  ํฌ์ธํ„ฐ์˜ ๊ฐ’์€ ์ผ๋ถ€ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค NULL(0)์ผ๋•Œ ๋นผ๊ณ  (์•„๋ฌด๋ฐ๋„ ๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š์Œ) ํฌ์ธํ„ฐ๋Š” &์—ฐ์‚ฐ์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค ๊ธฐ๊ณ„์ฝ”๋“œ์—์„œ๋Š” ์ฃผ๋กœ leaq๋กœ ๋‚˜ํƒ€๋‚ด์ง€๋”๋ผ ํฌ์ธํ„ฐ๋Š” *์—ฐ์‚ฐ์œผ๋กœ ์—ญ์ฐธ์กฐ๋œ๋‹ค. ์ง€์ •๋œ ์ฃผ์†Œ๋กœ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์ง€์ •๋œ ์ฃผ์†Œ๋กœ๋ถ€ํ„ฐ ๊ฒ€์ƒ‰ํ•œ๋‹ค. ๋ฐฐ์—ด๊ณผ ํฌ์ธํ„ฐ๋Š” ๋ฐ€์ ‘ํ•œ ๊ด€๋ จ์ด ์žˆ๋‹ค. ๋ฐฐ์—ด์˜ ์ด๋ฆ„์€ ๋งˆ์น˜ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์ฐธ์กฐ๋œ๋‹ค. ํฌ์ธํ„ฐ๋ฅผ ์บ์ŠคํŒ…ํ•  ๋•Œ, ๊ทธ ์œ ํ˜•์€ ๋ฐ”๋€Œ์ง€๋งŒ ๊ทธ๊ฐ’์€ ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ ์Šค์ผ€์ผ๋ง์„ ๋ฐ”๊ฟ€ ์ˆœ ์žˆ๋‹ค EX) p๊ฐ€ char * ์œ ํ˜•์˜ ํฌ์ธํ„ฐ์ธ ๊ฒฝ์šฐ (int *) p+7์€ p+28์„ ๊ณ„์‚ฐํ•˜๊ณ , (int *) (p+7)์€ p+7์„ ๊ณ„์‚ฐํ•œ๋‹ค. ํฌ์ธํ„ฐ๋Š” ํ•จ์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜๋„ ์žˆ๋‹ค. int fun(int x, int *p); int (*fp)(int, int *); fp = fun; int y = 1; int result = fp(3, &y); ํ•จ์ˆ˜ ํฌ์ธํ„ฐ์˜ ๊ฐ’์€ ํ•จ์ˆ˜์˜ ๊ธฐ๊ณ„์ฝ”๋“œ ํ‘œํ˜„์—์„œ ์ฒซ๋ฒˆ์งธ ๋ช…๋ น์–ด์˜ ์ฃผ์†Œ์ด๋‹ค. 3.10.2 Life in the Real World: Using the GDB Debugger gdb๋Š” GNU ๋””๋ฒ„๊ฑฐ ใ…‹ใ…‹ bomb lab ํ’€๋ฉด์„œ ์ด๋ฏธ ์จ๋ดค์ง€๋กฑ 3.10.3 Out-of-Bounds Memory References and Buffer Overflow C๋Š” ๋ฐฐ์—ด ์ฐธ์กฐ์— ๋Œ€ํ•œ ์ž„์˜์˜ ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค ์ €์žฅ๋œ ๋ ˆ์ง€์Šคํ„ฐ๊ฐ’ ๋ฐ˜ํ™˜ ์ฃผ์†Œ์™€ ๊ฐ™์€ ์ƒํƒœ ์ •๋ณด ๋กœ์ปฌ ๋ณ€์ˆ˜ ์ด ๋ชจ๋“ ๊ฒƒ๋“ค์ด ์Šคํƒ์— ์ €์žฅ๋œ๋‹ค ๊ทผ๋ฐ ์ด๊ฑด ์‹ฌ๊ฐํ•œ ํ”„๋กœ๊ทธ๋žจ ์˜ค๋ฅ˜๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค!! Out of bound ๋ฐฐ์—ด ์š”์†Œ์— ์ž‘์„ฑํ•˜๋Š”๊ฒƒ์œผ๋กœ! ๊ทธ๋ฆฌ๊ณ  ์ด์ƒํƒœ๋กœ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ret ๋ช…๋ น์–ด๋ฅผ ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ํ„ฐ์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ๊ฑธ Buffer Overflow๋ผ๊ณ  ํ•œ๋‹ค. ๋ฌธ์ž์—ด์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์Šคํƒ ์ƒ์— ์ผ๋ถ€ ๋ฌธ์ž ๋ฐฐ์—ด์—์ด ํ• ๋‹น๋˜์ง€๋งŒ, ๊ทธ ํฌ๊ธฐ๊ฐ€ ๋„˜์–ด๊ฐ„ ๊ฒฝ์šฐ char *gets(char *s){ int c; char *dest = s; while((c = getchar()) != '\n' && c != EOF) *dest++ = c; if(c == EOF && dest == s) return NULL; *dest++ = '\0'; return s; } void echo(){ char buf[8]; gets(buf); puts(buf); } ์ด๋Ÿฐ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž! ๊ทธ๋Ÿฐ๋ฐ ์ด ์ฝ”๋“œ๋Š” ์ž…๋ ฅ์ด ํฌ๊ธฐ์ธ 8์„ ๋„˜๋Š”์ง€ ์•ˆ๋„˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‹ค…. ์–ด์…ˆ๋ธ”๋ฆฌ๋กœ๋„ ๋ด๋ณผ๊นŒ? void echo() 1 echo: 2 subq $24, %rsp Allocate 24 bytes on stack 3 movq %rsp, %rdi Compute buf as %rsp 4 call gets Call gets 5 movq %rsp, %rdi Compute buf as %rsp 6 call puts Call puts 7 addq $24, %rsp Deallocate stack space 8 ret Return ``` - ์Šคํƒ ํฌ์ธํ„ฐ์—์„œ 24๋ฅผ ๋นผ์„œ ํ• ๋‹นํ•˜๊ณ , ๋งจ์œ„์— ์ €์žฅํ•˜๊ณ .. - rsp๋ฅผ rdi์— ์ ์–ด๋†”์„œ gets / puts ๋‘˜๋‹ค์—๋„ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ณ  - buf๊ฐ€ ๊ทธ๋Ÿฌ๋ฉด 8๋ฐ”์ดํŠธ๋ฅผ ์“ฐ๋‹ˆ๊นŒ, ๋’ค์— 16๋ฐ”์ดํŠธ๋Š” ์•ˆ์“ด๋‹ค. - ์‚ฌ์šฉ์ž๊ฐ€ 7๊ฐœ ๋ฌธ์ž ์ž…๋ ฅ (์ข…๋ฃŒ๋ฌธ์ž์—ด๊นŒ์ง€ 8๊ฐœ) ๊นŒ์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๊ฒ ์ง€๋งŒ… ์ด๋ฅผ ๋„˜์–ด๊ฐ€๋ฉด? - 0-7: buf์— ์ž˜ ๋“ค์–ด๊ฐ - 9-23: ๋น„์–ด์žˆ๋Š” ์Šคํƒ๊ณต๊ฐ„ - 24-31: Return address - 32+: caller์— ์ €์žฅ๋œ ๊ฐ’๋“ค ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋Š” ๋ฒ„๊ทธ๊ฐ€ ํ„ฐ์ง€๋Š”๊ฒƒ๋„ ๋ฌธ์ œ์ง€๋งŒ.. ์›ํ•˜์ง€ ์•Š๋Š” ํ–‰๋™์„ ๋งˆ์Œ๋Œ€๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด? ์ด๊ฒƒ์ด ์ปดํ“จํ„ฐ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์‹œ์Šคํ…œ์˜ ๋ณด์•ˆ์„ ๊ณต๊ฒฉํ•˜๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ• ์ด๋ฅผ Exploit code๋ผ๊ณ  ํ•œ๋‹ค. ๋ญ ์•”ํŠผ ๋ณด์•ˆ์„ ์ž˜ํ•ด์•ผํ•œ๋‹ค๋Š” ์ด์•ผ๊ธฐ 3.10.4 Thwarting Buffer Overflow Attacks ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋˜๋‹ˆ๊นŒ ํ˜„๋Œ€ ์ปดํŒŒ์ผ๋Ÿฌ์™€ ์šด์˜์ฒด์ œ๋Š” ์ด๋ฅผ ๋ง‰๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค Stack Randomization ์‹œ์Šคํ…œ ๋‚ด์— ์ต์Šคํ”Œ๋กœ์ž‡ ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ณต๊ฒฉ์ž๋Š” ์ฝ”๋“œ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ฝ”๋“œ ๋ชจ๋‘๋ฅผ ์ฃผ์ž…ํ•ด์•ผํ•จ. ๋˜ํ•œ, ํ•ด๋‹น ๋ฌธ์ž์—ด์ด ๋“ค์–ด๊ฐˆ ์Šคํƒ/๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋„ ์•Œ์•„์•ผ๋œ๋‹ค!! ์—ญ์‚ฌ์ ์œผ๋กœ, ์ด๋Š” ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•˜๋‹ค. ๊ณต๊ฒฉ์ž๊ฐ€ ๊ณตํ†ต ์›น์„œ๋ฒ„์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์Šคํƒ ์ฃผ์†Œ๋ฅผ ์ฐพ์•˜๋‹ค๋ฉด? ๋งŽ์€ ๋จธ์‹ ์—์„œ ์ž‘๋™ํ•˜๋Š” ๊ณต๊ฒฉ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ, ์Šคํƒ์˜ ์œ„์น˜๋ฅผ ๊ฐ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ํ•˜์ž. ๋งŽ์€ ๋จธ์‹ ์ด ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋”๋ผ๋„, ๋ชจ๋‘ ์ƒ์ดํ•œ ์Šคํƒ ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค. allocaํ•จ์ˆ˜๊ฐ™์€๊ฑธ ์ด์šฉํ•ด์„œ ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘์‹œ ์Šคํƒ์ƒ์— ๋žœ๋คํ•œ ๊ฐ’์„ ํ• ๋‹นํ•œ๋‹ค ์ด ๊ฐ’์€ ์ถฉ๋ถ„ํ•œ ๋ณ€๋™์„ ์–ป์„์ˆ˜ ์žˆ์„์ •๋„๋กœ ์ปค์•ผํ•˜์ง€๋งŒ, ๋‚ญ๋น„ํ•˜์ง€ ์•Š์„๋งŒํผ ์ž‘์•„์•ผํ•˜๋Š”.. ๋‹น์—ฐํ•œ๋ง ๊ฐ„๋‹จํ•˜๊ฒŒ๋Š” ์ด๋ ‡๊ฒŒ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค int main(){ long local; printf("local at %p\n", &local); return 0; } ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์–ธ์ œ๋‚˜ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง€์ง€ ์•Š์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ํ˜„์žฌ ๋ฆฌ๋ˆ…์Šค ์‹œ์Šคํ…œ์—์„œ ํ‘œ์ค€ ๊ด€ํ–‰์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Š” ์–ด๋А์ •๋„์˜ ๊ณต๊ฒฉ์„ ๋ง‰์„ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ๊ณต๊ฒฉ์ž๊ฐ€ ์ •๋ง ํž˜๋‚ด๋ฉด ๋‹ค๋ฅธ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง„ ๊ณต๊ฒฉ์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‹œ๋„ํ•ด์„œ ๋ธŒ๋ฃจํŠธํฌ์Šค๋กœ ๊ทน๋ณต ๊ฐ€๋Šฅํ•˜๋‹ค. Stack Corruption Detection ์Šคํƒ์ด ์†์ƒ๋˜์—ˆ์„ ๋•Œ๋ฅผ ๊ฐ์ง€ํ•˜๋ฉด ๋˜์ง€ ์•Š์„๊นŒ? echoํ•จ์ˆ˜๋Š” local buffer์˜ ๊ฒฝ๊ณ„๋ฅผ ์ดˆ๊ณผํ•  ๋•Œ ํ„ฐ์กŒ์—ˆ๋‹ค C์—์„œ๋Š” ๋ฐฐ์—ด์˜ ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด์„œ ์“ฐ๊ธฐ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค. ๋Œ€์‹  ํ”„๋กœ๊ทธ๋žจ์€ ๊ทธ๋Ÿฌํ•œ ์“ฐ๊ธฐ๊ฐ€ ์–ด๋– ํ•œ ํ•ด๋กœ์šด ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ธฐ ์ „์— ๋ญ”๊ฐ€๊ฐ€ ๋ฐœ์ƒํ•œ์  ์žˆ๋Š”์ง€๋ฅผ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ๋ฒ„ํผ ์˜ค๋ฒ„๋Ÿฐ์„ ๊ฒ€์ถœํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์„ฑ๋œ ์ฝ”๋“œ์— ์Šคํƒ ๋ณดํ˜ธ์ž๋กœ ์•Œ๋ ค์ง„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ฉํ•œ๋‹ค (?) ์ž„์˜์˜ ๋กœ์ปฌ ๋ฒ„ํผ์™€ ๋‚˜๋จธ์ง€ ์Šคํƒ๋“ค ์‚ฌ์ด์— ํŠน๋ณ„ํ•œ canary ๊ฐ’์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ ์ด๋Š” guard๊ฐ’์ด๋ผ๊ณ ๋„ ํ•˜๋ฉฐ, ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ๋ฌด์ž‘์œ„๋ผ์„œ ๊ณต๊ฒฉ์ž๊ฐ€ ๊ทธ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์‰ฝ๊ฒŒ ๊ฒฐ์ •ํ•  ์ˆ˜ ์—†๋‹ค. ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ๋ณต์›ํ•˜๊ณ  ๋Œ์•„๊ฐ€๊ธฐ ์ „์—, ํ”„๋กœ๊ทธ๋žจ์€ ์ด canary๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ์•ˆ๋๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ์•„ํ•˜, ์˜ˆ์ „์— bomb lab์—์„œ ๋ดค๋˜ %fs:40์ด ์ด๊ฑฐ์˜€๊ตฌ๋‚˜!!! Limiting Executable Code Regions ๊ณต๊ฒฉ์ž๊ฐ€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ์‹œ์Šคํ…œ์— ์‚ฝ์ž…ํ•˜๋Š” ๋Šฅ๋ ฅ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ ๊ทธ์ค‘ ํ•œ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์ €์žฅํ•˜๋Š”๊ฒƒ์„ ์ œํ•œํ•˜๋Š” ๊ฒƒ ์˜ˆ๋ฅผ ๋“ค์–ด, ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ์ƒ์„ฑ๋œ ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ๋ถ€๋ถ„๋งŒ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ณ , ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ๋งŒ ํ—ˆ์šฉํ•˜๋„๋ก ์ œํ•œํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค. ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๊ณต๊ฐ„์€ ํŽ˜์ด์ง€๋‹น 2048 / 4096๋ฐ”์ดํŠธ์ž„. (9์žฅ์—์„œ ๋ฐฐ์šธ ๊ฒƒ) ํ•˜๋“œ์›จ์–ด๋Š” ํ”„๋กœ๊ทธ๋žจ / ์šด์˜์ฒด์ œ ๋“ฑํ•œํ…Œ ์•ก์„ธ์Šค ํ˜•ํƒœ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ณดํ˜ธ๋ฅผ ์ง€์›ํ•จ ๋งŽ์€ ์‹œ์Šคํ…œ๋“ค์€ ์ฝ๊ธฐ / ์“ฐ๊ธฐ / ์‹คํ–‰์— ๋Œ€ํ•œ ์ œ์–ด๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค. ์—ญ์‚ฌ์ ์œผ๋กœ x86์€ ์ฝ๊ธฐ ๋ฐ ์‹คํ–‰์„ 1๋น„ํŠธ ํ”Œ๋ž˜๊ทธ๋กœ ๋ณ‘ํ•ฉํ•˜์—ฌ, ์ฝ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉด ์‹คํ–‰๋„ ๊ฐ€๋Šฅํ–ˆ๋‹ค. ์Šคํƒ์ชฝ๋„ ์ฝ์–ด์•ผํ•˜๊ธฐ๋•Œ๋ฌธ์— ์Šคํƒ์˜ ๋ฐ”์ดํŠธ๋„ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ–ˆ๋‹ค ํ•˜์ง€๋งŒ ์ด์ œ 64๋น„ํŠธ ํ”„๋กœ์„ธ์„œ์—์„œ๋Š” AMD๋„ ์ธํ…”๋„ ์ด๋ฅผ ๋ถ„๋ฆฌํ•˜๊ธฐ ์‹œ์ž‘ํ–‡๋‹ค. ์ด ์„ธ๊ฐ€์ง€ ๊ธฐ์ˆ ๋“ค์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ๋…ธ๋ ฅ๋„, ์ˆ˜ํ–‰ ์˜ค๋ฒ„ํ—ค๋“œ๋„ ์ ๋‹ค. ๊ฐœ๋ณ„์ ์œผ๋กœ ์ทจ์•ฝ์„ฑ ์ˆ˜์ค€์„ ๋‚ฎ์ถ”๊ณ , ์กฐํ•ฉํ•ด์„œ ๋” ์ข‹๊ธฐ๋„ ํ•˜๋‹ค. ํ•˜์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ ์ปดํ“จํ„ฐ๋ฅผ ๊ณต๊ฒฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋“ค์€ ์—ฌ์ „ํžˆ ์กด์žฌํ•˜๊ณ , worm๊ณผ ๋ฐ”์ด๋Ÿฌ์Šค๋“ค์€ ๊ณ„์† ๊ณต๊ฒฉํ•ด๋‚˜๊ฐ„๋‹ค. 3.10.5 Supporting Variable-Size Stack Frames ์ง€๊ธˆ๊นŒ์ง€๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์Šคํƒ์— ์–ผ๋งŒํผ์„ ํ• ๋‹นํ•ด์•ผํ•˜๋Š”์ง€ ๋ฏธ๋ฆฌ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ผ๋ถ€ ๊ธฐ๋Šฅ์€ ์š”๊ตฌํ•˜๋Š” ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์˜ ์–‘์ด ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค! ์˜ˆ๋ฅผ๋“ค์–ด, alooca ๋“ฑ์˜ ์ž„์˜ ํฌ๊ธฐ์˜ ๋ฐ”์ดํŠธ๋ฅผ ์Šคํƒ์— ํ• ๋‹นํ•˜๋Š” ๊ฑฐ๋ผ๋˜์ง€, ๊ฐ€๋ณ€ ํฌ๊ธฐ์˜ ๋กœ์ปฌ ์–ด๋ ˆ์ด๋ฅผ ์„ ์–ธํ•˜๋˜์ง€ ๋”ฐ๋ผ์„œ, ๋‚˜์ค‘์— ํ•จ์ˆ˜๋กœ ๋Œ์•„๊ฐˆ๋•Œ ์Šคํƒ ํฌ์ธํ„ฐ์˜ ์œ„์น˜๊ฐ€ ์–ด๋””์˜€๋Š”์ง€๋ฅผ ๊ธฐ์–ตํ•˜๊ธฐ ์œ„ํ•ด, ์ด๋ฅผ ํ”„๋ ˆ์ž„ ํฌ์ธํ„ฐ๋งˆ๋ƒฅ %rbp์— ์ €์žฅํ•ด๋‘์ž!! ๊ทธ๋Ÿฌ๋ฉด %rsp๊ฐ€ ์–ผ๋งˆ๋‚˜ ํฌ๋”๋ผ๋„ ํ•จ์ˆ˜ return์‹œ ์–ด๋””๋กœ ๋Œ์•„๊ฐ€์•ผํ•˜๋Š”์ง€๋Š” ํ™•์‹คํ•˜๋‹ค. ์ด๊ฑด ๊ธฐ๊ณ„์ฝ”๋“œ์— leave๋ผ๊ณ  ์žˆ๋‹ค. โ”์งˆ๋ฌธ ์‚ฌํ•ญ # ์™œ 8๋ฐ”์ดํŠธ๊ฐ€ ์•„๋‹Œ 24๋ฐ”์ดํŠธ๋ฅผ ๋•ก๊ฒผ์ง€? -> 16๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ rsp๋ฅผ ๋งž์ถ”๊ธฐ ์œ„ํ•ด Stack Randomization, Stack Canary ๋ชจ๋‘ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ๊ฒฐ์ •๋œ๊ฑฐ ์•„๋‹Œ๊ฐ€? ๋žœ๋ค๊ฐ’์ด? ๊ฐ™์€ ์ปดํŒŒ์ผ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๋ฉด ๊ฒฐ๊ตญ ์ผ์–ด๋‚˜๋Š”์ผ์€ ์–ธ์ œ๋‚˜ ๊ฐ™์€๊ฑด๊ฐ€? -> ใ„ด.ใ„ด fs:40๊ฐ™์€๋ฐ ๋“ค์–ด์ด์žˆ๋Š” ๊ฐ’์€ ๋งจ๋‚  ๋‹ค๋ฅด๋‹ค ๊ทธ๋ž˜๋„ RNG๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ๋ฐ•ํ˜€์žˆ๋Š”๊ฑฐ ์•„๋‹Œ๊ฐ€? -> ๋งž๊ธด ํ•œ๋ฐ, ๊ฐ„๋‹จํ•œ rand()๊ธ‰์ด ์•„๋‹ˆ๊ณ  ๋งˆ์šฐ์Šค ์›€์ง์ž„ / ํ•˜๋“œ์›จ์–ด ์ธํ„ฐ๋ŸฝํŠธ๋“ฑ ๋‹ค์–‘ํ•œ ๋ถˆ๊ทœ์น™์  ์‹ ํ˜ธ๋“ค์„ ๋ชจ์•„์„œ ๋ฌด์ž‘์œ„ํ™”ํ•œ๋‹ค. ์Šคํƒ์—์„œ printf๊ฐ™์€๊ฑธ๋กœ๋„ ๋ชป์ฝ๊ฒŒ ์ฒซ๋ฒˆ์งธ ๋ฐ”์ดํŠธ๋ฅผ 0x00(NULL)๋กœ ์„ค์ •ํ•ด์„œ ๋ฌธ์ž์—ด ํ•จ์ˆ˜ ๋“ฑ๋„ ๋ฐฉ์–ดํ•œ๋‹ค! ๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ # CSAPP

CSAPP 3.9 Heterogeneous Data Structures

·421 words·2 mins
๐Ÿ“ ์ƒ์„ธ ์ •๋ฆฌ # C๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ๊ฐ์ฒด๋ฅผ ๊ฒฐํ•ฉํ•ด์„œ ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋‘๊ฐ€์ง€ ์–ด์ฉŒ๊ตฌ.. struct, union 3.9.1 Structures ๋‹ค๋ฅธ ์œ ํ˜•์˜ ๊ฐ์ฒด๋ฅผ ๋‹จ์ผ ๊ฐ์ฒด๋กœ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๋ฐ์ดํ„ฐ ์œ ํ˜• structure ๋‚ด์˜ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋Š” ์ด๋ฆ„์œผ๋กœ ์ฐธ์กฐ๋จ ๋ชจ๋“  ๊ตฌ์„ฑ์š”์†Œ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์˜ ์—ฐ์† ์˜์—ญ์— ์ €์žฅ๋˜๊ณ , structure์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๊ฐ€ ์ฒซ๋ฒˆ์งธ ๋ฐ”์ดํŠธ์˜ ์ฃผ์†Œ Array๋ž‘ ๋น„์Šทํ•˜๋‹ค! ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ฐ ํ•„๋“œ์˜ ๋ฐ”์ดํŠธ ์˜คํ”„์…‹์„ ๋“ค๊ณ ์žˆ๊ณ .. ๊ทธ๊ฑธ๋กœ ์ž˜ ์™”๋‹ค๊ฐ”๋‹ค ์ฐธ์กฐ 3.9.2 Unions ๋‹จ์ผ ๊ฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ ์œ ํ˜•์— ๋”ฐ๋ผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ ์ด๊ฒŒ ๋ฌด์Šจ์†Œ๋ฆฌ์ง€? struct์—์„œ char, int[2], double์ด ์žˆ๋‹ค๋ฉด char: 01, int: 412, double: 16~24๋ฐ”์ดํŠธ๋กœ ์ด 24๋ฐ”์ดํŠธ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ์‚ฌ์ด๊ณต๊ฐ„์€ ํŒจ๋”ฉ Union์ด์—ˆ๋‹ค๋ฉด ๊ฐ€์žฅ ํฐ๊ฒƒ์— ๋งž์ถฐ์„œ ๊ทธ์ € 8๋ฐ”์ดํŠธ ์‚ฌ์šฉ ๊ทธ๋•Œ๊ทธ๋•Œ char / int / double๋กœ ์ฝ๋Š” ๊ฒƒ ๊ทผ๋ฐ ๊ทธ๋Ÿผ ์ด๊ฑธ ์™œ์“ฐ๋ƒ? ํ•œ๋ฒˆ์— char / int / double ์ค‘ ์—ฌ๋Ÿฌ ๊ฐ’์„ ๋™์‹œ์— ๊ฐ€์ง€์ง€ ์•Š์„๋–„! ์ฑ…์— ๋‚˜์˜จ ์˜ˆ์ œ๋Š” ๋ฆฌํ”„๋…ธ๋“œ์—๋งŒ ๊ฐ’์ด ์žˆ๋Š” ์ด์ง„ ํŠธ๋ฆฌ ๊ตฌ์กฐ์ฒด ์™ผ์ชฝ๋…ธ๋“œ ํฌ์ธํ„ฐ, ์˜ค๋ฅธ์ชฝ๋…ธ๋“œ ํฌ์ธํ„ฐ, double 2๊ฐœ๋ฅผ ๊ฐ€์ง„๋‹ค๊ณ  ํ•ด๋ณด์ž struct๋Š” 32๋ฐ”์ดํŠธ, Union์ด๋ผ๋ฉด ์ž˜ ๋ฌถ์–ด์„œ 16๋ฐ”์ดํŠธ๋กœ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ ๋‹ค์Œ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž. double uu2double(unsigned word0, unsigned word1) { union { double d; unsigned u[2]; } temp; temp.u[0] = word0; temp.u[1] = word1; return temp.d; } ์ด๋•Œ word0 = 0x12345678, word1 = 0x9abcdef0 ์ด๋ผ๊ณ  ํ•˜๋ฉด temp์—๋Š” Little Endian์ผ๋•Œ 78 56 34 12 f0 de bc 9a Big Endian์ผ๋• 12 34 56 78 9a bc de f0 ๊ฐ€ ์ €์žฅ๋œ๋‹ค. ์ด๋ฅผ d๋กœ ์ฝ์„ ๋•Œ Little Endian์—์„œ๋Š” 0x9abcdef012345678 Big Endian์—์„œ๋Š” 0x123456789abcdef0 ์œผ๋กœ ํ•ด์„ํ•˜๊ฒŒ ๋œ๋‹ค. (d๋ฅผ ์ฝ์„๋•Œ๋„ endian ์‹ ๊ฒฝ์ฝํ•˜๋‹ˆ๊นŒ!!) 3.9.3 Data Alignment ์ผ๋ถ€ ๊ฐ์ฒด๋“ค์— ๋Œ€ํ•œ ์ฃผ์†Œ๋Š” 2, 4, 8๋“ฑ์˜ ๋ฐฐ์ˆ˜์—ฌ์•ผํ•จ์„ ์š”๊ตฌํ•˜๋Š” ์• ๋“ค์ด ์žˆ๋‹ค ์ด๋ž˜์•ผ ํ•˜๋“œ์›จ์–ด ์„ค๊ณ„๊ฐ€ ๋‹จ์ˆœํ™”๋œ๋‹ค 8์˜ ๋ฐฐ์ˆ˜๋กœ ์ •๋ ฌ๋˜์–ด์žˆ์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ํ•œ๋ฒˆ๋งŒ ์ฐธ์กฐํ•˜๋ฉด ๋˜์ง€๋งŒ, ์•„๋‹ˆ๋ผ๋ฉด ์•ž๋’ค๋กœ ๋ถ„ํ• ๋˜์–ด ์žˆ๋Š”๊ณณ์— ๋‘๋ฒˆ ์ฐธ์กฐํ•ด์•ผํ•  ์ˆ˜๋„ ์žˆ์Œ x86-64๋Š” ๋ฐ์ดํ„ฐ์˜ ์ •๋ ฌ์— ๊ด€๊ณ„์—†์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜์ง€๋งŒ, ์ธํ…”์€ ๋ฉ”๋ชจ๋ฆฌ ์‹œ์Šคํ…œ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด ์ •๋ ฌํ• ๊ฒƒ์„ ๊ถŒ๊ณ ํ•˜๊ณ  ์žˆ์Œ ์ •๋ ฌ ๊ถŒ์žฅ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค K = 1 : char K = 2 : short K = 4 : int, float K = 8 : long, double, char * ์•„ํ•˜, ์ด๊ฒŒ bool ์ •์  ๋ฐฐ์—ด๋ณด๋‹ค bitset์ด ๋น ๋ฅธ ์ด์œ ๊ตฌ๋‚˜!! ์•Œ์•„์„œ SIMD๋ฅผ ์ง€์›ํ•˜๋ฉด์„œ ์ฑ„์›Œ์ฃผ๋Š”๊ฑฐ๊ตฌ๋‚˜!! ๊ทธ๋ฆฌ๊ณ  ์ด๊ฑธ ํŒจ๋”ฉ์ด๋ผ๊ณ  ํ•˜๊ฒ ๊ตฌ๋‚˜! .align 8 ์–ด์…ˆ๋ธ”๋ฆฌ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ์œผ๋ฉด, ๊ทธ ๋’ค๋”ฐ๋ฅด๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ 8์˜ ๋ฐฐ์ˆ˜์œ ์ฃผ์†Œ๋กœ ์‹œ์ž‘๋  ๊ฒƒ์„ ๋ณด์žฅํ•œ๋‹ค. struct S1 { int i; char c; int j; } ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด, 4 / 1 / 4 ๋ฐ”์ดํŠธ๋ฅผ ์“ฐ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ 4 / 1 + 3(ํŒจ๋”ฉ) / 4 ๋ฐ”์ดํŠธ๋ฅผ ์“ด๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ j๋Š” ์˜คํ”„์…‹ 8์„ ๊ฐ€์ง€๋ฉฐ ์ „์ฒด ๊ตฌ์กฐ ํฌ๊ธฐ๋Š” 12๋ฐ”์ดํŠธ์ด๋‹ค. ๋˜ํ•œ, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” S1 ์œ ํ˜•์˜ ํฌ์ธํ„ฐ p๊ฐ€ 4๋ฐ”์ดํŠธ ์ •๋ ฌ์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผํ•œ๋‹ค. โ”์งˆ๋ฌธ ์‚ฌํ•ญ # ์ผ๋ถ€ ๊ฐ์ฒด๋“ค์— ๋Œ€ํ•œ ์ฃผ์†Œ๋Š” 2, 4, 8๋“ฑ์˜ ๋ฐฐ์ˆ˜์—ฌ์•ผํ•จ์„ ์š”๊ตฌํ•˜๋Š” ์• ๋“ค์ด ์žˆ๊ณ , ์ด๋ž˜์•ผ ํ•˜๋“œ์›จ์–ด ์„ค๊ณ„๊ฐ€ ๋‹จ์ˆœํ™”๋œ๋‹ค ํ•˜๋“œ์›จ์–ด ์„ค๊ณ„๊ฐ€ ๋‹จ์ˆœํ™”๋œ๋‹ค๋Š”๊ฑด ๋ญ˜๊นŒ? ๋˜ํ•œ, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” S1 ์œ ํ˜•์˜ ํฌ์ธํ„ฐ p๊ฐ€ 4๋ฐ”์ดํŠธ ์ •๋ ฌ์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผํ•œ๋‹ค. ์•ˆ์— ์žˆ๋Š” ์›์†Œ๋“ค ์ค‘ K์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋‚˜? ๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ # CSAPP