LINUX.ORG.RU

возможно, но очень рекомендуется так не делать. вам это зачем нужно, если не секрет?

anonymous
()
Ответ на: комментарий от anonymous

> Ян, Вы это шутите?

ну по поводу int 13h скорее всего да. а так, у народа бывали случаи, когда приходилось делать нечто подобное. например:

http://qnx.org.ru/index.php?option=com_minibb&action=vthread&forum=11...

впрочем, это не совсем под Linux..

// wbr

klalafuda ★☆☆
()

ну, если человеку это действительно нужно, то я вижу 2 способа

1. 1) создаем GDT реального режима 2) cli (и NMI от греха отключить) 3) отключаем pagging и PM (не забывши сбросить очередь предвыборки) 4) загружаем IDTR и GDTR соостветствующими значениями 5) sti; int <что_нужно> 6) возвращаемя обратно естественно код, который это делает должен быть PIC и располагаться где-то в пределах первого мегабайта

2. создаем v86 задачу, в которой дергаем int <что_нужно>

anonymous
()
Ответ на: комментарий от anonymous

> 1. 1) создаем GDT реального режима 2) cli (и NMI от греха отключить) 3) отключаем pagging и PM (не забывши сбросить очередь предвыборки) 4) загружаем IDTR и GDTR соостветствующими значениями 5) sti; int <что_нужно> 6) возвращаемя обратно естественно код, который это делает должен быть PIC и располагаться где-то в пределах первого мегабайта

а если это вызов в VBE 3.x заточенный под PM? :)

> 2. создаем v86 задачу, в которой дергаем int <что_нужно>

IMHO это лучше.

// wbr

klalafuda ★☆☆
()

Ок, почитал, понял, что из защищенного режима это хрен сделаешь. Поясняю
суть проблемы:

есть плата ROCKY-4786E2V, на ней есть WDT, который работает таким 
орбразом:

mov ax,6f02h
mov bl, 30	;number of seconds
int 15h

15h - прерывание БИОС. В принципе интересны все возможности решения 
проблемы. Наткнулся на это (вообще пример кода оттуда, но видать я не
один кто столкнулся с этой проблемой):

http://lkml.org/lkml/2006/2/2/200

т.е. из доса определить что делает БИОС. В общем что подскажете? )

roy ★★★★★
() автор топика
Ответ на: комментарий от roy

подскажу что на следующий раз этот пост должен быть ПЕРВЫМ!!!

cvv ★★★★★
()
Ответ на: комментарий от roy

из защищенного режима это вполне сделаешь - нужно создать v86 task (хотя вариант с вызовом напрямую боле прост в реализации) ,в котором будет выполнятся что-то вроде mov ax,6f02h mov bl, 30 ;number of seconds int 15h ret и делать lcall на этот код (в CS - селектор, указывающий на шлюз задачи) при необходимости,по возможности ухитряясь ничего не обрушить при этом

лучше конечно как-нибудь расковырять протокол и порты и работать с железкой напрямую без этих извратов

anonymous
()
Ответ на: комментарий от roy


http://iei.industrialpartner.com/ROCKY_4786E2V.htm

далее можно предположить, что собственного сторожа они воять не стали и использовали системный -> комать документацию на Intel 865G + ICH5. может поможет. или же просто посмотреть, что за чипы стоят на плате, с 90%й вероятностью найти там какой-нить Winbond I/O, понять, что это за IO и смотреть уже документацию на него.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от anonymous

а не кинете линков что почитать по этой теме ? на данный момент знаний ядра и асма минимум (

roy ★★★★★
() автор топика
Ответ на: комментарий от roy

к сожалению линков кинуть не могу по причине отсутствия таковых у меня могу посоветовать обратиться к google

anonymous
()
Ответ на: комментарий от roy

Ok. Попробовал пограться с vm86(). Нашел в инете пример:

#include <stdio.h>		// for printf(), perror() 
#include <fcntl.h>		// for open() 
#include <stdlib.h>		// for exit() 
#include <unistd.h>		// for lseek(), read() 
#include <sys/mman.h>		// for mmap()
#include <asm/vm86.h>		// for struct vm86_struct
#include <linux/linkage.h>	// for asmlinkage attribute

#define ELF_LOAD_ADDRESS 0x08048000	// where Linux puts this 

asmlinkage void blue( void );		// no C++ "name-mangling"   
asm("	.code16			");	// generate 16-bit codes
asm("	.align	16		");	// "paragraph" alignment
asm("blue:			");	// label procedure entry
asm("	movw	$0xB800, %ax	");	// address screen memory
asm("	movw	%ax, %es	");	//   using ES register
asm("	xorw	%di, %di	");	// point es:di to screen
asm("	movb	$0x17, %al	");	// white-upon-blue color
asm("	movw	$0x4000, %cx	");	// number of screen elts 
asm("nxpel:			");	// main loop begins here
asm("	movb	%al, %es:1(%di)	");	// write color attribute
asm("	addw	$2, %di		");	// point to next element
asm("	loop	nxpel		");	// process entire screen
asm("	hlt			");	// exit Virtual8086 mode   
asm("	.code32			");	// generate 32-bit codes

int vm86( struct vm86_struct *vm )
{
	int	retval;
	asm(" movl $113, %eax ");	// system-call ID-number
	asm(" movl %0, %%ebx " : : "m" (vm) );	// struct address
	asm(" int $0x80	");		// enter the Linux kernel
	asm(" movl %%eax, %0 " : "=m" (retval) ); // store retval 
	return	retval;			// return function status
}


struct vm86_struct	vm;		// virtual machine struct


int main( int argc, char **argv )
{
	int	fd, prot, flag;
	
	// setup a memory-mapping for accessing video display memory 	
	void	*vram = (void*)0x000B8000;   // address of 32KB window
	prot = PROT_READ | PROT_WRITE;	// read-write access is needed
      	flag = MAP_FIXED | MAP_SHARED;	// with a fixed-shared mapping 
	if ( ( fd = open( "/dev/mem", O_RDWR ) ) < 0 )
		{ perror( "open /dev/mem" ); exit(1); }
	if ( mmap( vram, 0x8000, prot, flag, fd, (int)vram ) == MAP_FAILED )	
		{ perror( "mmap /dev/mem" ); exit(1); }

	// setup 64KB memory-mapping for access to VM86 code and stack  	
	void	*prog = (void*)0x00010000;   // address of 64KB region
	prot = PROT_READ | PROT_WRITE;	// read-write access is needed
      	flag = MAP_FIXED | MAP_SHARED;	// with a fixed-shared mapping 
	if ( ( fd = open( "/dev/zero", O_RDWR ) ) < 0 )
		{ perror( "open /dev/zero" ); exit(1); }
	if ( mmap( prog, 0x10000, prot, flag, fd, 0 ) == MAP_FAILED )	
		{ perror( "mmap /dev/zero" ); exit(1); }

	// now "load" our program code into this memory-mapped region  
	if ( ( fd = open( argv[0], O_RDONLY ) ) < 0 ) 
		{ perror( argv[0] ); exit(1); }
	int	progsize = lseek( fd, 0, SEEK_END );
	if ( lseek( fd, 0, SEEK_SET ) != 0 ) { perror( "lseek" ); exit(1); }
	if ( read( fd, prog, progsize ) != progsize ) 
		{ perror( "read" ); exit(1); }
	
	// compute offset-address for the 16-bit code's entry-point
	int	initial_IP = (int)blue - ELF_LOAD_ADDRESS;
	int	initial_CS = ((int)prog) >> 4;	// segment-address
	
	// initialize data-structure for entering to Virtual-8086 Mode
	vm.regs.eip = initial_IP;	// initial instruction offset 
	vm.regs.cs = initial_CS;	// segment-address for code
	vm.regs.eflags = (1<<9);	// IF=1, IOPL=0
	vm.regs.ss = initial_CS;	// segment-address for stack
	vm.regs.esp = 0x10000;		// initial stacktop offset
	vm.cpu_type = CPU_386;		// specify required processor

	// execute in Virtual-8086 Mode (until 'hlt' is encountered)
	vm86( &vm );			// execute the 'blue' routine	
	printf( "\nReturned successfully from Virtual-8086 Mode\n\n" );
}


Этот код работает - цвет фона экрана в консоли меняется на синий.

Попробовал свой код - просто вывести символ функциями биоса:

asmlinkage void blue(void);     // no C++ "name-mangling"
asm("   .code16                 ");     // generate 16-bit codes
asm("   .align  16              ");     // "paragraph" alignment
asm("blue:                      ");
asm("   movb $0, %bh            ");
asm("   movb $0xe, %ah          ");
asm("   movb $97, %al           ");
asm("   int $0x10               ");
asm("   hlt                     ");     // exit Virtual8086 mode
asm("   .code32                 ");     // generate 32-bit codes

В ответ - тишина. Я подозреваю что дела в прерывании, но не уверен.
Есть мысли ? )

P.S. оба примера после завершения программы впадают в segmentation 
fault, отладить не удалось

roy ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.