![](/img/trans.png)
[英]What happens in the kernel when the process accesses an address just allocated with brk/sbrk?
[英]How does sbrk know what address to start allocation?
我是匯編的初學者,我很難讓sbrk以我想要的方式分配內存。 我最終想要創建2D數組,首先分配一列,然后遍歷每一行,一次分配一行。 但是,我注意到,當我第二次使用sbrk時,它不是從未使用的內存位置開始的,而是會覆蓋我已經分配的內存地址。 因此,要找出我做錯了什么,我決定暫時使用一維數組。
當我第一次使用
li $a0, 3 # array of length 3
li $v0, 9
syscall
它分配內存塊0x10040000
。 然后,我向分配的這三個位置輸入3個整數。 在那之后,我又做了一個步驟,只是看它從什么地址開始。 當我這樣做時,它將分配0x10040004
,覆蓋我輸入的整數之一。 以下是我使用的代碼。
# test with 1D array
# $s0 => length of array
# $s1 => address of first element in array
# $s2 => address of second sbrk
li $s0, 3
move $a0, $s0
li $v0, 9
syscall
move $s1, $v0
# use $t1 to go through array
move $t1, $s1
# read first int
li $v0, 5
syscall
sw $v0, ($t1)
addi $t1, $t1, 4
# read second int
li $v0, 5
syscall
sw $v0, ($t1)
addi $t1, $t1, 4
# read third int
li $v0, 5
syscall
sw $v0, ($t1)
# use sbrk for second time
li $a0, 5
li $v0, 9
syscall
move $s2, $v0
# exit
li $v0, 10
syscall
該程序完成后, $s1 = 0x10040000
和$s2 = 0x10040004
。
為什么sbrk從已經分配的位置開始分配內存? 有什么辦法告訴它從特定地址開始? 如果我做的事情沒有意義,請糾正我。
您應該通過sbrk
傳遞的單位是字節。 3個整數是3 * sizeof(int)
或(在大多數體系結構上)12。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.