เหตุใดการกำหนดที่อยู่หมายเลขภาคใน CHS จึงเริ่มที่ภาค 1 และไม่ใช่ 0


13

ก่อนที่จะได้รับการแนะนำ LBA ทำไม CHS เริ่มต้นที่0,0,1ไม่0,0,0?


1
"ทำไมไม่นับภาคเริ่มต้นที่ 1 ..." - ที่จริงคุณกำลังหมายถึงภาคจำนวนไม่ภาคนับ เหล่านั้นเป็นพารามิเตอร์ที่แตกต่างกันและแตกต่างกันสองที่ใช้ในการร้องขอดิสก์ "ดัชนีภาค"ยังเป็นชื่อที่ไม่ดีสำหรับหมายเลขเซ็กเตอร์เนื่องจากมีเอนทิตีที่แตกต่างกันที่เรียกว่าดัชนีในดิสก์ไดรฟ์
ขี้เลื่อย

คำตอบ:


8

น่าเสียดายที่นี่เป็นเพียงวิธีการกำหนดรูปแบบ CHS ซึ่งเป็นที่นิยมในเวลานั้นได้รับการปรับใช้และนำไปใช้งาน สิ่งนี้ถูกนำมาใช้เป็นแบบแผนทางการสำหรับคอมพิวเตอร์ที่เข้ากันได้กับ IBM ในการขัดจังหวะ BIOS ที่ใช้สำหรับการเข้าถึงดิสก์อธิบายว่าทำไมการประชุมนี้จึงถูกนำมาใช้จนถึงทุกวันนี้ จากมาตรฐาน ECMA-107 , ระดับเสียงและโครงสร้างไฟล์ของคาร์ทริดจ์ดิสก์สำหรับการแลกเปลี่ยนข้อมูล (ซึ่งได้กล่าวถึงในข้อกำหนดATA-1ดั้งเดิม):

6.1.3 หมายเลขเซกเตอร์เชิงตรรกะ

แต่ละเซกเตอร์ของไดรฟ์ข้อมูลจะถูกระบุด้วยหมายเลขเซกเตอร์เชิงตรรกะ [... ] หมายเลขเซกเตอร์แบบลอจิคัลจะถูกกำหนดในลำดับจากน้อยไปมากโดยเริ่มต้นที่ 0 โดยเริ่มจากเซกเตอร์ 1, แทร็ก 00, ฝั่ง 0 , ต่อไปยังแทร็ก 00, ฝั่ง 1 (ถ้าบันทึก FDC ทั้งสองข้าง) เพื่อติดตาม 01, ด้าน 0, ฯลฯ

ปัญหานี้ได้รับการแก้ไขในรายละเอียดสำหรับฮาร์ดดิสก์บางส่วนซึ่งจะมีการตั้งข้อสังเกตว่าที่กำหนดตรรกะ CHSแตกต่างกันอยู่จากที่อยู่ CHS ทางกายภาพที่ตั้ง มีการอธิบายเพิ่มเติมในคู่มืออ้างอิงอินเทอร์เฟซ Seagate ATAซึ่งมีคำบรรยายที่น่าสนใจนี้:

5.1 การจัดการบล็อกแบบลอจิคัล

[... ] เซกเตอร์บนไดรฟ์จะถูกแมปเป็นเส้นตรงโดยมี LBA 0 ของทรงกระบอก 0 / หัว 0 / เซกเตอร์ 1

[... ] สำหรับโหมดการแปลทั้งหมด C = 0, H = 0, S = 1 เทียบเท่ากับ LBA = 0 ไม่สามารถคำนวณ CHS ที่เทียบเท่าสำหรับที่อยู่บล็อกแบบลอจิคัลทั้งหมดในโหมดการแปลทั้งหมดเนื่องจากสูตรนี้ใช้งานได้ในทิศทางเดียวเท่านั้น นี่เป็นเพราะที่อยู่ CHS ไม่สามารถเข้าถึง 1/256 ของภาคที่เป็นไปได้ทั้งหมดที่การกำหนดบล็อกทางตรรกะสามารถเข้าถึงได้เนื่องจากไม่มีภาคที่ 0 ใน CHS

ดังนั้นสำหรับการกำหนด CHS แบบลอจิคัลแม้ว่าดัชนีทรงกระบอก / หัวแรกจะเริ่มต้นจากการชดเชยแบบอิง 0 และดัชนีภาคแรกเริ่มจาก1 (เช่นที่อยู่ CHS ขั้นต่ำสุดที่เป็นไปได้คือ 0/0/1) สิ่งนี้ไม่เปลี่ยนแปลงอะไรเลย ที่ตั้งทางกายภาพของภาคนี้ คิดว่าเป็นเซกเตอร์กายภาพแรกบนดิสก์ที่เรียกว่า "เซกเตอร์ 1" ครอบครอง CHS 0/0/1 แท้จริงแล้วองค์ประกอบ "แรก" ในภาษาการเขียนโปรแกรมส่วนใหญ่นั้นใช้แบบ 0 ดังนั้นที่อยู่แบบลอจิคัลของภาคที่ CHS address 0/0/1 คือศูนย์ ( 0x00)

สิ่งนี้ทำให้มีเหตุผลมากขึ้น (เช่นที่อยู่ตรรกะ "zeroth" เป็นเซกเตอร์กายภาพครั้งแรก) เนื่องจากเราสามารถระบุอุปกรณ์ดิสก์เป็นอุปกรณ์หน่วยความจำอื่น ๆ (เนื่องจากแต่ละภาคมีที่อยู่เชิงเส้นที่ไม่ซ้ำกันเพื่อจับคู่กับ ภาค) ดังนั้นเหตุใดจึงเหมาะสมที่ LBA เริ่มต้นจากศูนย์ ที่จริงถ้าเราแปล CHS address 0/0/1 เป็น LBA LBA ที่ได้จะเป็นผลลัพธ์0x00000000(นี่คือสาเหตุที่ 1 ถูกลบออกจากดัชนีภาคในการคำนวณ CHS เป็น LBA ส่วนใหญ่และทำไม 1 ถูกเพิ่มลงในดัชนีสำหรับ LBA ถึงการคำนวณ CHS)


ฉันคิดคำตอบสำหรับคำถามนี้แล้ว แต่ฉันเดาว่าคนที่ฉันทิ้งความคิดเห็นไว้ซึ่งแสดงคำตอบนั้นถูกลบไปแล้ว ... ยังไงก็ตามเหตุผลที่ฉันถามคำถามนี้ก็เพราะทุกคนและทุกอย่างที่ฉันอ่านโพสต์ของคุณแน่นอน คำส่วนใหญ่ คำตอบของ "มันเป็นวิธีที่พวกเขาสร้างมันขึ้นมา ... " ทำให้ฉันรำคาญจริงๆเพราะผู้คนไม่เพียงสร้างบางสิ่งบางอย่างและไม่ได้ใช้มันเพียงเพราะพวกเขาไม่ต้องการใช้มัน ... ตรรกะนั้นไม่ได้ทำ เลย ...
Jordan Davis

1
จะผ่านประวัติศาสตร์ของ CHR / CHS / LBA คุณพบว่าก่อน CHR ซึ่งเป็นความยาวตัวแปรโดยใช้ MBBCCHHR ใช้zero sectorสำหรับรหัสข้อผิดพลาดและบล็อกที่ไม่ดี ฯลฯ .... เปลี่ยนเป็น CHS และ "แก้ไขบล็อกสถาปัตยกรรม" คุณยังมี การเปลี่ยนแปลงของการเพิ่มตัวควบคุม (เฟิร์มแวร์) ไปยังไดรฟ์และจุดเริ่มต้นของการเชื่อมโยงดิสก์ "แบบลอจิคัล" ... ตอนนี้ตัวควบคุมมองไม่เห็น แต่คุณสามารถสันนิษฐานได้ว่าใช้แบบเดียวกันนี้ ... คำนี้เรียกว่า พื้นที่ " en.wikipedia.org/wiki/Fixed-block_architectureและen.wikipedia.org/wiki/Host_protected_area
Jordan Davis

@JordanDavis ในกรณีส่วนใหญ่พื้นที่ที่มีการป้องกันโฮสต์อยู่ที่ท้ายดิสก์ไม่ใช่เริ่มต้น อันที่จริงในขณะที่ระบบการตั้งชื่อสำหรับภาคแรกถูกส่งกลับเป็นค่า1ฉันยังคงไม่พบข้อมูลใด ๆ ว่าทำไม (ถึงแม้ว่าฉันสงสัยว่ามันอาจมีบางสิ่งที่เกี่ยวข้องกับภาคที่0ถูกสงวนไว้เป็นค่าสถานะข้อผิดพลาด) ฉันจะแน่ใจว่าได้อัปเดตคุณถ้าฉันเจออะไร
พัฒนา

ลิงก์ Wikipedia สำหรับภาพรวมของส่วน FBA รายการบันทึกซีโรเป็น ECC แต่ฟังดูดีฉันจะทำแบบเดียวกันถ้าเจอกัน
Jordan Davis

@JordanDavis ฉันได้เพิ่มความโปรดปรานให้กับคำถามนี้เพราะฉันชอบที่จะได้ยินความเห็นจากคนอื่น ๆ โดยเฉพาะอย่างยิ่งในแง่ที่ว่าทำไมถึงเป็นแง่มุม .. รู้สึกอิสระที่จะเปิดคำถาม / ยังไม่ได้ตอบในขณะที่ให้ โอกาสสำหรับคำตอบอื่น ๆ
Breakthrough

8

ฉันได้พยายามที่จะติดตามประวัติศาสตร์ของCHSและ "เริ่มต้นด้วย 1" ภาคเลขล้มเหลวซึ่งได้ก่อให้เกิดภาวะแทรกซ้อนหลายสำหรับนักเขียนดิสก์ไดรเวอร์และให้สูงขึ้นอย่างรวดเร็วเพื่อLBA

CHS ย้อนหลังไปถึงวันที่คอมพิวเตอร์ส่วนบุคคลทำงานบนดิสเก็ตต์และเมื่อมีการคิดค้น BIOS นี่คือสิ่งที่Wikipediaพูดว่า:

คำว่า BIOS (ระบบอินพุต / เอาท์พุตพื้นฐาน) ถูกคิดค้นโดย Gary Kildall และปรากฏตัวครั้งแรกในระบบปฏิบัติการ CP / M ในปี 1975 โดยอธิบายถึงส่วนเฉพาะเครื่องของ CP / M ที่โหลดระหว่างเวลาบูตซึ่งเชื่อมต่อโดยตรงกับฮาร์ดแวร์

การวิจัยเกี่ยวกับ CP / M BIOS พบเอกสารที่ เก็บข้อมูล CP / M: การเรียกระบบ BDOSซึ่งหมายเลขภาคเริ่มต้นด้วยศูนย์ สรุปก็คือว่าสคี CHS เร็วที่สุดเท่าที่ใช้จริง zero-based ที่อยู่ภาค

ที่อยู่ภาคเดียวใช้ครั้งแรกกับ IBP / PC แรก เอกสาร INT 13 - Diskette BIOS Servicesกล่าวโดยเฉพาะว่า:

Most disk BIOS calls use the following parameter scheme:

    AH = function request number
    AL = number of sectors  (1-128 dec.)
    CH = cylinder number  (0-1023 dec.)
    CL = sector number  (1-17 dec.)    <--------!!!
    DH = head number  (0-15 dec.)
    DL = drive number (0=A:, 1=2nd floppy, 80h=drive 0, 81h=drive 1)
    DL = drive number (0=A:, 1=2nd floppy, 80h=C:, 81h=D:)
         Note that some programming references use (0-3) as the
         drive number which represents diskettes only.
    ES:BX = address of user buffer

ดังนั้นจึงเป็น IBM / PC ที่การใช้ไบออสอย่างไม่เป็นทางการได้แปลงการกำหนดหมายเลขภาคจาก zero-based เป็น one-based

จากวิศวกรทั้งสิบสองคนของ IBM ที่ได้รับมอบหมายให้สร้างคอมพิวเตอร์ส่วนบุคคลของ IBM (รุ่น 5150) David J. Bradley ได้พัฒนาโค้ดสำหรับ BIOS ดังนั้นเขาคือคนที่ตัดสินใจเลือกพารามิเตอร์สำหรับการขัดจังหวะดิสก์ นอกจากนี้เรายังเป็นหนี้ร่วมกันผู้ชายคนนี้กับเมล Hallerman ที่มีชื่อเสียง CTRL+ +ALTDEL

ดังนั้นคำตอบของคำถามที่ ว่าทำไมเซกเตอร์นับเริ่มที่ 1 และไม่ใช่ 0 ใน CHSคือ:
เนื่องจาก David J. Bradley ตั้งโปรแกรม BIOS ในลักษณะนั้น

สำหรับเหตุผลที่เขาทำอย่างนี้นี่เป็นคำตอบที่ดีที่สุดสำหรับตัวเขาเอง ถ้าฉันต้องเดาฉันจะบอกว่าเขาปล่อยเซกเตอร์ศูนย์ไว้เป็นภาคการจัดการกับที่คนขับสามารถตรวจสอบได้ว่าศีรษะนั้นอยู่ในเส้นทางที่ถูกต้อง

ในขณะที่ดิสก์ได้รับการออกแบบทางวิศวกรรมเพื่อที่จะไม่ต้องใช้กลไกดังกล่าวและวิศวกรยังไม่พร้อมที่จะเสียส่วนใดส่วนหนึ่งเนื่องจาก BIOS, เซคเตอร์ศูนย์ไม่เคยมีอยู่ หลังจากนั้นผู้เขียนไดรเวอร์ถูกทิ้งให้อยู่กับความต้องการที่จะลบหนึ่งและเพิ่มไปยังที่อยู่ภาคสำหรับการเรียกดิสก์ BIOS ทั้งหมด


"ฉันจะบอกว่าเขาออกจากศูนย์เซกเตอร์เป็นภาคที่อยู่ ... " - เดาผิดกฎหมาย ทุกภาคส่วนมีบันทึกประจำตัวที่มีที่อยู่ทรงกระบอก / หัว / ที่อยู่ ตัวควบคุมดิสก์ไม่จำเป็นต้องรอให้ดัชนีเข้ามาเพื่อตรวจสอบว่าการค้นหาเสร็จสิ้นบนกระบอกสูบที่ถูกต้อง ส่วนถัดไปที่หมุนใต้ศีรษะจะถูกอ่านเพื่อตรวจสอบ
ขี้เลื่อย

"CH = หมายเลขกระบอกสูบ (0-1023 ธันวาคม.)" - IBM PC PC BIOS ดั้งเดิมใช้ CH สำหรับหมายเลข "แทร็ก" CH เป็นการลงทะเบียน 8 บิตดังนั้นค่าสูงสุดคือ 255 เท่านั้น
ขี้เลื่อย

"ฉันได้พยายามติดตามประวัติของ CHS ... และทำให้ LBA สูงขึ้นอย่างรวดเร็ว" - เพื่อความชัดเจนการอภิปรายทั้งหมดเกี่ยวกับ "LBA" นั้นเกี่ยวข้องกับอินเตอร์เฟสของดิสก์ PC โดยเฉพาะ ATAPI มิฉะนั้น CHS และ LBA สามารถอยู่ร่วมกันได้ EG ฉันได้เขียนระบบไฟล์สองสามตัวที่ใช้ LBA ภายใน แต่แปลงที่อยู่เป็น CHS เพื่อดำเนินการดิสก์ I / O จริงต่ออินเตอร์เฟสคอนโทรลเลอร์ "schema แรกสุดของ CHS ใช้ที่อยู่เซกเตอร์แบบอิงศูนย์" - จริง แต่นั่นเกิดขึ้นก่อน CP / M
ขี้เลื่อย

@sawdust: ทั้งหมดที่ฉันทำคือการอ้างถึงเอกสารของ IBM ซึ่งอาจมีการกำหนดลงทะเบียนล่วงหน้าสำหรับส่วนต่อประสานพีซี BIOS เป็นที่ชัดเจนว่าแบรดลีย์ถูกเข้าใจผิดหรือถูกชี้นำโดยการตั้งค่าเซกเตอร์ 0 เป็นที่อยู่สำรอง แต่เราไม่สามารถแน่ใจได้ว่าจะเกิดอะไรขึ้นเนื่องจากมันไม่เคยเกิดขึ้น อาจเป็นได้ว่าเขาไม่ทราบว่าส่วนที่อยู่ของส่วนนั้นมีหมายเลขการติดตามด้วย หรือบางทีเซกเตอร์สำรองนี้เป็นทรัพย์สินของดิสเก็ตต์ที่ถูกส่งไปยังอินเทอร์เฟซ BIOS ทั่วไปของแบรดลีย์ เรารู้เพียงว่า IBM / PC BIOS รับผิดชอบการเปลี่ยนแปลงนี้ใน CHS
harrymc

เช่นเดียวกับในเรื่องเหล่านี้รายการขัดจังหวะของ Ralph Brown ให้ข้อมูลที่มีค่า ในขณะที่มันเป็นความจริงสิ่งที่ @sawdust เขียนเกี่ยวกับ CH เป็นทะเบียนแปดบิตนั่นไม่ใช่วิธีใช้ CX แต่ CX นั้นเต็มไปด้วยหมายเลขกระบอกสูบและหมายเลขเซกเตอร์ (แต่ส่วนขยายนี้เห็นได้ชัดว่าใช้เฉพาะกับฮาร์ดดิสก์ไม่ใช่ฟลอปปี้สำหรับฟลอปปี้ CL เก็บหมายเลขเซกเตอร์และ CH ถือหมายเลขกระบอกสูบ) เปรียบเทียบตัวอย่างเช่นอินเทอร์เฟซที่ระบุสำหรับInt 13 / AH = 02h, BIOS - DISK - READ SECTOR (S) INTO MEMORYพารามิเตอร์อินพุต
CVn

1

ข้อมูลจำเพาะแรกบนฟลอปปีดิสก์ถูกสร้างขึ้นโดย IBM ด้วยรูปลักษณ์ของ IBM 3740 และไม่ได้กล่าวถึงว่ามีเซกเตอร์สำรองไว้สำหรับระบบ การจองเพียงอย่างเดียวสำหรับระบบคือติดตาม 00 ซึ่งเก็บเฉพาะ "ป้ายชุดข้อมูล" ที่ระบุประเภทของข้อมูลที่เก็บไว้ในแทร็ก 01 ถึง 76 ชัดเจนว่าภาคแรกคือภาคที่ 1 นี่ไม่ใช่เรื่องบังเอิญ แต่เป็น เรื่องของการคิดเลขตามธรรมชาติกับจำนวนคอมพิวเตอร์

เราสามารถสังเกตได้ว่าเมื่อมนุษย์เริ่มนับสิ่งใดมันไม่ได้เริ่มต้นด้วยศูนย์ แต่อย่างใดอย่างหนึ่ง ตัวอย่างเช่นลองจินตนาการว่ามีนักเรียน 135 คนในห้องเรียน การนับจำนวนจะเป็นอย่างนั้น: หนึ่งสองสาม ... หนึ่งร้อยสามสิบสี่หนึ่งร้อยสามสิบห้า

การแสดงตัวเลขจะเป็นเช่นนั้น: 1, 2, 3, ... 134, 135 จนถึงตอนนี้เราเห็นด้วยใช่มั้ย

ทีนี้ลองใส่ตัวเลขที่ไม่ได้แทนด้วย 0 มันจะเป็นแบบนี้: 001, 002, 003, ... , 015, 016, ... , 099, 100, ... , 133, 134, 135

นี่คือสิ่งที่เกิดขึ้นกับCHS : 0,0,1 - 0,0,2 - 0,0,3 ...

เป็นสิ่งสำคัญที่แถวในแผ่นงาน Excel หรือเขตข้อมูลตัวเลขอัตโนมัติในฐานข้อมูลเริ่มต้นที่ 1 และไม่ใช่ 0 และไม่มีใครพูดอะไรเกี่ยวกับเรื่องนี้

David J. Bradley กำหนดเวลา BIOS เป็นอย่างนั้นไหม?

ใช่ แต่เขาไม่ได้อยู่ข้างนอก

ไม่มีเหตุผลทางเทคนิคแน่นอนที่ทำให้ SECTOR 0 ไม่สามารถใช้งานได้เว้นแต่จะถูกจองและซ่อนไว้จากผู้ใช้ด้วยเหตุผลอื่น ในหลักการทุกอย่างชี้ไปที่มันเป็นเรื่องของการนับจำนวนธรรมชาติ

GA21-9152-2 หมายเลขไฟล์ 3740-00,15
IBM 3740 Data Entry System

12
DISK INITIALIZATION
... แต่ละดิสก์มีแทร็กสำรองสองแทร็กเพื่อแทนที่แทร็กที่ผิดปกติใด ๆ นอกจากนี้คุณลักษณะการเตรียมใช้งานยังให้วิธีการเปลี่ยนลำดับของที่อยู่เซ็กเตอร์ในแผ่นดิสเก็ตต์ ปกติลำดับของภาคที่อยู่ในลำดับที่เป็นตัวเลข (1, 2, 3, ...
25,26)

หน้า 24
การติดฉลากข้อมูลบน
แผ่นดิสก์ในระหว่างการเริ่มต้นฉลากชุดข้อมูลสำหรับชุดข้อมูลจะถูกบันทึกด้วยสนามแม่เหล็กบนแทร็กดัชนี (แทร็ก 00) ของดิสเก็ต วัตถุประสงค์หลักของฉลากนี้คือการแสดงตำแหน่งของชุดข้อมูลบนแผ่นดิสเก็ตต์

นี่คือปี 1973 มันบันทึกข้อมูลบนดิสเก็ตต์ 8 "IBM PC 5150 เกิดเมื่อวันที่ 12 สิงหาคม 1981 ... และเราไม่สามารถลืมได้ว่าพวกเขาต้องรักษาความเข้ากันได้กับอุปกรณ์ก่อนหน้านี้

ไม่มีเหตุผลทางเทคนิคอย่างแน่นอน


สงวนไว้สำหรับไดรเวอร์ - อินเตอร์เฟส I / O เฟิร์มแวร์แม้ในดิสก์ SSD หรือแฟลชวันที่ทันสมัยมีพื้นที่สงวนไว้สำหรับการดำเนินการ I / O เพื่ออ่าน / เขียน / คัดลอก / ฟอร์แมต ฯลฯ ..
Jordan Davis

ดูที่นี่
yass

ใช่ แต่ไม่ใช่ SECTOR 0 แต่ CYLINDER 0 จากข้อมูลจำเพาะแรก (IBM 3740) cylinder 0 เรียกว่า "the cylinder ทรงกระบอก" และเก็บข้อมูลหลายอย่างที่ระบุไว้ใน "INDEX CYLINDER LAYOUT" บนแผ่นดิสก์ที่ทันสมัยกระบอกนี้มักจะถูกกำหนดให้เป็น "CYLINDER หมายเลข -1", ใช่ "-1" และสามารถเข้าถึงได้โดยผู้ควบคุมเท่านั้น ไม่มีอะไรที่จะอธิบายได้ว่าทำไมภาค 0 ไม่ได้ถูกใช้และถึงแม้ว่าเราสามารถเห็นได้ในระบบปฏิบัติการบางระบบเช่น CP / M มันเป็นเสมือนจริงเนื่องจากฮาร์ดแวร์ยังคงผลิตตาม IBM 3740 กล่าวอีกอย่างคือภาคแรกคือ ภาคที่ 1 ทำไม "หมายเลขธรรมชาติ"
APO69
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.