OSDev

для всех
Текущее время: 29 апр 2024, 13:01

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 131 ]  На страницу Пред.  1 ... 9, 10, 11, 12, 13, 14  След.
Автор Сообщение
 Заголовок сообщения: Re^2: Файловая система для флешки
СообщениеДобавлено: 03 ноя 2008, 02:07 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Чтение с флоппи диска через порты легко реализуется. У меня примера нет, но найдёшь легко и И-нете или любой книжке.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Файловая система для флешки
СообщениеДобавлено: 03 ноя 2008, 03:03 
А жесткий диск?

Тут возникает еще одна проблема: как установить grub на жесткий диск, не имея на компьютере операционной системы? Через livecd?


Вернуться к началу
  
 
 Заголовок сообщения: Re^2: Файловая система для флешки
СообщениеДобавлено: 03 ноя 2008, 14:09 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Драйвер жёсткого диска немного посложнее, но тоже сделать вполне реально. Описание и пример есть в книге "Программирование на аппаратном уровне" В.Кулаков.
Да, Grub ставится с Live-CD. Как описано на моей странице http://wiki.osdev.ru/index.php/Express_OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Файловая система для флешки
СообщениеДобавлено: 10 ноя 2008, 23:27 
Нашел такой код:

[*]include <stdio.h>
[*]include <conio.h>
[*]include <dos.h>
[*]include <stdlib.h>

union REGS inregs, outregs;

void main(void)
{
// Устанавливаем тип диска и сбрасываем
// флаг замены дискеты
inregs.h.ah = 0x17;
inregs.h.al = 3;
inregs.h.dl = 0;
int86(0x13, &inregs, &outregs);

// Определяем тип диска и наличие аппаратной
// поддержки проверки замены дискеты
inregs.h.ah = 0x15;
inregs.h.dl = 0;
int86(0x13, &inregs, &outregs);
printf("\nТип диска А: %d", outregs.h.ah);

// Определяем состояние флага замены дискеты
inregs.h.ah = 0x16;
inregs.h.dl = 0;
int86(0x13, &inregs, &outregs);
printf("\nСостояние флага замены дискеты:"
" %d",outregs.h.ah);

// Выводим состояние порта 0x3F7.
// Бит 7 этого порта отображает состояние
// флага замены дискеты
printf("\nПорт 0x3F7: %02.2x",inp(0x3f7));

// Сбрасываем контроллер НГМД
inregs.h.ah = 0;
inregs.h.dl = 0;
int86(0x13, &inregs, &outregs);

// Делаем паузу, во время которой можно
// заменить дискету.
// Попробуйте во время ожидания нажатия на клавишу
// открыть и затем закрыть дверцу дисковода - это
// приведет к установке флага замена дискеты
printf("\nЗамените дискету и нажмите на любую клавишу");
getch();

// Определяем состояние флага замены дискеты
inregs.h.ah = 0x16;
inregs.h.dl = 0;
int86(0x13, &inregs, &outregs);
printf("\nСостояние флага замены дискеты: %d",
outregs.h.ah);

// Выводим состояние порта 0x3F7.
printf("\nПорт 0x3F7: %02.2x", inp(0x3f7));
}

Функция int86 встроенная функция языка? Где она определена? Как ее реализовать самостоятельно.

Чтение дискеты через порты не вижу нигде, нашел Кулакова - читаю...


Вернуться к началу
  
 
 Заголовок сообщения: Re: Файловая система для флешки
СообщениеДобавлено: 11 ноя 2008, 00:03 
Не могу найти, где этого Шагурина найти...


Вернуться к началу
  
 
 Заголовок сообщения: Re^2: Файловая система для флешки
СообщениеДобавлено: 11 ноя 2008, 02:42 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
int86() просто вызывает инструкцию процессора int, а inregs и outregs это входные и выходящие регистры.
Вот программа чтения первого сектора с дискеты, результат записывает в файл "!sector.dat". Программа под реальный режим, и соответственно нужен компилятор под ДОС, типа Quick C 2.0 или Borland C 3.1.

[*]include <stdio.h>
[*]include <stdlib.h>
[*]include <conio.h>
[*]include <dos.h>

[*]define CYL 0

/* таблица параметров дискеты */

typedef struct _DPT_ {
unsigned char srt_hut;
unsigned char dma_hlt;
unsigned char motor_w;
unsigned char sec_size;
unsigned char eot;
unsigned char gap_rw;
unsigned char dtl;
unsigned char gap_f;
unsigned char fill_char;
unsigned char hst;
unsigned char mot_start;
} DPT;

void main(void);
void fdc_out(unsigned char byte);
int fdc_inp(void);
void int_wait(void);
void dma_init(char *);

void main(void) {

unsigned i;
long l;
char buffer[512];
char status[7], main_status;
DPT _far *fdpt;
FILE *sect;

printf("\n"
"\nРабота с контроллером НГМД"
"\n (C)Фролов А., 1991"
"\n");



// Открываем файл, в который будем записывать
// содержимое самого первого сктора на дискете

sect = fopen("!sector.dat","wb+");

// Устанавливаем указатель на таблицу
// параметров дискеты

fdpt = get_dpt();

// Включаем мотор дисковода А:
// Перед этим разрешаем прерывания

// _enable();
outp(0x3F2, 0x1C);

// Выполняем задержку для разгона двигателя

for(l=0;l<200000;l++);

// Показываем содержимое регистра основного
// состояния контроллера

printf("Мотор включен.\t\t");
printf("Основное состояние: %02.2X\n",inp(0x3F4));

// Перед чтением сектора необходимо установить
// головку на нужную дорожку, в нашем случае это
// дорожка с номером CYL.

// Выдаем контроллеру команду "Поиск"

fdc_out(0xf);

// Для команды "Поиск" требуется два байта параметров:
// номер головки/номер накопителя и номер дорожки.
// Мы работаем с нулевой головкой накопителя А:,
// поэтому первый параметр равен 0, второй - CYL

fdc_out(0);
fdc_out(CYL);

// Показываем содержимое регистра основного
// состояния контроллера

printf("\n<<<Поиск>>> \t\t");
printf("Основное состояние: %02.2X\n",inp(0x3F4));

// Ожидаем прерывание по завершению операции

int_wait();

// Задержка для позиционирования головки

for(l=0;l<20000;l++);

// Для проверки результата выполнения команды
// "Поиск" выдаем контроллеру команду
// "Чтение состояния прерывания"

// Выводим содержимое регистра состояния
// ST0 и номер дорожки после выполнения команды
// "Поиск" PCN

fdc_out(0x8);
printf("Состояние прерывания:\t");
printf(" ST0: %02.2X, \t", fdc_inp());
printf("PCN: %02.2X\n", fdc_inp());

// Для более глубокой диагностики состояния
// контроллера выдаем контроллеру команду
// "Чтение состояния накопителя", выводим
// содержимое регистра состояния ST3

fdc_out(4);
fdc_out(0);
printf("Состояние накопителя:\t ST3: %02.2X\n",fdc_inp());

// Устанавливаем скорость передачи данных 500 Кбайтов/с,
// это значение может различаться для разных типов дискет

outp(0x3F7, 0);

// Инициализация канала прямого
// доступа к памяти

dma_init(buffer);

// Выдаем команду "Чтение данных"

fdc_out(0x66);
fdc_out(0x0); // накопитель 0, головка 0

fdc_out(CYL); // цилиндр CYL
fdc_out(0); // головка 0
fdc_out(1); // номер сектора - 1

// Передаем контроллеру технические параметры
// дисковода, берем их из таблицы параметров дискеты.
// Это такие параметры:
// - размер сектора;
// - номер последнего сектора на дорожке;
// - размер промежутка;
// - число считываемых/записываемых байтов

fdc_out(fdpt->sec_size);
fdc_out(fdpt->eot);
fdc_out(fdpt->gap_rw);
fdc_out(fdpt->dtl);

// Ожидаем прерывание по завершению операции

int_wait();

// Считываем и выводим на экран байты результата
// операции "Чтение данных"

printf("\n<<<Чтение сектора>>> \n");
printf(" Байты состояния (ST0,ST1,ST2,C,H,R,N):\n");

for(i=0; i<7; i++) printf("%02.2X\t", (char) fdc_inp());
printf("\n");

// Выводим содержимое считанного сектора в файл

for(i=0; i<512; i++) fputc(buffer[i],sect);
fclose(sect);

// Выключаем мотор

outp(0x3F2, 0xC);
}


// Вывод байта в контроллер дисковода

void fdc_out(unsigned char parm) {

_asm {
mov dx,3F4h // Порт основного состояния
loop_fdc_out:

in al,dx
test al,80h // Проверяем готовность
jz loop_fdc_out // контроллера

inc dx // Выводим байт в порт данных
mov al, parm // контроллера
out dx, al
}
}

// Ввод байта из порта данных контроллера дисковода

int fdc_inp(void) {

_asm {
mov dx,3F4h // Порт основного состояния
loop_fdc_inp:
in al,dx
test al,80h // Проверяем готовность
jz loop_fdc_inp // контроллера

inc dx // Введенный байт записываем
in al, dx // в регистр AX
}
}

// Ожидание прерывания от контроллера

void int_wait(void) {

// Разрешаем прерывания

_asm sti;
_asm {
mov ax,0x40 // После прихода прерывания
mov es,ax // программа обработки прерывания
mov bx,0x3E // устанавливает в 1 старший бит
wait_loop: // байта в области данных BIOS
mov dl,es:[bx] // по адресу 0040:003E.
test dl,0x80 // Мы ждем, когда этот бит будет
jz wait_loop // установлен в 1, а затем
// сбрасываем его.
and dl,01111111b
mov es:[bx],dl
}
}

// Инициализация канала прямого доступа к памяти

void dma_init(char *buf) {

unsigned long f_adr;
unsigned sg, of;

// Вычисляем 24-разрядный адрес буфера для данных

f_adr = ((unsigned long)_psp << 4)
+ (((unsigned long)buf) & 0xffff);

// Расщепляем адрес на номер страницы
// и смещение

sg = (f_adr >> 16) & 0xff;
of = f_adr & 0xffff;

// На время программирования контроллера прямого
// доступа запрещаем прерывания

_asm cli;

_asm {
mov al,46h // Команда чтения данных от
// контроллера НГМД.

out 12,al // Сброс триггера-указателя байта
// для работы с 16-разрядными портами.
// Следующий байт, выводимый в 16-разрядный
// порт будет интерпретироваться
// как младший.

out 11,al // Установка режима контроллера ПДП

mov ax,of // Смещение буфера, младший байт
out 4,al
mov al,ah // Смещение буфера, старший байт
out 4,al

mov ax,sg // Номер страницы
out 81h,al

mov ax,511 // Длина передаваемых данных
out 5,al
mov al,ah
out 5,al

mov al,2 // Разблокировка канала 2 контроллера ПДП
out 10,al
}

// Инициализация контроллера закончена,
// разрешаем прерывания.

_asm sti;
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Файловая система для флешки
СообщениеДобавлено: 11 ноя 2008, 14:58 
А в чем отличие этой программы от программы под защищенный режим? Порты другие?
С реальным режимом проблем то нету как раз, у меня в защищенном ничего сделать не получается...


Вернуться к началу
  
 
 Заголовок сообщения: Re^2: Файловая система для флешки
СообщениеДобавлено: 11 ноя 2008, 15:24 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
В защищённом режиме порты просто закрыты операционной системой для кода "пользовательского" уровня. Порты доступны только ядру и драйверам. В твоей собственной ОС ни кто порты тебе не закроет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Файловая система для флешки
СообщениеДобавлено: 11 ноя 2008, 22:00 
А если запустить код под привилегиями root? Все равно?

В собственной ОСи я сам решаю, будет оно закрыто или нет?


Вернуться к началу
  
 
 Заголовок сообщения: Re^2: Файловая система для флешки
СообщениеДобавлено: 12 ноя 2008, 00:00 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Под root тоже закрыто. Вообще закрываются только те порты, под который есть драйвер, чтобы 2 программы не могли читать с портов одновременно (и драйвер и приложение). В собственной ОСи можно сделать как угодно.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 131 ]  На страницу Пред.  1 ... 9, 10, 11, 12, 13, 14  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB