跳至內容

IEFBR14

維基百科,自由的百科全書

IEFBR14IBM大型計算機應用程序。運行於OS/360英語OS/360的所有後繼操作系統中,包括z/OS等。該程序是一個僅會返回返回碼0的占位程序,類似於類Unix系統中的true命令。[1]

作用

[編輯]

分配文件空間(也稱為初始化)

[編輯]

OS/360及其派生的大型機操作系統中,大多數程序並不會直接指定文件(通常稱為數據集),而是在調用程序的作業控制語言英語Job Control Language(JCL)語句中間接地引用它們。這些數據定義(或「DD」)語句中可以包括一個「DISPOSITION」(DISP =…)參數,以表明該文件應該被怎樣管理——是要創建一個新文件或重用一個舊的文件;以及文件在使用完畢後是應該刪除還是保留等等。

儘管DD語句可以很方便地用來創建或者刪除文件,但此操作的前提是必須要運行一個程序。因為作業管理系統的特性,它要求作業的發起人必須執行一個程序,哪怕這個程序只是執行一條空指令。這個條件促生了IEFBR14的產生。在JCL中所運行的程序並不一定要通過使用這個文件,來達到創建或刪除文件的目的,因為DD DISP=...聲明完成了這一系列工作。因此,就需要一個簡單的,什麼都不做的程序,來填補被執行程序的這個角色。因此IEFBR14可以用於通過JCL來創建或刪除一個數據集。

回收(也稱為終止)

[編輯]

另一個需要IEFBR14的原因是,由於作業的JCL出現錯誤,或者作業以錯誤的狀態結束,導致某些設備(例如磁帶或磁盤設備)在上一個作業結束後,仍然保留了被掛載的狀態。在這種情況下,系統操作員經常需要卸載這些設備。有一個名為DEALLOC的started task往往是為此目的而提供的。

只需要在系統控制台中輸入命令:

S DEALLOC

就可以運行這個任務。然而,由於作業管理的設計,DEALLOC必須實際存在於系統的程序庫SYS1.PROCLIB中,以免啟動命令失敗。

同時,所有這類started task必須是單個作業步。作業管理系統的「started task 控制器」(STC)模塊僅接受只有一個作業步的作業,而當它遇到一個多步的作業時,它就會執行失敗,並且不會拋出任何異常。

// STEP01 EXEC PGM=IEFBR14

解析和驗證

[編輯]

至少在z/OS上,分支執行另一個程序會導致調用程序被評估為語法錯誤。

命名

[編輯]

「IEF」的名稱來源於如下命名規則,即由IBM提供的程序,都會按照其功能或者創作者而分類,每組程序共享一個三個字符組成的前綴。在OS/360中,第一個字母是幾乎總是「I」。同時,由作業管理模塊(包括IEFBR14)所產生的程序,都使用「IEF」這個前綴。其他常見的前綴包括數據集實用程序的「IEB」,系統實用程序的「IEH」,和程序鏈接和加載的「IEW」。其他主要組件則使用「IEA」作為操作系統主管程序的前綴,以及「IEC」作為輸入/輸出主管程序的前綴。

如下解釋,「BR 14」是程序的基本功能,就是簡單地返回到操作系統。這部分程序的名字往往是能輔助記憶的——例如,IEBUPDTE數據集實用程序的程序名中,IEB的含義為數據集實用程序,用來更新(UPDTE)源代碼文件,以及IEHINITT系統實用程序的名稱中,IEH代表這是一個系統工具,用來初始化(INIT)磁帶的標籤(T)。

就如下面「使用」部分所解釋的,名字中的「BR14」來自於IBM匯編語言的分支指令,含義為「分支到寄存器14(所存儲的地址)」,按照慣例,該操作的含義為「從子程序中返回」。很多OS/360的早期用戶都很熟悉IBM匯編語言,所以他們可以馬上意識到這個含義。

使用

[編輯]

示例JCL:

//IEFBR14  JOB  ACCT,'DELETE DATASET',MSGCLASS=J,CLASS=A
//STEP0001 EXEC PGM=IEFBR14                       
//DELDD    DD DSN=xxxxx.yyyyy.zzzzz,
//            DISP=(MOD,DELETE,DELETE),UNIT=DASD

創建一個分區數據集:

//TZZZ84R  JOB NOTIFY=&SYSUID,MSGCLASS=X                    
//STEP01    EXEC PGM=IEFBR14                                 
//DD1       DD DSN=TKOL084.DEMO,DISP=(NEW,CATLG,DELETE),           
//             DCB=(RECFM=FB,LRECL=80,BLKSIZE=80,DSORG=PO),  
//             SPACE=(TRK,(1,1,1),RLSE),                       
//             UNIT=SYSDA

實現

[編輯]

IEFBR14最初只是由一個「分支到寄存器14」指令組成。該指令在IBM匯編語言中使用的助記符是BR,因此得名:IEF BR 14。BR 14相當於BCR 15, 14。BR是指令BCR 15的偽指令。系統匯編程序接受很多這樣子的偽指令,其邏輯上等同於原來的System/360指令。BR 14的典型實例是BCR 15, 14。

OS/360及其後續系統的連接規範規定,當程序被調用的時候,寄存器14保存程序結束後控制權應交回到的地址,寄存器15保存被調用程序在內存中的地址;在結束時,程序從寄存器15中讀取返回值,然後分支到寄存器14所指向的地址。但是在編寫初期,IEFBR14的這些特性並未被留意,因為其最初只是用作一個無用的控制段,以返回到調用者,而不是作為一個可執行的模塊。

最初版本的IEFBR14並沒有修改寄存器15的值,因為其原型程序只是在Sysgen(系統生成)時期生成的一個程序中的一個占位符,並不是一個可執行的程序。IEFBR14曾經只會被一個等同於BALR 14,15的功能調用,所以在寄存器15中的返回值總不為0。隨後加入了一個用來清除返回碼的指令,這樣就可以使其返回一個指定好的返回碼——0。早期的程序員並沒有使用所有的JCL參數,所以在當時,返回一個不確定的返回碼並非什麼問題。然而,隨着程序員們使用的參數越來越多,返回一個確定的返回碼這一問題就變得重要了起來。這一改版的IEFBR14也並沒有影響到其最初充當占位符的作用。

修改過的程序的機器碼如下:

        SR    R15,R15  put zero completion code into register 15
        BR    R14      branch to the address in register 14 (which is actually an SVC 3 instruction in the Communications Vector Table)

簡明起見,將BR指令排除,機器碼如下:

        SR    R15,R15  put zero completion code into register 15
        SVC   3        issue EXIT SVC to terminate the jobstep

這麼做很有道理,因為OS/360的Initiator在執行初期會使用ATTACH宏指令(SVC 42)來將作業步「連接」起來,而「解除連接」的指令(一個Type 2 SVC指令)必須是一個輔助性指令,即EXIT宏(它必定是一個Type 1 SVC指令 SVC 3)。

參閱

[編輯]
  • /bin/true——UNIX系統中同等的「什麼也不做」的程序

參考文獻

[編輯]

腳註

[編輯]
  1. ^ IBM Knowledge Center. www.ibm.com. IBM Corporation. [2010] [2016-12-26]. (原始內容存檔於2016-12-27). 

其他

[編輯]
  • Trombetta, Michael & Finkelstein Sue Carolyn (1985). "OS JCL and utilities". Addison Wesley. page 152.