Драйвер ION содержит аргумент команды ioctl «ION _IOC _HEAP _QUERY», который может использоваться для получения информации о кучах (имя, тип, идентификатор и т. д. ), включен на бетонная площадка. Пример реализации был найден по следующей ссылке :
int ion_query_heap_cnt(int fd, int* cnt) {
int ret;
struct ion_heap_query query;
memset(&query, 0, sizeof(query));
ret = ion_ioctl(fd, ION_IOC_HEAP_QUERY, &query);
if (ret < 0) return ret;
*cnt = query.cnt;
return ret;
}
int ion_query_get_heaps(int fd, int cnt, void* buffers) {
int ret;
struct ion_heap_query query = {
.cnt = cnt,.heaps = (uintptr_t)buffers,
};
ret = ion_ioctl(fd, ION_IOC_HEAP_QUERY, &query);
return ret;
}
Пример использования этого API можно найти здесь:
static int find_ion_heap_id(int ion_client, char* name)
{
int i, ret, cnt, heap_id = -1;
struct ion_heap_data *data;
ret = ion_query_heap_cnt(ion_client, &cnt);
if (ret)
{
AERR("ion count query failed with %s", strerror(errno));
return -1;
}
data = (struct ion_heap_data *)malloc(cnt * sizeof(*data));
if (!data)
{
AERR("Error allocating data %s\n", strerror(errno));
return -1;
}
ret = ion_query_get_heaps(ion_client, cnt, data);
if (ret)
{
AERR("Error querying heaps from ion %s", strerror(errno));
}
else
{
for (i = 0; i < cnt; i++) {
struct ion_heap_data *dat = (struct ion_heap_data *)data;
if (strcmp(dat[i].name, name) == 0) {
heap_id = dat[i].heap_id;
break;
}
}
if (i > cnt)
{
AERR("No System Heap Found amongst %d heaps\n", cnt);
heap_id = -1;
}
}
free(data);
return heap_id;
}
Следующая функция может быть просто переписана для получения идентификатора кучи _из типа кучи _.
После того, как мы получили идентификатор кучи _, нам нужно вычислить:
heap_mask = (1 << heap_id);
awk 'BEGIN { c1 = 5 } { print c1, $0 } FNR%200 == 0 { ++c1 }' file
Это инициирует переменную c1
в 5 в начале программы awk
. Затем все входные строки печатаются с предшествующим текущим значением этой переменной.
Для любой строки, чей номер строки(FNR
)кратен 200, эта переменная будет увеличиваться на 1 после печати строки.
Увеличение до c1
произойдет после печати строки 200, 400 и т. д.
По умолчанию разделителем между числом и исходными данными будет символ пробела. Измените его на вкладку (или что хотите ), установив OFS
в блоке BEGIN
(или используя -v OFS='\t'
в командной строке awk
):
awk 'BEGIN { OFS = "\t"; c1 = 5 } { print c1, $0 } FNR%200 == 0 { ++c1 }' file
Перенаправьте вывод в файл с новым именем, чтобы сохранить его.